From cb4d86352f33bb9b6dad12b8f45714653968e4d9 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Sat, 27 Apr 2024 17:12:08 -0500 Subject: [PATCH] Remove ParseUI --- .github/workflows/ci.yml | 1 - .gitignore | 1 - Package.swift | 12 - Parse.xcworkspace/contents.xcworkspacedata | 3 - .../ParseStarterProject/AppDelegate.swift | 3 - .../ParseStarterProjectAppDelegate.m | 3 - .../ParseStarterProject/AppDelegate.swift | 3 - ParseUI/.gitignore | 1 - .../ParseUI-iOS-Dynamic.xcconfig | 16 - ParseUI/Configurations/ParseUI-iOS.xcconfig | 16 - ParseUI/Configurations/Shared | 1 - ParseUI/ParseUI.xcodeproj/project.pbxproj | 2111 ----------------- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcschemes/ParseUI-Dynamic.xcscheme | 76 - .../xcshareddata/xcschemes/ParseUI.xcscheme | 104 - .../xcschemes/ParseUIDemo-Swift.xcscheme | 87 - .../xcschemes/ParseUIDemo.xcscheme | 87 - ...FActivityIndicatorCollectionReusableView.h | 38 - ...FActivityIndicatorCollectionReusableView.m | 115 - .../Cells/PFActivityIndicatorTableViewCell.h | 38 - .../Cells/PFActivityIndicatorTableViewCell.m | 64 - ParseUI/ParseUI/Internal/Extensions/PFColor.h | 49 - ParseUI/ParseUI/Internal/Extensions/PFColor.m | 76 - ParseUI/ParseUI/Internal/Extensions/PFImage.h | 31 - ParseUI/ParseUI/Internal/Extensions/PFImage.m | 111 - ParseUI/ParseUI/Internal/Extensions/PFRect.h | 30 - ParseUI/ParseUI/Internal/Extensions/PFRect.m | 48 - .../Internal/Extensions/PFUIAlertView.h | 64 - .../Internal/Extensions/PFUIAlertView.m | 213 -- ParseUI/ParseUI/Internal/PFImageCache.h | 34 - ParseUI/ParseUI/Internal/PFImageCache.m | 47 - ParseUI/ParseUI/Internal/PFLocalization.h | 34 - ParseUI/ParseUI/Internal/PFLocalization.m | 52 - .../PFAppleAuthenticationProvider.h | 19 - .../PFAppleAuthenticationProvider.m | 17 - .../Sign In With Apple/PFAppleUtils.h | 32 - .../Sign In With Apple/PFAppleUtils.m | 125 - .../Internal/Views/Buttons/PFActionButton.h | 65 - .../Internal/Views/Buttons/PFActionButton.m | 202 -- .../Internal/Views/Buttons/PFDismissButton.h | 26 - .../Internal/Views/Buttons/PFDismissButton.m | 84 - .../Internal/Views/Buttons/PFPrimaryButton.h | 31 - .../Internal/Views/Buttons/PFPrimaryButton.m | 110 - .../Internal/Views/Buttons/PFTextButton.h | 26 - .../Internal/Views/Buttons/PFTextButton.m | 53 - .../ParseUI/Internal/Views/PFLoadingView.h | 29 - .../ParseUI/Internal/Views/PFLoadingView.m | 81 - .../ParseUI/Resources/Images/apple_icon.png | Bin 410 -> 0 bytes .../Resources/Images/apple_icon@2x.png | Bin 844 -> 0 bytes .../Resources/Images/apple_icon@3x.png | Bin 1296 -> 0 bytes .../Resources/Images/facebook_icon.png | Bin 1285 -> 0 bytes .../Resources/Images/facebook_icon@2x.png | Bin 1575 -> 0 bytes .../Resources/Images/facebook_icon@3x.png | Bin 1754 -> 0 bytes .../ParseUI/Resources/Images/parse_logo.png | Bin 5403 -> 0 bytes .../Resources/Images/parse_logo@2x.png | Bin 10846 -> 0 bytes .../Resources/Images/parse_logo@3x.png | Bin 9845 -> 0 bytes .../ParseUI/Resources/Images/twitter_icon.png | Bin 1126 -> 0 bytes .../Resources/Images/twitter_icon@2x.png | Bin 2031 -> 0 bytes .../Resources/Images/twitter_icon@3x.png | Bin 3387 -> 0 bytes ParseUI/ParseUI/Resources/Info-iOS.plist | 28 - .../Localization/de.lproj/ParseUI.strings | 98 - .../Localization/en.lproj/ParseUI.strings | Bin 6068 -> 0 bytes .../Localization/fr.lproj/ParseUI.strings | Bin 6542 -> 0 bytes .../Localization/he.lproj/ParseUI.strings | Bin 5670 -> 0 bytes .../Localization/pt-BR.lproj/ParseUI.strings | 99 - .../Localization/sv.lproj/ParseUI.strings | Bin 6226 -> 0 bytes ParseUI/ParseUI/Source/PFCollectionViewCell.h | 61 - ParseUI/ParseUI/Source/PFCollectionViewCell.m | 97 - ParseUI/ParseUI/Source/PFImageView.h | 78 - ParseUI/ParseUI/Source/PFImageView.m | 153 -- ParseUI/ParseUI/Source/PFLogInView.h | 163 -- ParseUI/ParseUI/Source/PFLogInView.m | 455 ---- .../ParseUI/Source/PFLogInViewController.h | 180 -- .../ParseUI/Source/PFLogInViewController.m | 521 ---- ParseUI/ParseUI/Source/PFLogInView_Private.h | 28 - .../Source/PFProductTableViewController.h | 47 - .../Source/PFProductTableViewController.m | 248 -- .../ParseUI/Source/PFPurchaseTableViewCell.h | 68 - .../ParseUI/Source/PFPurchaseTableViewCell.m | 155 -- .../Source/PFQueryCollectionViewController.h | 228 -- .../Source/PFQueryCollectionViewController.m | 445 ---- .../Source/PFQueryTableViewController.h | 271 --- .../Source/PFQueryTableViewController.m | 589 ----- ParseUI/ParseUI/Source/PFResources.h | 10 - ParseUI/ParseUI/Source/PFResources.m | 50 - ParseUI/ParseUI/Source/PFSignUpView.h | 156 -- ParseUI/ParseUI/Source/PFSignUpView.m | 337 --- .../ParseUI/Source/PFSignUpViewController.h | 184 -- .../ParseUI/Source/PFSignUpViewController.m | 514 ---- ParseUI/ParseUI/Source/PFTableViewCell.h | 46 - ParseUI/ParseUI/Source/PFTableViewCell.m | 122 - ParseUI/ParseUI/Source/PFTextField.h | 77 - ParseUI/ParseUI/Source/PFTextField.m | 120 - ParseUI/ParseUI/Source/ParseUI.h | 34 - ParseUI/ParseUI/Source/ParseUIConstants.h | 44 - ParseUI/ParseUIDemo/Classes/AppDelegate.h | 28 - ParseUI/ParseUIDemo/Classes/AppDelegate.m | 108 - .../CustomLogInViewController.h | 26 - .../CustomLogInViewController.m | 38 - .../DeletionCollectionViewController.h | 26 - .../DeletionCollectionViewController.m | 170 -- .../PaginatedCollectionViewController.h | 26 - .../PaginatedCollectionViewController.m | 97 - .../SectionedCollectionViewController.h | 26 - .../SectionedCollectionViewController.m | 179 -- .../SimpleCollectionViewController.h | 26 - .../SimpleCollectionViewController.m | 96 - .../StoryboardCollectionViewController.h | 26 - .../StoryboardCollectionViewController.m | 83 - .../SubtitleImageCollectionViewController.h | 26 - .../SubtitleImageCollectionViewController.m | 90 - .../CustomProductTableViewController.h | 26 - .../CustomProductTableViewController.m | 46 - .../DeletionTableViewController.h | 26 - .../DeletionTableViewController.m | 142 -- .../PaginatedTableViewController.h | 28 - .../PaginatedTableViewController.m | 71 - .../SectionedTableViewController.h | 28 - .../SectionedTableViewController.m | 109 - .../SimpleTableViewController.h | 28 - .../SimpleTableViewController.m | 70 - .../StoryboardTableViewController.h | 26 - .../StoryboardTableViewController.m | 57 - .../SubtitleImageTableViewController.h | 26 - .../SubtitleImageTableViewController.m | 48 - .../CustomSignUpViewController.h | 26 - .../CustomSignUpViewController.m | 37 - .../Classes/PFUIDemoViewController.h | 28 - .../Classes/PFUIDemoViewController.m | 442 ---- .../LaunchImage.launchimage/Contents.json | 89 - ParseUI/ParseUIDemo/Other/Info.plist | 73 - ParseUI/ParseUIDemo/Other/main.m | 30 - ParseUI/ParseUIDemo/ParseUIDemo.entitlements | 10 - ParseUI/ParseUIDemo/Resources/0.png | Bin 21533 -> 0 bytes ParseUI/ParseUIDemo/Resources/1.png | Bin 23750 -> 0 bytes ParseUI/ParseUIDemo/Resources/2.png | Bin 20857 -> 0 bytes ParseUI/ParseUIDemo/Resources/Icon.png | Bin 31613 -> 0 bytes ...SimpleQueryCollectionStoryboard.storyboard | 37 - .../SimpleQueryTableStoryboard.storyboard | 32 - ParseUI/ParseUIDemo/Swift/AppDelegate.swift | 103 - .../CustomLogInViewController.swift | 41 - .../CustomProductTableViewController.swift | 42 - .../DeletionCollectionViewController.swift | 140 -- .../PaginatedCollectionViewController.swift | 89 - .../SectionedCollectionViewController.swift | 159 -- .../SimpleCollectionViewController.swift | 88 - .../StoryboardCollectionViewController.swift | 79 - ...ubtitleImageCollectionViewController.swift | 78 - .../DeletionTableViewController.swift | 118 - .../PaginatedTableViewController.swift | 69 - .../SectionedTableViewController.swift | 97 - .../SimpleTableViewController.swift | 68 - .../StoryboardTableViewController.swift | 63 - .../SubtitleImageTableViewController.swift | 46 - .../CustomSignUpViewController.swift | 41 - ...QueryCollectionStoryboard-Swift.storyboard | 38 - ...impleQueryTableStoryboard-Swift.storyboard | 31 - .../Swift/UIDemoViewController.swift | 350 --- ParseUI/Scripts/convert_images.rb | 166 -- ParseUI/SignInWithAppleTests/Info.plist | 22 - .../SignInWithAppleTests.m | 149 -- Rakefile | 60 - 163 files changed, 14933 deletions(-) delete mode 100644 ParseUI/.gitignore delete mode 100644 ParseUI/Configurations/ParseUI-iOS-Dynamic.xcconfig delete mode 100644 ParseUI/Configurations/ParseUI-iOS.xcconfig delete mode 120000 ParseUI/Configurations/Shared delete mode 100644 ParseUI/ParseUI.xcodeproj/project.pbxproj delete mode 100644 ParseUI/ParseUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 ParseUI/ParseUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI-Dynamic.xcscheme delete mode 100644 ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI.xcscheme delete mode 100644 ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo-Swift.xcscheme delete mode 100644 ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo.xcscheme delete mode 100644 ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorCollectionReusableView.h delete mode 100644 ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorCollectionReusableView.m delete mode 100644 ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorTableViewCell.h delete mode 100644 ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorTableViewCell.m delete mode 100644 ParseUI/ParseUI/Internal/Extensions/PFColor.h delete mode 100644 ParseUI/ParseUI/Internal/Extensions/PFColor.m delete mode 100644 ParseUI/ParseUI/Internal/Extensions/PFImage.h delete mode 100644 ParseUI/ParseUI/Internal/Extensions/PFImage.m delete mode 100644 ParseUI/ParseUI/Internal/Extensions/PFRect.h delete mode 100644 ParseUI/ParseUI/Internal/Extensions/PFRect.m delete mode 100644 ParseUI/ParseUI/Internal/Extensions/PFUIAlertView.h delete mode 100644 ParseUI/ParseUI/Internal/Extensions/PFUIAlertView.m delete mode 100644 ParseUI/ParseUI/Internal/PFImageCache.h delete mode 100644 ParseUI/ParseUI/Internal/PFImageCache.m delete mode 100644 ParseUI/ParseUI/Internal/PFLocalization.h delete mode 100644 ParseUI/ParseUI/Internal/PFLocalization.m delete mode 100644 ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.h delete mode 100644 ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.m delete mode 100644 ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.h delete mode 100644 ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.m delete mode 100644 ParseUI/ParseUI/Internal/Views/Buttons/PFActionButton.h delete mode 100644 ParseUI/ParseUI/Internal/Views/Buttons/PFActionButton.m delete mode 100644 ParseUI/ParseUI/Internal/Views/Buttons/PFDismissButton.h delete mode 100644 ParseUI/ParseUI/Internal/Views/Buttons/PFDismissButton.m delete mode 100644 ParseUI/ParseUI/Internal/Views/Buttons/PFPrimaryButton.h delete mode 100644 ParseUI/ParseUI/Internal/Views/Buttons/PFPrimaryButton.m delete mode 100644 ParseUI/ParseUI/Internal/Views/Buttons/PFTextButton.h delete mode 100644 ParseUI/ParseUI/Internal/Views/Buttons/PFTextButton.m delete mode 100644 ParseUI/ParseUI/Internal/Views/PFLoadingView.h delete mode 100644 ParseUI/ParseUI/Internal/Views/PFLoadingView.m delete mode 100644 ParseUI/ParseUI/Resources/Images/apple_icon.png delete mode 100644 ParseUI/ParseUI/Resources/Images/apple_icon@2x.png delete mode 100644 ParseUI/ParseUI/Resources/Images/apple_icon@3x.png delete mode 100644 ParseUI/ParseUI/Resources/Images/facebook_icon.png delete mode 100644 ParseUI/ParseUI/Resources/Images/facebook_icon@2x.png delete mode 100644 ParseUI/ParseUI/Resources/Images/facebook_icon@3x.png delete mode 100644 ParseUI/ParseUI/Resources/Images/parse_logo.png delete mode 100644 ParseUI/ParseUI/Resources/Images/parse_logo@2x.png delete mode 100644 ParseUI/ParseUI/Resources/Images/parse_logo@3x.png delete mode 100644 ParseUI/ParseUI/Resources/Images/twitter_icon.png delete mode 100644 ParseUI/ParseUI/Resources/Images/twitter_icon@2x.png delete mode 100644 ParseUI/ParseUI/Resources/Images/twitter_icon@3x.png delete mode 100644 ParseUI/ParseUI/Resources/Info-iOS.plist delete mode 100644 ParseUI/ParseUI/Resources/Localization/de.lproj/ParseUI.strings delete mode 100644 ParseUI/ParseUI/Resources/Localization/en.lproj/ParseUI.strings delete mode 100644 ParseUI/ParseUI/Resources/Localization/fr.lproj/ParseUI.strings delete mode 100644 ParseUI/ParseUI/Resources/Localization/he.lproj/ParseUI.strings delete mode 100644 ParseUI/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings delete mode 100644 ParseUI/ParseUI/Resources/Localization/sv.lproj/ParseUI.strings delete mode 100644 ParseUI/ParseUI/Source/PFCollectionViewCell.h delete mode 100644 ParseUI/ParseUI/Source/PFCollectionViewCell.m delete mode 100644 ParseUI/ParseUI/Source/PFImageView.h delete mode 100644 ParseUI/ParseUI/Source/PFImageView.m delete mode 100644 ParseUI/ParseUI/Source/PFLogInView.h delete mode 100644 ParseUI/ParseUI/Source/PFLogInView.m delete mode 100644 ParseUI/ParseUI/Source/PFLogInViewController.h delete mode 100644 ParseUI/ParseUI/Source/PFLogInViewController.m delete mode 100644 ParseUI/ParseUI/Source/PFLogInView_Private.h delete mode 100644 ParseUI/ParseUI/Source/PFProductTableViewController.h delete mode 100644 ParseUI/ParseUI/Source/PFProductTableViewController.m delete mode 100644 ParseUI/ParseUI/Source/PFPurchaseTableViewCell.h delete mode 100644 ParseUI/ParseUI/Source/PFPurchaseTableViewCell.m delete mode 100644 ParseUI/ParseUI/Source/PFQueryCollectionViewController.h delete mode 100644 ParseUI/ParseUI/Source/PFQueryCollectionViewController.m delete mode 100644 ParseUI/ParseUI/Source/PFQueryTableViewController.h delete mode 100644 ParseUI/ParseUI/Source/PFQueryTableViewController.m delete mode 100644 ParseUI/ParseUI/Source/PFResources.h delete mode 100644 ParseUI/ParseUI/Source/PFResources.m delete mode 100644 ParseUI/ParseUI/Source/PFSignUpView.h delete mode 100644 ParseUI/ParseUI/Source/PFSignUpView.m delete mode 100644 ParseUI/ParseUI/Source/PFSignUpViewController.h delete mode 100644 ParseUI/ParseUI/Source/PFSignUpViewController.m delete mode 100644 ParseUI/ParseUI/Source/PFTableViewCell.h delete mode 100644 ParseUI/ParseUI/Source/PFTableViewCell.m delete mode 100644 ParseUI/ParseUI/Source/PFTextField.h delete mode 100644 ParseUI/ParseUI/Source/PFTextField.m delete mode 100644 ParseUI/ParseUI/Source/ParseUI.h delete mode 100644 ParseUI/ParseUI/Source/ParseUIConstants.h delete mode 100644 ParseUI/ParseUIDemo/Classes/AppDelegate.h delete mode 100644 ParseUI/ParseUIDemo/Classes/AppDelegate.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/LogInViewController/CustomLogInViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/LogInViewController/CustomLogInViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/SignUpViewController/CustomSignUpViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/SignUpViewController/CustomSignUpViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.m delete mode 100644 ParseUI/ParseUIDemo/Images.xcassets/LaunchImage.launchimage/Contents.json delete mode 100644 ParseUI/ParseUIDemo/Other/Info.plist delete mode 100644 ParseUI/ParseUIDemo/Other/main.m delete mode 100644 ParseUI/ParseUIDemo/ParseUIDemo.entitlements delete mode 100644 ParseUI/ParseUIDemo/Resources/0.png delete mode 100644 ParseUI/ParseUIDemo/Resources/1.png delete mode 100644 ParseUI/ParseUIDemo/Resources/2.png delete mode 100644 ParseUI/ParseUIDemo/Resources/Icon.png delete mode 100644 ParseUI/ParseUIDemo/Resources/SimpleQueryCollectionStoryboard.storyboard delete mode 100644 ParseUI/ParseUIDemo/Resources/SimpleQueryTableStoryboard.storyboard delete mode 100644 ParseUI/ParseUIDemo/Swift/AppDelegate.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/LogInViewController/CustomLogInViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SimpleTableViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/SignUpViewController/CustomSignUpViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/Resources/SimpleQueryCollectionStoryboard-Swift.storyboard delete mode 100644 ParseUI/ParseUIDemo/Swift/Resources/SimpleQueryTableStoryboard-Swift.storyboard delete mode 100644 ParseUI/ParseUIDemo/Swift/UIDemoViewController.swift delete mode 100755 ParseUI/Scripts/convert_images.rb delete mode 100644 ParseUI/SignInWithAppleTests/Info.plist delete mode 100644 ParseUI/SignInWithAppleTests/SignInWithAppleTests.m diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2bb8fda31..795226514 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,6 @@ jobs: script: - test:ios - test:macos - - test:parseui:all - test:parse_live_query:all - build:starters - xcode15 # runs build:starters on XCode 15 diff --git a/.gitignore b/.gitignore index c21100b94..c0e10a65a 100644 --- a/.gitignore +++ b/.gitignore @@ -37,7 +37,6 @@ docs/ ## AppCode .idea/ -ParseUI/Vendor # VSC .project diff --git a/Package.swift b/Package.swift index 517395cc4..a90168d5b 100644 --- a/Package.swift +++ b/Package.swift @@ -13,7 +13,6 @@ let package = Package( ], products: [ .library(name: "ParseObjC", targets: ["ParseCore"]), - .library(name: "ParseUI", targets: ["ParseUI"]), .library(name: "ParseLiveQuery", targets: ["ParseLiveQuery"]) ], dependencies: [ @@ -32,17 +31,6 @@ let package = Package( publicHeadersPath: "Source", cSettings: [.headerSearchPath("Internal/**")] ), - .target( - name: "ParseUI", - dependencies: [ - "ParseCore" - ], - path: "ParseUI/ParseUI", - exclude: ["Resources/Info-iOS.plist"], - resources: [.process("Resources")], - publicHeadersPath: "Source", - cSettings: [.headerSearchPath("Internal/**")] - ), .target( name: "ParseLiveQuery", dependencies: [ diff --git a/Parse.xcworkspace/contents.xcworkspacedata b/Parse.xcworkspace/contents.xcworkspacedata index b8be39c51..7ac2a7e28 100644 --- a/Parse.xcworkspace/contents.xcworkspacedata +++ b/Parse.xcworkspace/contents.xcworkspacedata @@ -7,9 +7,6 @@ - - diff --git a/ParseStarterProject/iOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift b/ParseStarterProject/iOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift index 5ffabbe1b..041502135 100644 --- a/ParseStarterProject/iOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift +++ b/ParseStarterProject/iOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift @@ -12,9 +12,6 @@ import UserNotifications import ParseCore -// If you want to use any of the UI components, uncomment this line -// import ParseUI - @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { diff --git a/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject/ParseStarterProjectAppDelegate.m b/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject/ParseStarterProjectAppDelegate.m index f3bb506a7..2c4eeee6e 100644 --- a/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject/ParseStarterProjectAppDelegate.m +++ b/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject/ParseStarterProjectAppDelegate.m @@ -9,9 +9,6 @@ @import ParseCore; -// If you want to use any of the UI components, uncomment this line -// #import - #import "ParseStarterProjectAppDelegate.h" #import "ParseStarterProjectViewController.h" diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift index a3c01de2c..d05431cf9 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift @@ -11,9 +11,6 @@ import UIKit import ParseCore -// If you want to use any of the UI components, uncomment this line -// import ParseUI - @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { diff --git a/ParseUI/.gitignore b/ParseUI/.gitignore deleted file mode 100644 index f4096fee4..000000000 --- a/ParseUI/.gitignore +++ /dev/null @@ -1 +0,0 @@ -Package.resolved diff --git a/ParseUI/Configurations/ParseUI-iOS-Dynamic.xcconfig b/ParseUI/Configurations/ParseUI-iOS-Dynamic.xcconfig deleted file mode 100644 index 751d6532b..000000000 --- a/ParseUI/Configurations/ParseUI-iOS-Dynamic.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/DynamicFramework.xcconfig" - -PRODUCT_NAME = ParseUI -PRODUCT_BUNDLE_IDENTIFIER = com.parse.parseui - -INFOPLIST_FILE = $(SRCROOT)/ParseUI/Resources/Info-iOS.plist diff --git a/ParseUI/Configurations/ParseUI-iOS.xcconfig b/ParseUI/Configurations/ParseUI-iOS.xcconfig deleted file mode 100644 index 2bfaced2e..000000000 --- a/ParseUI/Configurations/ParseUI-iOS.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/StaticFramework.xcconfig" - -PRODUCT_NAME = ParseUI -PRODUCT_BUNDLE_IDENTIFIER = com.parse.parseui - -INFOPLIST_FILE = $(SRCROOT)/ParseUI/Resources/Info-iOS.plist diff --git a/ParseUI/Configurations/Shared b/ParseUI/Configurations/Shared deleted file mode 120000 index 657caabf0..000000000 --- a/ParseUI/Configurations/Shared +++ /dev/null @@ -1 +0,0 @@ -../../Vendor/xctoolchain/Configurations \ No newline at end of file diff --git a/ParseUI/ParseUI.xcodeproj/project.pbxproj b/ParseUI/ParseUI.xcodeproj/project.pbxproj deleted file mode 100644 index 95eaad508..000000000 --- a/ParseUI/ParseUI.xcodeproj/project.pbxproj +++ /dev/null @@ -1,2111 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 39452DEC2AD8FC110066C2AE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39452DEB2AD8FC110066C2AE /* ParseObjC */; }; - 39452DF82AD9121D0066C2AE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39452DF72AD9121D0066C2AE /* ParseObjC */; }; - 39452DFA2AD9121D0066C2AE /* ParseUI in Frameworks */ = {isa = PBXBuildFile; productRef = 39452DF92AD9121D0066C2AE /* ParseUI */; }; - 39452DFD2AD914110066C2AE /* BoltsSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 39452DFC2AD914110066C2AE /* BoltsSwift */; }; - 39E22AD72AD0676700D9AE5C /* OCMock in Frameworks */ = {isa = PBXBuildFile; productRef = 39E22AD62AD0676700D9AE5C /* OCMock */; }; - 39E249A52AD1DD2E0014357C /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39E249A42AD1DD2E0014357C /* ParseObjC */; }; - 6B63F1602BC34E4A00F89DEE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 6B63F15F2BC34E4A00F89DEE /* ParseObjC */; }; - 6B63F1662BC3508200F89DEE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 6B63F1652BC3508200F89DEE /* ParseObjC */; }; - 7C77D109292A509000C4D90E /* PFPurchaseTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0C9292A507500C4D90E /* PFPurchaseTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D10A292A509000C4D90E /* PFTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0CB292A507500C4D90E /* PFTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D10B292A509000C4D90E /* PFQueryTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0CD292A507500C4D90E /* PFQueryTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D10C292A509000C4D90E /* PFAppleUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D0292A507500C4D90E /* PFAppleUtils.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 7C77D10D292A509000C4D90E /* PFSignUpView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D3292A507500C4D90E /* PFSignUpView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D10E292A509000C4D90E /* PFTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D6292A507500C4D90E /* PFTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D10F292A509000C4D90E /* ParseUIConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D8292A507500C4D90E /* ParseUIConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D110292A509000C4D90E /* PFLogInView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D9292A507500C4D90E /* PFLogInView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D111292A509000C4D90E /* PFResources.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0DB292A507500C4D90E /* PFResources.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D112292A509000C4D90E /* PFLogInViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0DD292A507500C4D90E /* PFLogInViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D113292A509000C4D90E /* ParseUI.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0DE292A507500C4D90E /* ParseUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D114292A509000C4D90E /* PFProductTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E1292A507500C4D90E /* PFProductTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D115292A509000C4D90E /* PFCollectionViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E2292A507500C4D90E /* PFCollectionViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D116292A509000C4D90E /* PFAppleAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E4292A507500C4D90E /* PFAppleAuthenticationProvider.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 7C77D117292A509000C4D90E /* PFImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E6292A507500C4D90E /* PFImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D118292A509000C4D90E /* PFSignUpViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E7292A507500C4D90E /* PFSignUpViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D119292A509000C4D90E /* PFLogInView_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E8292A507500C4D90E /* PFLogInView_Private.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D11A292A509000C4D90E /* PFQueryCollectionViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E9292A507500C4D90E /* PFQueryCollectionViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D11C292A509D00C4D90E /* PFActivityIndicatorCollectionReusableView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0ED292A507500C4D90E /* PFActivityIndicatorCollectionReusableView.h */; }; - 7C77D11D292A509D00C4D90E /* PFActivityIndicatorTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0EE292A507500C4D90E /* PFActivityIndicatorTableViewCell.h */; }; - 7C77D11E292A509D00C4D90E /* PFImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F0292A507500C4D90E /* PFImageCache.h */; }; - 7C77D11F292A509D00C4D90E /* PFColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F3292A507500C4D90E /* PFColor.h */; }; - 7C77D120292A509D00C4D90E /* PFUIAlertView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F5292A507500C4D90E /* PFUIAlertView.h */; }; - 7C77D121292A509D00C4D90E /* PFRect.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F6292A507500C4D90E /* PFRect.h */; }; - 7C77D122292A509D00C4D90E /* PFImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F8292A507500C4D90E /* PFImage.h */; }; - 7C77D123292A509D00C4D90E /* PFLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0FB292A507500C4D90E /* PFLocalization.h */; }; - 7C77D124292A509D00C4D90E /* PFDismissButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0FF292A507500C4D90E /* PFDismissButton.h */; }; - 7C77D125292A509D00C4D90E /* PFTextButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D103292A507500C4D90E /* PFTextButton.h */; }; - 7C77D126292A509D00C4D90E /* PFPrimaryButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D105292A507500C4D90E /* PFPrimaryButton.h */; }; - 7C77D127292A509D00C4D90E /* PFActionButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D106292A507500C4D90E /* PFActionButton.h */; }; - 7C77D128292A509D00C4D90E /* PFLoadingView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D107292A507500C4D90E /* PFLoadingView.h */; }; - 7C77D150292A510400C4D90E /* PFPurchaseTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0C9292A507500C4D90E /* PFPurchaseTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D151292A510400C4D90E /* PFTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0CB292A507500C4D90E /* PFTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D152292A510400C4D90E /* PFQueryTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0CD292A507500C4D90E /* PFQueryTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D153292A510400C4D90E /* PFAppleUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D0292A507500C4D90E /* PFAppleUtils.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 7C77D154292A510400C4D90E /* PFSignUpView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D3292A507500C4D90E /* PFSignUpView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D155292A510400C4D90E /* PFTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D6292A507500C4D90E /* PFTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D156292A510400C4D90E /* ParseUIConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D8292A507500C4D90E /* ParseUIConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D157292A510400C4D90E /* PFLogInView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D9292A507500C4D90E /* PFLogInView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D158292A510400C4D90E /* PFResources.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0DB292A507500C4D90E /* PFResources.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D159292A510400C4D90E /* PFLogInViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0DD292A507500C4D90E /* PFLogInViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D15A292A510400C4D90E /* ParseUI.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0DE292A507500C4D90E /* ParseUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D15B292A510400C4D90E /* PFProductTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E1292A507500C4D90E /* PFProductTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D15C292A510400C4D90E /* PFCollectionViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E2292A507500C4D90E /* PFCollectionViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D15D292A510400C4D90E /* PFAppleAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E4292A507500C4D90E /* PFAppleAuthenticationProvider.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 7C77D15E292A510400C4D90E /* PFImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E6292A507500C4D90E /* PFImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D15F292A510400C4D90E /* PFSignUpViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E7292A507500C4D90E /* PFSignUpViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D160292A510400C4D90E /* PFLogInView_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E8292A507500C4D90E /* PFLogInView_Private.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D161292A510400C4D90E /* PFQueryCollectionViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E9292A507500C4D90E /* PFQueryCollectionViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D163292A511000C4D90E /* PFActivityIndicatorCollectionReusableView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0ED292A507500C4D90E /* PFActivityIndicatorCollectionReusableView.h */; }; - 7C77D164292A511000C4D90E /* PFActivityIndicatorTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0EE292A507500C4D90E /* PFActivityIndicatorTableViewCell.h */; }; - 7C77D165292A511000C4D90E /* PFImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F0292A507500C4D90E /* PFImageCache.h */; }; - 7C77D166292A511000C4D90E /* PFColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F3292A507500C4D90E /* PFColor.h */; }; - 7C77D167292A511000C4D90E /* PFUIAlertView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F5292A507500C4D90E /* PFUIAlertView.h */; }; - 7C77D168292A511000C4D90E /* PFRect.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F6292A507500C4D90E /* PFRect.h */; }; - 7C77D169292A511000C4D90E /* PFImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F8292A507500C4D90E /* PFImage.h */; }; - 7C77D16A292A511000C4D90E /* PFLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0FB292A507500C4D90E /* PFLocalization.h */; }; - 7C77D16B292A511000C4D90E /* PFDismissButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0FF292A507500C4D90E /* PFDismissButton.h */; }; - 7C77D16C292A511000C4D90E /* PFTextButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D103292A507500C4D90E /* PFTextButton.h */; }; - 7C77D16D292A511000C4D90E /* PFPrimaryButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D105292A507500C4D90E /* PFPrimaryButton.h */; }; - 7C77D16E292A511000C4D90E /* PFActionButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D106292A507500C4D90E /* PFActionButton.h */; }; - 7C77D16F292A511000C4D90E /* PFLoadingView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D107292A507500C4D90E /* PFLoadingView.h */; }; - 7C77D170292A511C00C4D90E /* PFLogInViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0CA292A507500C4D90E /* PFLogInViewController.m */; }; - 7C77D171292A511C00C4D90E /* PFResources.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0CC292A507500C4D90E /* PFResources.m */; }; - 7C77D172292A511C00C4D90E /* PFLogInView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0CE292A507500C4D90E /* PFLogInView.m */; }; - 7C77D173292A511C00C4D90E /* PFProductTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0CF292A507500C4D90E /* PFProductTableViewController.m */; }; - 7C77D174292A511C00C4D90E /* PFSignUpViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D1292A507500C4D90E /* PFSignUpViewController.m */; }; - 7C77D175292A511C00C4D90E /* PFImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D2292A507500C4D90E /* PFImageView.m */; }; - 7C77D176292A511C00C4D90E /* PFAppleAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D4292A507500C4D90E /* PFAppleAuthenticationProvider.m */; }; - 7C77D177292A511C00C4D90E /* PFCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D5292A507500C4D90E /* PFCollectionViewCell.m */; }; - 7C77D178292A511C00C4D90E /* PFQueryCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D7292A507500C4D90E /* PFQueryCollectionViewController.m */; }; - 7C77D179292A511C00C4D90E /* PFQueryTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0DA292A507500C4D90E /* PFQueryTableViewController.m */; }; - 7C77D17A292A511C00C4D90E /* PFTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0DC292A507500C4D90E /* PFTextField.m */; }; - 7C77D17B292A511C00C4D90E /* PFPurchaseTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0DF292A507500C4D90E /* PFPurchaseTableViewCell.m */; }; - 7C77D17C292A511C00C4D90E /* PFAppleUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0E0292A507500C4D90E /* PFAppleUtils.m */; }; - 7C77D17D292A511C00C4D90E /* PFTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0E3292A507500C4D90E /* PFTableViewCell.m */; }; - 7C77D17E292A511C00C4D90E /* PFSignUpView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0E5292A507500C4D90E /* PFSignUpView.m */; }; - 7C77D17F292A511C00C4D90E /* PFActivityIndicatorTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0EC292A507500C4D90E /* PFActivityIndicatorTableViewCell.m */; }; - 7C77D180292A511C00C4D90E /* PFActivityIndicatorCollectionReusableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0EF292A507500C4D90E /* PFActivityIndicatorCollectionReusableView.m */; }; - 7C77D181292A511C00C4D90E /* PFLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0F1292A507500C4D90E /* PFLocalization.m */; }; - 7C77D182292A511C00C4D90E /* PFImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0F4292A507500C4D90E /* PFImage.m */; }; - 7C77D183292A511C00C4D90E /* PFUIAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0F7292A507500C4D90E /* PFUIAlertView.m */; }; - 7C77D184292A511C00C4D90E /* PFColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0F9292A507500C4D90E /* PFColor.m */; }; - 7C77D185292A511C00C4D90E /* PFRect.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0FA292A507500C4D90E /* PFRect.m */; }; - 7C77D186292A511C00C4D90E /* PFImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0FC292A507500C4D90E /* PFImageCache.m */; }; - 7C77D187292A511C00C4D90E /* PFTextButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D100292A507500C4D90E /* PFTextButton.m */; }; - 7C77D188292A511C00C4D90E /* PFPrimaryButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D101292A507500C4D90E /* PFPrimaryButton.m */; }; - 7C77D189292A511C00C4D90E /* PFActionButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D102292A507500C4D90E /* PFActionButton.m */; }; - 7C77D18A292A511C00C4D90E /* PFDismissButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D104292A507500C4D90E /* PFDismissButton.m */; }; - 7C77D18B292A511C00C4D90E /* PFLoadingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D108292A507500C4D90E /* PFLoadingView.m */; }; - 7C77D18C292A512300C4D90E /* PFLogInViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0CA292A507500C4D90E /* PFLogInViewController.m */; }; - 7C77D18D292A512300C4D90E /* PFResources.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0CC292A507500C4D90E /* PFResources.m */; }; - 7C77D18E292A512300C4D90E /* PFLogInView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0CE292A507500C4D90E /* PFLogInView.m */; }; - 7C77D18F292A512300C4D90E /* PFProductTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0CF292A507500C4D90E /* PFProductTableViewController.m */; }; - 7C77D190292A512300C4D90E /* PFSignUpViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D1292A507500C4D90E /* PFSignUpViewController.m */; }; - 7C77D191292A512300C4D90E /* PFImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D2292A507500C4D90E /* PFImageView.m */; }; - 7C77D192292A512300C4D90E /* PFAppleAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D4292A507500C4D90E /* PFAppleAuthenticationProvider.m */; }; - 7C77D193292A512300C4D90E /* PFCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D5292A507500C4D90E /* PFCollectionViewCell.m */; }; - 7C77D194292A512300C4D90E /* PFQueryCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D7292A507500C4D90E /* PFQueryCollectionViewController.m */; }; - 7C77D195292A512300C4D90E /* PFQueryTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0DA292A507500C4D90E /* PFQueryTableViewController.m */; }; - 7C77D196292A512300C4D90E /* PFTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0DC292A507500C4D90E /* PFTextField.m */; }; - 7C77D197292A512300C4D90E /* PFPurchaseTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0DF292A507500C4D90E /* PFPurchaseTableViewCell.m */; }; - 7C77D198292A512300C4D90E /* PFAppleUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0E0292A507500C4D90E /* PFAppleUtils.m */; }; - 7C77D199292A512300C4D90E /* PFTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0E3292A507500C4D90E /* PFTableViewCell.m */; }; - 7C77D19A292A512300C4D90E /* PFSignUpView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0E5292A507500C4D90E /* PFSignUpView.m */; }; - 7C77D19B292A512300C4D90E /* PFActivityIndicatorTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0EC292A507500C4D90E /* PFActivityIndicatorTableViewCell.m */; }; - 7C77D19C292A512300C4D90E /* PFActivityIndicatorCollectionReusableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0EF292A507500C4D90E /* PFActivityIndicatorCollectionReusableView.m */; }; - 7C77D19D292A512300C4D90E /* PFLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0F1292A507500C4D90E /* PFLocalization.m */; }; - 7C77D19E292A512300C4D90E /* PFImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0F4292A507500C4D90E /* PFImage.m */; }; - 7C77D19F292A512300C4D90E /* PFUIAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0F7292A507500C4D90E /* PFUIAlertView.m */; }; - 7C77D1A0292A512300C4D90E /* PFColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0F9292A507500C4D90E /* PFColor.m */; }; - 7C77D1A1292A512300C4D90E /* PFRect.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0FA292A507500C4D90E /* PFRect.m */; }; - 7C77D1A2292A512300C4D90E /* PFImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0FC292A507500C4D90E /* PFImageCache.m */; }; - 7C77D1A3292A512300C4D90E /* PFTextButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D100292A507500C4D90E /* PFTextButton.m */; }; - 7C77D1A4292A512300C4D90E /* PFPrimaryButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D101292A507500C4D90E /* PFPrimaryButton.m */; }; - 7C77D1A5292A512300C4D90E /* PFActionButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D102292A507500C4D90E /* PFActionButton.m */; }; - 7C77D1A6292A512300C4D90E /* PFDismissButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D104292A507500C4D90E /* PFDismissButton.m */; }; - 7C77D1A7292A512300C4D90E /* PFLoadingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D108292A507500C4D90E /* PFLoadingView.m */; }; - 7C77D221292A575B00C4D90E /* Social.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D220292A575B00C4D90E /* Social.framework */; }; - 7C77D222292A580800C4D90E /* Social.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D220292A575B00C4D90E /* Social.framework */; }; - 8129E5F51A9CB067006752BC /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA71A1AB37500FD6EED /* Images.xcassets */; }; - 8129E5F71A9CB067006752BC /* 0.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA91A1AB37500FD6EED /* 0.png */; }; - 8129E5F81A9CB067006752BC /* 1.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FAA1A1AB37500FD6EED /* 1.png */; }; - 8129E5F91A9CB067006752BC /* 2.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FAB1A1AB37500FD6EED /* 2.png */; }; - 8129E5FA1A9CB067006752BC /* SimpleQueryCollectionStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 812E5C001A7A8EB4000FBDE1 /* SimpleQueryCollectionStoryboard.storyboard */; }; - 8129E5FB1A9CB067006752BC /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA81A1AB37500FD6EED /* Icon.png */; }; - 8129E6091A9CB1BE006752BC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8129E6081A9CB1BE006752BC /* AppDelegate.swift */; }; - 8129E63A1A9CB320006752BC /* UIDemoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8129E6391A9CB320006752BC /* UIDemoViewController.swift */; }; - 812E5C011A7A8EB4000FBDE1 /* SimpleQueryCollectionStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 812E5C001A7A8EB4000FBDE1 /* SimpleQueryCollectionStoryboard.storyboard */; }; - 812E5C041A7A8EFB000FBDE1 /* StoryboardCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 812E5C031A7A8EFB000FBDE1 /* StoryboardCollectionViewController.m */; }; - 814155B11A9CD9CA002D9683 /* SimpleQueryTableStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 814155B01A9CD9CA002D9683 /* SimpleQueryTableStoryboard.storyboard */; }; - 81472FB11A1AB37500FD6EED /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472F8E1A1AB37500FD6EED /* AppDelegate.m */; }; - 81472FB21A1AB37500FD6EED /* PFUIDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472F901A1AB37500FD6EED /* PFUIDemoViewController.m */; }; - 81472FB31A1AB37500FD6EED /* CustomSignUpViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472F921A1AB37500FD6EED /* CustomSignUpViewController.m */; }; - 81472FB41A1AB37500FD6EED /* CustomLogInViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472F951A1AB37500FD6EED /* CustomLogInViewController.m */; }; - 81472FB51A1AB37500FD6EED /* SimpleTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472F981A1AB37500FD6EED /* SimpleTableViewController.m */; }; - 81472FB61A1AB37500FD6EED /* PaginatedTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472F9A1A1AB37500FD6EED /* PaginatedTableViewController.m */; }; - 81472FB71A1AB37500FD6EED /* SectionedTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472F9C1A1AB37500FD6EED /* SectionedTableViewController.m */; }; - 81472FB81A1AB37500FD6EED /* SubtitleImageTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472F9E1A1AB37500FD6EED /* SubtitleImageTableViewController.m */; }; - 81472FB91A1AB37500FD6EED /* CustomProductTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472FA01A1AB37500FD6EED /* CustomProductTableViewController.m */; }; - 81472FBB1A1AB37500FD6EED /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472FA51A1AB37500FD6EED /* main.m */; }; - 81472FBC1A1AB37500FD6EED /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA71A1AB37500FD6EED /* Images.xcassets */; }; - 81472FBD1A1AB37500FD6EED /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA81A1AB37500FD6EED /* Icon.png */; }; - 81472FBE1A1AB37500FD6EED /* 0.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA91A1AB37500FD6EED /* 0.png */; }; - 81472FBF1A1AB37500FD6EED /* 1.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FAA1A1AB37500FD6EED /* 1.png */; }; - 81472FC01A1AB37500FD6EED /* 2.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FAB1A1AB37500FD6EED /* 2.png */; }; - 819A4B3A1A6808EA00D01241 /* SubtitleImageCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 819A4B391A6808EA00D01241 /* SubtitleImageCollectionViewController.m */; }; - 81C5993F1A64346000F574E8 /* SimpleCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81C5993E1A64346000F574E8 /* SimpleCollectionViewController.m */; }; - 81C599421A6454C900F574E8 /* PaginatedCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81C599411A6454C900F574E8 /* PaginatedCollectionViewController.m */; }; - 81C599491A64636200F574E8 /* SectionedCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81C599481A64636200F574E8 /* SectionedCollectionViewController.m */; }; - 81C8D9BD1A890BCA007B8DCF /* StoryboardTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81C8D9BC1A890BCA007B8DCF /* StoryboardTableViewController.m */; }; - 81FC6B4A1A9D1ADB00104E45 /* CustomLogInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B3A1A9D1ADB00104E45 /* CustomLogInViewController.swift */; }; - 81FC6B561A9D1ADB00104E45 /* CustomSignUpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B491A9D1ADB00104E45 /* CustomSignUpViewController.swift */; }; - 81FC6B5F1A9D1BFC00104E45 /* PaginatedTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B591A9D1BFC00104E45 /* PaginatedTableViewController.swift */; }; - 81FC6B601A9D1BFC00104E45 /* SectionedTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B5A1A9D1BFC00104E45 /* SectionedTableViewController.swift */; }; - 81FC6B611A9D1BFC00104E45 /* SimpleTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B5B1A9D1BFC00104E45 /* SimpleTableViewController.swift */; }; - 81FC6B621A9D1BFC00104E45 /* StoryboardTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B5C1A9D1BFC00104E45 /* StoryboardTableViewController.swift */; }; - 81FC6B631A9D1BFC00104E45 /* SubtitleImageTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B5D1A9D1BFC00104E45 /* SubtitleImageTableViewController.swift */; }; - 81FC6B651A9D1C2000104E45 /* SimpleQueryTableStoryboard-Swift.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81FC6B641A9D1C2000104E45 /* SimpleQueryTableStoryboard-Swift.storyboard */; }; - 81FC6B6C1A9D1CE900104E45 /* PaginatedCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B671A9D1CE900104E45 /* PaginatedCollectionViewController.swift */; }; - 81FC6B6D1A9D1CE900104E45 /* SectionedCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B681A9D1CE900104E45 /* SectionedCollectionViewController.swift */; }; - 81FC6B6E1A9D1CE900104E45 /* SimpleCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B691A9D1CE900104E45 /* SimpleCollectionViewController.swift */; }; - 81FC6B6F1A9D1CE900104E45 /* StoryboardCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B6A1A9D1CE900104E45 /* StoryboardCollectionViewController.swift */; }; - 81FC6B701A9D1CE900104E45 /* SubtitleImageCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B6B1A9D1CE900104E45 /* SubtitleImageCollectionViewController.swift */; }; - 81FC6B721A9D1CFD00104E45 /* SimpleQueryCollectionStoryboard-Swift.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81FC6B711A9D1CFD00104E45 /* SimpleQueryCollectionStoryboard-Swift.storyboard */; }; - 81FC6B751A9D1D4700104E45 /* CustomProductTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B741A9D1D4700104E45 /* CustomProductTableViewController.swift */; }; - BCA5CC8523BFCFB8003BC0A0 /* SignInWithAppleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BCCBE8CB23BFB89D0044A79C /* SignInWithAppleTests.m */; }; - F57F3D231B0C03D40087F60B /* DeletionCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F57F3D201B0C03C90087F60B /* DeletionCollectionViewController.m */; }; - F57F3D241B0C03DB0087F60B /* DeletionTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F57F3D1C1B0C03BA0087F60B /* DeletionTableViewController.m */; }; - F57F3D271B0C050C0087F60B /* DeletionTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F57F3D251B0C04EF0087F60B /* DeletionTableViewController.swift */; }; - F57F3D291B0C05280087F60B /* DeletionCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F57F3D281B0C05280087F60B /* DeletionCollectionViewController.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 39452DF12AD910490066C2AE /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 81472F661A1AB33800FD6EED; - remoteInfo = ParseUIDemo; - }; - 39452DF52AD911740066C2AE /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4A9A9496200D0329005D8F4B; - remoteInfo = ParseUI; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 39E2499F2AD1DD160014357C /* Parse-SDK-iOS-OSX */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "Parse-SDK-iOS-OSX"; path = ..; sourceTree = ""; }; - 4A9A947E200D0226005D8F4B /* convert_images.rb */ = {isa = PBXFileReference; lastKnownFileType = text.script.ruby; path = convert_images.rb; sourceTree = ""; }; - 4A9A9480200D02CE005D8F4B /* ParseUI-iOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseUI-iOS.xcconfig"; sourceTree = ""; }; - 4A9A9482200D02CE005D8F4B /* Common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Common.xcconfig; sourceTree = ""; }; - 4A9A9484200D02CE005D8F4B /* macOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = macOS.xcconfig; sourceTree = ""; }; - 4A9A9485200D02CE005D8F4B /* tvOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = tvOS.xcconfig; sourceTree = ""; }; - 4A9A9486200D02CE005D8F4B /* iOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = iOS.xcconfig; sourceTree = ""; }; - 4A9A9487200D02CE005D8F4B /* watchOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = watchOS.xcconfig; sourceTree = ""; }; - 4A9A9489200D02CE005D8F4B /* Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Application.xcconfig; sourceTree = ""; }; - 4A9A948A200D02CE005D8F4B /* DynamicFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DynamicFramework.xcconfig; sourceTree = ""; }; - 4A9A948B200D02CE005D8F4B /* StaticFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = StaticFramework.xcconfig; sourceTree = ""; }; - 4A9A948C200D02CE005D8F4B /* LogicTests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = LogicTests.xcconfig; sourceTree = ""; }; - 4A9A948E200D02CE005D8F4B /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 4A9A948F200D02CE005D8F4B /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 4A9A9490200D02CE005D8F4B /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; - 4A9A9491200D02CE005D8F4B /* ParseUI-iOS-Dynamic.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseUI-iOS-Dynamic.xcconfig"; sourceTree = ""; }; - 7C77D0B4292A507500C4D90E /* apple_icon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apple_icon@3x.png"; sourceTree = ""; }; - 7C77D0B6292A507500C4D90E /* parse_logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = parse_logo.png; sourceTree = ""; }; - 7C77D0B8292A507500C4D90E /* apple_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apple_icon@2x.png"; sourceTree = ""; }; - 7C77D0BA292A507500C4D90E /* parse_logo@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "parse_logo@2x.png"; sourceTree = ""; }; - 7C77D0BB292A507500C4D90E /* parse_logo@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "parse_logo@3x.png"; sourceTree = ""; }; - 7C77D0BC292A507500C4D90E /* apple_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = apple_icon.png; sourceTree = ""; }; - 7C77D0BF292A507500C4D90E /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = ""; }; - 7C77D0C2292A507500C4D90E /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/ParseUI.strings; sourceTree = ""; }; - 7C77D0C3292A507500C4D90E /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/ParseUI.strings; sourceTree = ""; }; - 7C77D0C4292A507500C4D90E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/ParseUI.strings; sourceTree = ""; }; - 7C77D0C5292A507500C4D90E /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/ParseUI.strings; sourceTree = ""; }; - 7C77D0C6292A507500C4D90E /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/ParseUI.strings"; sourceTree = ""; }; - 7C77D0C7292A507500C4D90E /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ParseUI.strings; sourceTree = ""; }; - 7C77D0C9292A507500C4D90E /* PFPurchaseTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFPurchaseTableViewCell.h; sourceTree = ""; }; - 7C77D0CA292A507500C4D90E /* PFLogInViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFLogInViewController.m; sourceTree = ""; }; - 7C77D0CB292A507500C4D90E /* PFTextField.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFTextField.h; sourceTree = ""; }; - 7C77D0CC292A507500C4D90E /* PFResources.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFResources.m; sourceTree = ""; }; - 7C77D0CD292A507500C4D90E /* PFQueryTableViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFQueryTableViewController.h; sourceTree = ""; }; - 7C77D0CE292A507500C4D90E /* PFLogInView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFLogInView.m; sourceTree = ""; }; - 7C77D0CF292A507500C4D90E /* PFProductTableViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFProductTableViewController.m; sourceTree = ""; }; - 7C77D0D0292A507500C4D90E /* PFAppleUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFAppleUtils.h; sourceTree = ""; }; - 7C77D0D1292A507500C4D90E /* PFSignUpViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFSignUpViewController.m; sourceTree = ""; }; - 7C77D0D2292A507500C4D90E /* PFImageView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFImageView.m; sourceTree = ""; }; - 7C77D0D3292A507500C4D90E /* PFSignUpView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFSignUpView.h; sourceTree = ""; }; - 7C77D0D4292A507500C4D90E /* PFAppleAuthenticationProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFAppleAuthenticationProvider.m; sourceTree = ""; }; - 7C77D0D5292A507500C4D90E /* PFCollectionViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFCollectionViewCell.m; sourceTree = ""; }; - 7C77D0D6292A507500C4D90E /* PFTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFTableViewCell.h; sourceTree = ""; }; - 7C77D0D7292A507500C4D90E /* PFQueryCollectionViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFQueryCollectionViewController.m; sourceTree = ""; }; - 7C77D0D8292A507500C4D90E /* ParseUIConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ParseUIConstants.h; sourceTree = ""; }; - 7C77D0D9292A507500C4D90E /* PFLogInView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFLogInView.h; sourceTree = ""; }; - 7C77D0DA292A507500C4D90E /* PFQueryTableViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFQueryTableViewController.m; sourceTree = ""; }; - 7C77D0DB292A507500C4D90E /* PFResources.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFResources.h; sourceTree = ""; }; - 7C77D0DC292A507500C4D90E /* PFTextField.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFTextField.m; sourceTree = ""; }; - 7C77D0DD292A507500C4D90E /* PFLogInViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFLogInViewController.h; sourceTree = ""; }; - 7C77D0DE292A507500C4D90E /* ParseUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ParseUI.h; sourceTree = ""; }; - 7C77D0DF292A507500C4D90E /* PFPurchaseTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFPurchaseTableViewCell.m; sourceTree = ""; }; - 7C77D0E0292A507500C4D90E /* PFAppleUtils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFAppleUtils.m; sourceTree = ""; }; - 7C77D0E1292A507500C4D90E /* PFProductTableViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFProductTableViewController.h; sourceTree = ""; }; - 7C77D0E2292A507500C4D90E /* PFCollectionViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFCollectionViewCell.h; sourceTree = ""; }; - 7C77D0E3292A507500C4D90E /* PFTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFTableViewCell.m; sourceTree = ""; }; - 7C77D0E4292A507500C4D90E /* PFAppleAuthenticationProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFAppleAuthenticationProvider.h; sourceTree = ""; }; - 7C77D0E5292A507500C4D90E /* PFSignUpView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFSignUpView.m; sourceTree = ""; }; - 7C77D0E6292A507500C4D90E /* PFImageView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFImageView.h; sourceTree = ""; }; - 7C77D0E7292A507500C4D90E /* PFSignUpViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFSignUpViewController.h; sourceTree = ""; }; - 7C77D0E8292A507500C4D90E /* PFLogInView_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFLogInView_Private.h; sourceTree = ""; }; - 7C77D0E9292A507500C4D90E /* PFQueryCollectionViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFQueryCollectionViewController.h; sourceTree = ""; }; - 7C77D0EC292A507500C4D90E /* PFActivityIndicatorTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFActivityIndicatorTableViewCell.m; sourceTree = ""; }; - 7C77D0ED292A507500C4D90E /* PFActivityIndicatorCollectionReusableView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFActivityIndicatorCollectionReusableView.h; sourceTree = ""; }; - 7C77D0EE292A507500C4D90E /* PFActivityIndicatorTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFActivityIndicatorTableViewCell.h; sourceTree = ""; }; - 7C77D0EF292A507500C4D90E /* PFActivityIndicatorCollectionReusableView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFActivityIndicatorCollectionReusableView.m; sourceTree = ""; }; - 7C77D0F0292A507500C4D90E /* PFImageCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFImageCache.h; sourceTree = ""; }; - 7C77D0F1292A507500C4D90E /* PFLocalization.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFLocalization.m; sourceTree = ""; }; - 7C77D0F3292A507500C4D90E /* PFColor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFColor.h; sourceTree = ""; }; - 7C77D0F4292A507500C4D90E /* PFImage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFImage.m; sourceTree = ""; }; - 7C77D0F5292A507500C4D90E /* PFUIAlertView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFUIAlertView.h; sourceTree = ""; }; - 7C77D0F6292A507500C4D90E /* PFRect.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFRect.h; sourceTree = ""; }; - 7C77D0F7292A507500C4D90E /* PFUIAlertView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFUIAlertView.m; sourceTree = ""; }; - 7C77D0F8292A507500C4D90E /* PFImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFImage.h; sourceTree = ""; }; - 7C77D0F9292A507500C4D90E /* PFColor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFColor.m; sourceTree = ""; }; - 7C77D0FA292A507500C4D90E /* PFRect.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFRect.m; sourceTree = ""; }; - 7C77D0FB292A507500C4D90E /* PFLocalization.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFLocalization.h; sourceTree = ""; }; - 7C77D0FC292A507500C4D90E /* PFImageCache.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFImageCache.m; sourceTree = ""; }; - 7C77D0FF292A507500C4D90E /* PFDismissButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFDismissButton.h; sourceTree = ""; }; - 7C77D100292A507500C4D90E /* PFTextButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFTextButton.m; sourceTree = ""; }; - 7C77D101292A507500C4D90E /* PFPrimaryButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFPrimaryButton.m; sourceTree = ""; }; - 7C77D102292A507500C4D90E /* PFActionButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFActionButton.m; sourceTree = ""; }; - 7C77D103292A507500C4D90E /* PFTextButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFTextButton.h; sourceTree = ""; }; - 7C77D104292A507500C4D90E /* PFDismissButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFDismissButton.m; sourceTree = ""; }; - 7C77D105292A507500C4D90E /* PFPrimaryButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFPrimaryButton.h; sourceTree = ""; }; - 7C77D106292A507500C4D90E /* PFActionButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFActionButton.h; sourceTree = ""; }; - 7C77D107292A507500C4D90E /* PFLoadingView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFLoadingView.h; sourceTree = ""; }; - 7C77D108292A507500C4D90E /* PFLoadingView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFLoadingView.m; sourceTree = ""; }; - 7C77D162292A510400C4D90E /* ParseUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 7C77D21F292A56F600C4D90E /* ParseUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ParseUIDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 7C77D220292A575B00C4D90E /* Social.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Social.framework; path = System/Library/Frameworks/Social.framework; sourceTree = SDKROOT; }; - 7C77D22D292A604700C4D90E /* ParseUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 7C77D22F292A604700C4D90E /* ParseUIDemo-Swift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ParseUIDemo-Swift.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 7C77D230292A604700C4D90E /* SignInWithAppleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SignInWithAppleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 8129E6081A9CB1BE006752BC /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 8129E6391A9CB320006752BC /* UIDemoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIDemoViewController.swift; sourceTree = ""; }; - 812E5C001A7A8EB4000FBDE1 /* SimpleQueryCollectionStoryboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SimpleQueryCollectionStoryboard.storyboard; path = ../../../Resources/SimpleQueryCollectionStoryboard.storyboard; sourceTree = ""; }; - 812E5C021A7A8EFB000FBDE1 /* StoryboardCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StoryboardCollectionViewController.h; sourceTree = ""; }; - 812E5C031A7A8EFB000FBDE1 /* StoryboardCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StoryboardCollectionViewController.m; sourceTree = ""; }; - 814155B01A9CD9CA002D9683 /* SimpleQueryTableStoryboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SimpleQueryTableStoryboard.storyboard; path = ParseUIDemo/Resources/SimpleQueryTableStoryboard.storyboard; sourceTree = SOURCE_ROOT; }; - 81472F8D1A1AB37500FD6EED /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 81472F8E1A1AB37500FD6EED /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 81472F8F1A1AB37500FD6EED /* PFUIDemoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFUIDemoViewController.h; sourceTree = ""; }; - 81472F901A1AB37500FD6EED /* PFUIDemoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFUIDemoViewController.m; sourceTree = ""; }; - 81472F911A1AB37500FD6EED /* CustomSignUpViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomSignUpViewController.h; sourceTree = ""; }; - 81472F921A1AB37500FD6EED /* CustomSignUpViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomSignUpViewController.m; sourceTree = ""; }; - 81472F941A1AB37500FD6EED /* CustomLogInViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomLogInViewController.h; sourceTree = ""; }; - 81472F951A1AB37500FD6EED /* CustomLogInViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomLogInViewController.m; sourceTree = ""; }; - 81472F971A1AB37500FD6EED /* SimpleTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleTableViewController.h; sourceTree = ""; }; - 81472F981A1AB37500FD6EED /* SimpleTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleTableViewController.m; sourceTree = ""; }; - 81472F991A1AB37500FD6EED /* PaginatedTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PaginatedTableViewController.h; sourceTree = ""; }; - 81472F9A1A1AB37500FD6EED /* PaginatedTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PaginatedTableViewController.m; sourceTree = ""; }; - 81472F9B1A1AB37500FD6EED /* SectionedTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SectionedTableViewController.h; sourceTree = ""; }; - 81472F9C1A1AB37500FD6EED /* SectionedTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SectionedTableViewController.m; sourceTree = ""; }; - 81472F9D1A1AB37500FD6EED /* SubtitleImageTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SubtitleImageTableViewController.h; sourceTree = ""; }; - 81472F9E1A1AB37500FD6EED /* SubtitleImageTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SubtitleImageTableViewController.m; sourceTree = ""; }; - 81472F9F1A1AB37500FD6EED /* CustomProductTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomProductTableViewController.h; sourceTree = ""; }; - 81472FA01A1AB37500FD6EED /* CustomProductTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomProductTableViewController.m; sourceTree = ""; }; - 81472FA41A1AB37500FD6EED /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 81472FA51A1AB37500FD6EED /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 81472FA71A1AB37500FD6EED /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ../Images.xcassets; sourceTree = ""; }; - 81472FA81A1AB37500FD6EED /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = ""; }; - 81472FA91A1AB37500FD6EED /* 0.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 0.png; sourceTree = ""; }; - 81472FAA1A1AB37500FD6EED /* 1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 1.png; sourceTree = ""; }; - 81472FAB1A1AB37500FD6EED /* 2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 2.png; sourceTree = ""; }; - 819A4B381A6808EA00D01241 /* SubtitleImageCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SubtitleImageCollectionViewController.h; sourceTree = ""; }; - 819A4B391A6808EA00D01241 /* SubtitleImageCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SubtitleImageCollectionViewController.m; sourceTree = ""; }; - 81C5993D1A64346000F574E8 /* SimpleCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleCollectionViewController.h; sourceTree = ""; }; - 81C5993E1A64346000F574E8 /* SimpleCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleCollectionViewController.m; sourceTree = ""; }; - 81C599401A6454C900F574E8 /* PaginatedCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PaginatedCollectionViewController.h; sourceTree = ""; }; - 81C599411A6454C900F574E8 /* PaginatedCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PaginatedCollectionViewController.m; sourceTree = ""; }; - 81C599471A64636200F574E8 /* SectionedCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SectionedCollectionViewController.h; sourceTree = ""; }; - 81C599481A64636200F574E8 /* SectionedCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SectionedCollectionViewController.m; sourceTree = ""; }; - 81C8D9BB1A890BCA007B8DCF /* StoryboardTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StoryboardTableViewController.h; sourceTree = ""; }; - 81C8D9BC1A890BCA007B8DCF /* StoryboardTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StoryboardTableViewController.m; sourceTree = ""; }; - 81FC6B3A1A9D1ADB00104E45 /* CustomLogInViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomLogInViewController.swift; sourceTree = ""; }; - 81FC6B491A9D1ADB00104E45 /* CustomSignUpViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomSignUpViewController.swift; sourceTree = ""; }; - 81FC6B591A9D1BFC00104E45 /* PaginatedTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PaginatedTableViewController.swift; sourceTree = ""; }; - 81FC6B5A1A9D1BFC00104E45 /* SectionedTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SectionedTableViewController.swift; sourceTree = ""; }; - 81FC6B5B1A9D1BFC00104E45 /* SimpleTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SimpleTableViewController.swift; sourceTree = ""; }; - 81FC6B5C1A9D1BFC00104E45 /* StoryboardTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoryboardTableViewController.swift; sourceTree = ""; }; - 81FC6B5D1A9D1BFC00104E45 /* SubtitleImageTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SubtitleImageTableViewController.swift; sourceTree = ""; }; - 81FC6B641A9D1C2000104E45 /* SimpleQueryTableStoryboard-Swift.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = "SimpleQueryTableStoryboard-Swift.storyboard"; path = "ParseUIDemo/Swift/Resources/SimpleQueryTableStoryboard-Swift.storyboard"; sourceTree = SOURCE_ROOT; }; - 81FC6B671A9D1CE900104E45 /* PaginatedCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PaginatedCollectionViewController.swift; sourceTree = ""; }; - 81FC6B681A9D1CE900104E45 /* SectionedCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SectionedCollectionViewController.swift; sourceTree = ""; }; - 81FC6B691A9D1CE900104E45 /* SimpleCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SimpleCollectionViewController.swift; sourceTree = ""; }; - 81FC6B6A1A9D1CE900104E45 /* StoryboardCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoryboardCollectionViewController.swift; sourceTree = ""; }; - 81FC6B6B1A9D1CE900104E45 /* SubtitleImageCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SubtitleImageCollectionViewController.swift; sourceTree = ""; }; - 81FC6B711A9D1CFD00104E45 /* SimpleQueryCollectionStoryboard-Swift.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = "SimpleQueryCollectionStoryboard-Swift.storyboard"; path = "ParseUIDemo/Swift/Resources/SimpleQueryCollectionStoryboard-Swift.storyboard"; sourceTree = SOURCE_ROOT; }; - 81FC6B741A9D1D4700104E45 /* CustomProductTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomProductTableViewController.swift; sourceTree = ""; }; - BC32E14523ABAE04009BDFCD /* ParseUIDemo.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = ParseUIDemo.entitlements; path = ParseUIDemo/ParseUIDemo.entitlements; sourceTree = ""; }; - BCCBE8CB23BFB89D0044A79C /* SignInWithAppleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SignInWithAppleTests.m; sourceTree = ""; }; - BCCBE8CD23BFB89D0044A79C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - F57F3D1B1B0C03BA0087F60B /* DeletionTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeletionTableViewController.h; sourceTree = ""; }; - F57F3D1C1B0C03BA0087F60B /* DeletionTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DeletionTableViewController.m; sourceTree = ""; }; - F57F3D1F1B0C03C90087F60B /* DeletionCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeletionCollectionViewController.h; sourceTree = ""; }; - F57F3D201B0C03C90087F60B /* DeletionCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DeletionCollectionViewController.m; sourceTree = ""; }; - F57F3D251B0C04EF0087F60B /* DeletionTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeletionTableViewController.swift; sourceTree = ""; }; - F57F3D281B0C05280087F60B /* DeletionCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeletionCollectionViewController.swift; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 4A0ECC00200D8C0200BA84A3 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 6B63F1602BC34E4A00F89DEE /* ParseObjC in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4A9A9493200D0329005D8F4B /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 39E249A52AD1DD2E0014357C /* ParseObjC in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8129E5F11A9CB067006752BC /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 39452DFA2AD9121D0066C2AE /* ParseUI in Frameworks */, - 39452DF82AD9121D0066C2AE /* ParseObjC in Frameworks */, - 7C77D221292A575B00C4D90E /* Social.framework in Frameworks */, - 39452DFD2AD914110066C2AE /* BoltsSwift in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81472F641A1AB33800FD6EED /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 6B63F1662BC3508200F89DEE /* ParseObjC in Frameworks */, - 7C77D222292A580800C4D90E /* Social.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - BCCBE8C623BFB89D0044A79C /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 39452DEC2AD8FC110066C2AE /* ParseObjC in Frameworks */, - 39E22AD72AD0676700D9AE5C /* OCMock in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 0867D691FE84028FC02AAC07 /* Breakpad */ = { - isa = PBXGroup; - children = ( - 39E2499E2AD1DD160014357C /* Packages */, - 4A9A9422200D0226005D8F4B /* ParseUI */, - 81472F621A1AB31F00FD6EED /* ParseUIDemo */, - BCCBE8CA23BFB89D0044A79C /* SignInWithAppleTests */, - 3F5307328F84566C90FBCF25 /* Frameworks */, - 7C77D162292A510400C4D90E /* ParseUI.framework */, - 7C77D21F292A56F600C4D90E /* ParseUIDemo.app */, - 7C77D22D292A604700C4D90E /* ParseUI.framework */, - 7C77D22F292A604700C4D90E /* ParseUIDemo-Swift.app */, - 7C77D230292A604700C4D90E /* SignInWithAppleTests.xctest */, - ); - name = Breakpad; - sourceTree = ""; - }; - 39E2499E2AD1DD160014357C /* Packages */ = { - isa = PBXGroup; - children = ( - 39E2499F2AD1DD160014357C /* Parse-SDK-iOS-OSX */, - ); - name = Packages; - sourceTree = ""; - }; - 3F5307328F84566C90FBCF25 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 7C77D220292A575B00C4D90E /* Social.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 4A9A9422200D0226005D8F4B /* ParseUI */ = { - isa = PBXGroup; - children = ( - 7C77D0B0292A507500C4D90E /* ParseUI */, - 4A9A947F200D02CE005D8F4B /* Configurations */, - 4A9A947D200D0226005D8F4B /* Scripts */, - ); - name = ParseUI; - sourceTree = ""; - }; - 4A9A947D200D0226005D8F4B /* Scripts */ = { - isa = PBXGroup; - children = ( - 4A9A947E200D0226005D8F4B /* convert_images.rb */, - ); - path = Scripts; - sourceTree = ""; - }; - 4A9A947F200D02CE005D8F4B /* Configurations */ = { - isa = PBXGroup; - children = ( - 4A9A9491200D02CE005D8F4B /* ParseUI-iOS-Dynamic.xcconfig */, - 4A9A9480200D02CE005D8F4B /* ParseUI-iOS.xcconfig */, - 4A9A9481200D02CE005D8F4B /* Shared */, - ); - path = Configurations; - sourceTree = ""; - }; - 4A9A9481200D02CE005D8F4B /* Shared */ = { - isa = PBXGroup; - children = ( - 4A9A9482200D02CE005D8F4B /* Common.xcconfig */, - 4A9A9483200D02CE005D8F4B /* Platform */, - 4A9A9488200D02CE005D8F4B /* Product */, - 4A9A948D200D02CE005D8F4B /* Project */, - 4A9A9490200D02CE005D8F4B /* Warnings.xcconfig */, - ); - path = Shared; - sourceTree = ""; - }; - 4A9A9483200D02CE005D8F4B /* Platform */ = { - isa = PBXGroup; - children = ( - 4A9A9484200D02CE005D8F4B /* macOS.xcconfig */, - 4A9A9485200D02CE005D8F4B /* tvOS.xcconfig */, - 4A9A9486200D02CE005D8F4B /* iOS.xcconfig */, - 4A9A9487200D02CE005D8F4B /* watchOS.xcconfig */, - ); - path = Platform; - sourceTree = ""; - }; - 4A9A9488200D02CE005D8F4B /* Product */ = { - isa = PBXGroup; - children = ( - 4A9A9489200D02CE005D8F4B /* Application.xcconfig */, - 4A9A948A200D02CE005D8F4B /* DynamicFramework.xcconfig */, - 4A9A948B200D02CE005D8F4B /* StaticFramework.xcconfig */, - 4A9A948C200D02CE005D8F4B /* LogicTests.xcconfig */, - ); - path = Product; - sourceTree = ""; - }; - 4A9A948D200D02CE005D8F4B /* Project */ = { - isa = PBXGroup; - children = ( - 4A9A948E200D02CE005D8F4B /* Debug.xcconfig */, - 4A9A948F200D02CE005D8F4B /* Release.xcconfig */, - ); - path = Project; - sourceTree = ""; - }; - 7C77D0B0292A507500C4D90E /* ParseUI */ = { - isa = PBXGroup; - children = ( - 7C77D0B1292A507500C4D90E /* Resources */, - 7C77D0C8292A507500C4D90E /* Source */, - 7C77D0EA292A507500C4D90E /* Internal */, - ); - path = ParseUI; - sourceTree = ""; - }; - 7C77D0B1292A507500C4D90E /* Resources */ = { - isa = PBXGroup; - children = ( - 7C77D0B2292A507500C4D90E /* Images */, - 7C77D0BF292A507500C4D90E /* Info-iOS.plist */, - 7C77D0C0292A507500C4D90E /* Localization */, - ); - path = Resources; - sourceTree = ""; - }; - 7C77D0B2292A507500C4D90E /* Images */ = { - isa = PBXGroup; - children = ( - 7C77D0B4292A507500C4D90E /* apple_icon@3x.png */, - 7C77D0B6292A507500C4D90E /* parse_logo.png */, - 7C77D0B8292A507500C4D90E /* apple_icon@2x.png */, - 7C77D0BA292A507500C4D90E /* parse_logo@2x.png */, - 7C77D0BB292A507500C4D90E /* parse_logo@3x.png */, - 7C77D0BC292A507500C4D90E /* apple_icon.png */, - ); - path = Images; - sourceTree = ""; - }; - 7C77D0C0292A507500C4D90E /* Localization */ = { - isa = PBXGroup; - children = ( - 7C77D0C1292A507500C4D90E /* ParseUI.strings */, - ); - path = Localization; - sourceTree = ""; - }; - 7C77D0C8292A507500C4D90E /* Source */ = { - isa = PBXGroup; - children = ( - 7C77D0C9292A507500C4D90E /* PFPurchaseTableViewCell.h */, - 7C77D0CA292A507500C4D90E /* PFLogInViewController.m */, - 7C77D0CB292A507500C4D90E /* PFTextField.h */, - 7C77D0CC292A507500C4D90E /* PFResources.m */, - 7C77D0CD292A507500C4D90E /* PFQueryTableViewController.h */, - 7C77D0CE292A507500C4D90E /* PFLogInView.m */, - 7C77D0CF292A507500C4D90E /* PFProductTableViewController.m */, - 7C77D0D1292A507500C4D90E /* PFSignUpViewController.m */, - 7C77D0D2292A507500C4D90E /* PFImageView.m */, - 7C77D0D3292A507500C4D90E /* PFSignUpView.h */, - 7C77D0D5292A507500C4D90E /* PFCollectionViewCell.m */, - 7C77D0D6292A507500C4D90E /* PFTableViewCell.h */, - 7C77D0D7292A507500C4D90E /* PFQueryCollectionViewController.m */, - 7C77D0D8292A507500C4D90E /* ParseUIConstants.h */, - 7C77D0D9292A507500C4D90E /* PFLogInView.h */, - 7C77D0DA292A507500C4D90E /* PFQueryTableViewController.m */, - 7C77D0DB292A507500C4D90E /* PFResources.h */, - 7C77D0DC292A507500C4D90E /* PFTextField.m */, - 7C77D0DD292A507500C4D90E /* PFLogInViewController.h */, - 7C77D0DE292A507500C4D90E /* ParseUI.h */, - 7C77D0DF292A507500C4D90E /* PFPurchaseTableViewCell.m */, - 7C77D0E1292A507500C4D90E /* PFProductTableViewController.h */, - 7C77D0E2292A507500C4D90E /* PFCollectionViewCell.h */, - 7C77D0E3292A507500C4D90E /* PFTableViewCell.m */, - 7C77D0E5292A507500C4D90E /* PFSignUpView.m */, - 7C77D0E6292A507500C4D90E /* PFImageView.h */, - 7C77D0E7292A507500C4D90E /* PFSignUpViewController.h */, - 7C77D0E8292A507500C4D90E /* PFLogInView_Private.h */, - 7C77D0E9292A507500C4D90E /* PFQueryCollectionViewController.h */, - ); - path = Source; - sourceTree = ""; - }; - 7C77D0EA292A507500C4D90E /* Internal */ = { - isa = PBXGroup; - children = ( - 7C77D246292A606800C4D90E /* Sign In With Apple */, - 7C77D0EB292A507500C4D90E /* Cells */, - 7C77D0F0292A507500C4D90E /* PFImageCache.h */, - 7C77D0F1292A507500C4D90E /* PFLocalization.m */, - 7C77D0F2292A507500C4D90E /* Extensions */, - 7C77D0FB292A507500C4D90E /* PFLocalization.h */, - 7C77D0FC292A507500C4D90E /* PFImageCache.m */, - 7C77D0FD292A507500C4D90E /* Views */, - ); - path = Internal; - sourceTree = ""; - }; - 7C77D0EB292A507500C4D90E /* Cells */ = { - isa = PBXGroup; - children = ( - 7C77D0EC292A507500C4D90E /* PFActivityIndicatorTableViewCell.m */, - 7C77D0ED292A507500C4D90E /* PFActivityIndicatorCollectionReusableView.h */, - 7C77D0EE292A507500C4D90E /* PFActivityIndicatorTableViewCell.h */, - 7C77D0EF292A507500C4D90E /* PFActivityIndicatorCollectionReusableView.m */, - ); - path = Cells; - sourceTree = ""; - }; - 7C77D0F2292A507500C4D90E /* Extensions */ = { - isa = PBXGroup; - children = ( - 7C77D0F3292A507500C4D90E /* PFColor.h */, - 7C77D0F4292A507500C4D90E /* PFImage.m */, - 7C77D0F5292A507500C4D90E /* PFUIAlertView.h */, - 7C77D0F6292A507500C4D90E /* PFRect.h */, - 7C77D0F7292A507500C4D90E /* PFUIAlertView.m */, - 7C77D0F8292A507500C4D90E /* PFImage.h */, - 7C77D0F9292A507500C4D90E /* PFColor.m */, - 7C77D0FA292A507500C4D90E /* PFRect.m */, - ); - path = Extensions; - sourceTree = ""; - }; - 7C77D0FD292A507500C4D90E /* Views */ = { - isa = PBXGroup; - children = ( - 7C77D0FE292A507500C4D90E /* Buttons */, - 7C77D107292A507500C4D90E /* PFLoadingView.h */, - 7C77D108292A507500C4D90E /* PFLoadingView.m */, - ); - path = Views; - sourceTree = ""; - }; - 7C77D0FE292A507500C4D90E /* Buttons */ = { - isa = PBXGroup; - children = ( - 7C77D0FF292A507500C4D90E /* PFDismissButton.h */, - 7C77D100292A507500C4D90E /* PFTextButton.m */, - 7C77D101292A507500C4D90E /* PFPrimaryButton.m */, - 7C77D102292A507500C4D90E /* PFActionButton.m */, - 7C77D103292A507500C4D90E /* PFTextButton.h */, - 7C77D104292A507500C4D90E /* PFDismissButton.m */, - 7C77D105292A507500C4D90E /* PFPrimaryButton.h */, - 7C77D106292A507500C4D90E /* PFActionButton.h */, - ); - path = Buttons; - sourceTree = ""; - }; - 7C77D246292A606800C4D90E /* Sign In With Apple */ = { - isa = PBXGroup; - children = ( - 7C77D0D0292A507500C4D90E /* PFAppleUtils.h */, - 7C77D0D4292A507500C4D90E /* PFAppleAuthenticationProvider.m */, - 7C77D0E0292A507500C4D90E /* PFAppleUtils.m */, - 7C77D0E4292A507500C4D90E /* PFAppleAuthenticationProvider.h */, - ); - path = "Sign In With Apple"; - sourceTree = ""; - }; - 8129E5DD1A9CB052006752BC /* Obj-C */ = { - isa = PBXGroup; - children = ( - 81472F8D1A1AB37500FD6EED /* AppDelegate.h */, - 81472F8E1A1AB37500FD6EED /* AppDelegate.m */, - 81472F8F1A1AB37500FD6EED /* PFUIDemoViewController.h */, - 81472F901A1AB37500FD6EED /* PFUIDemoViewController.m */, - 81472FA21A1AB37500FD6EED /* CustomViewControllers */, - ); - name = "Obj-C"; - sourceTree = ""; - }; - 8129E6021A9CB14E006752BC /* Swift */ = { - isa = PBXGroup; - children = ( - 8129E6081A9CB1BE006752BC /* AppDelegate.swift */, - 8129E6391A9CB320006752BC /* UIDemoViewController.swift */, - 81FC6B381A9D1ADB00104E45 /* CustomViewControllers */, - ); - name = Swift; - path = ParseUIDemo/Swift; - sourceTree = SOURCE_ROOT; - }; - 81472F621A1AB31F00FD6EED /* ParseUIDemo */ = { - isa = PBXGroup; - children = ( - BC32E14523ABAE04009BDFCD /* ParseUIDemo.entitlements */, - 81472FA31A1AB37500FD6EED /* Classes */, - 81472FA61A1AB37500FD6EED /* Other */, - 81472FAC1A1AB37500FD6EED /* Resources */, - ); - name = ParseUIDemo; - sourceTree = ""; - }; - 81472F931A1AB37500FD6EED /* SignUpViewController */ = { - isa = PBXGroup; - children = ( - 81472F911A1AB37500FD6EED /* CustomSignUpViewController.h */, - 81472F921A1AB37500FD6EED /* CustomSignUpViewController.m */, - ); - path = SignUpViewController; - sourceTree = ""; - }; - 81472F961A1AB37500FD6EED /* LogInViewController */ = { - isa = PBXGroup; - children = ( - 81472F941A1AB37500FD6EED /* CustomLogInViewController.h */, - 81472F951A1AB37500FD6EED /* CustomLogInViewController.m */, - ); - path = LogInViewController; - sourceTree = ""; - }; - 81472FA11A1AB37500FD6EED /* QueryTableViewController */ = { - isa = PBXGroup; - children = ( - F57F3D1B1B0C03BA0087F60B /* DeletionTableViewController.h */, - F57F3D1C1B0C03BA0087F60B /* DeletionTableViewController.m */, - 81472F971A1AB37500FD6EED /* SimpleTableViewController.h */, - 81472F981A1AB37500FD6EED /* SimpleTableViewController.m */, - 81472F991A1AB37500FD6EED /* PaginatedTableViewController.h */, - 81472F9A1A1AB37500FD6EED /* PaginatedTableViewController.m */, - 81472F9B1A1AB37500FD6EED /* SectionedTableViewController.h */, - 81472F9C1A1AB37500FD6EED /* SectionedTableViewController.m */, - 81472F9D1A1AB37500FD6EED /* SubtitleImageTableViewController.h */, - 81472F9E1A1AB37500FD6EED /* SubtitleImageTableViewController.m */, - 81472F9F1A1AB37500FD6EED /* CustomProductTableViewController.h */, - 81472FA01A1AB37500FD6EED /* CustomProductTableViewController.m */, - 81C8D9BB1A890BCA007B8DCF /* StoryboardTableViewController.h */, - 81C8D9BC1A890BCA007B8DCF /* StoryboardTableViewController.m */, - 814155B01A9CD9CA002D9683 /* SimpleQueryTableStoryboard.storyboard */, - ); - path = QueryTableViewController; - sourceTree = ""; - }; - 81472FA21A1AB37500FD6EED /* CustomViewControllers */ = { - isa = PBXGroup; - children = ( - 81472F931A1AB37500FD6EED /* SignUpViewController */, - 81472F961A1AB37500FD6EED /* LogInViewController */, - 81472FA11A1AB37500FD6EED /* QueryTableViewController */, - 81C5993C1A64344800F574E8 /* QueryCollectionViewController */, - ); - path = CustomViewControllers; - sourceTree = ""; - }; - 81472FA31A1AB37500FD6EED /* Classes */ = { - isa = PBXGroup; - children = ( - 8129E6021A9CB14E006752BC /* Swift */, - 8129E5DD1A9CB052006752BC /* Obj-C */, - ); - name = Classes; - path = ParseUIDemo/Classes; - sourceTree = ""; - }; - 81472FA61A1AB37500FD6EED /* Other */ = { - isa = PBXGroup; - children = ( - 81472FA41A1AB37500FD6EED /* Info.plist */, - 81472FA51A1AB37500FD6EED /* main.m */, - ); - name = Other; - path = ParseUIDemo/Other; - sourceTree = ""; - }; - 81472FAC1A1AB37500FD6EED /* Resources */ = { - isa = PBXGroup; - children = ( - 81472FA71A1AB37500FD6EED /* Images.xcassets */, - 81472FA81A1AB37500FD6EED /* Icon.png */, - 81472FA91A1AB37500FD6EED /* 0.png */, - 81472FAA1A1AB37500FD6EED /* 1.png */, - 81472FAB1A1AB37500FD6EED /* 2.png */, - ); - name = Resources; - path = ParseUIDemo/Resources; - sourceTree = ""; - }; - 81C5993C1A64344800F574E8 /* QueryCollectionViewController */ = { - isa = PBXGroup; - children = ( - F57F3D1F1B0C03C90087F60B /* DeletionCollectionViewController.h */, - F57F3D201B0C03C90087F60B /* DeletionCollectionViewController.m */, - 81C5993D1A64346000F574E8 /* SimpleCollectionViewController.h */, - 81C5993E1A64346000F574E8 /* SimpleCollectionViewController.m */, - 81C599401A6454C900F574E8 /* PaginatedCollectionViewController.h */, - 81C599411A6454C900F574E8 /* PaginatedCollectionViewController.m */, - 81C599471A64636200F574E8 /* SectionedCollectionViewController.h */, - 81C599481A64636200F574E8 /* SectionedCollectionViewController.m */, - 819A4B381A6808EA00D01241 /* SubtitleImageCollectionViewController.h */, - 819A4B391A6808EA00D01241 /* SubtitleImageCollectionViewController.m */, - 812E5C021A7A8EFB000FBDE1 /* StoryboardCollectionViewController.h */, - 812E5C031A7A8EFB000FBDE1 /* StoryboardCollectionViewController.m */, - 812E5C001A7A8EB4000FBDE1 /* SimpleQueryCollectionStoryboard.storyboard */, - ); - path = QueryCollectionViewController; - sourceTree = ""; - }; - 81FC6B381A9D1ADB00104E45 /* CustomViewControllers */ = { - isa = PBXGroup; - children = ( - 81FC6B391A9D1ADB00104E45 /* LogInViewController */, - 81FC6B481A9D1ADB00104E45 /* SignUpViewController */, - 81FC6B571A9D1BFC00104E45 /* QueryTableViewController */, - 81FC6B661A9D1CE900104E45 /* QueryCollectionViewController */, - 81FC6B731A9D1D4700104E45 /* ProductTableViewController */, - ); - path = CustomViewControllers; - sourceTree = ""; - }; - 81FC6B391A9D1ADB00104E45 /* LogInViewController */ = { - isa = PBXGroup; - children = ( - 81FC6B3A1A9D1ADB00104E45 /* CustomLogInViewController.swift */, - ); - path = LogInViewController; - sourceTree = ""; - }; - 81FC6B481A9D1ADB00104E45 /* SignUpViewController */ = { - isa = PBXGroup; - children = ( - 81FC6B491A9D1ADB00104E45 /* CustomSignUpViewController.swift */, - ); - path = SignUpViewController; - sourceTree = ""; - }; - 81FC6B571A9D1BFC00104E45 /* QueryTableViewController */ = { - isa = PBXGroup; - children = ( - F57F3D251B0C04EF0087F60B /* DeletionTableViewController.swift */, - 81FC6B5B1A9D1BFC00104E45 /* SimpleTableViewController.swift */, - 81FC6B591A9D1BFC00104E45 /* PaginatedTableViewController.swift */, - 81FC6B5A1A9D1BFC00104E45 /* SectionedTableViewController.swift */, - 81FC6B5C1A9D1BFC00104E45 /* StoryboardTableViewController.swift */, - 81FC6B5D1A9D1BFC00104E45 /* SubtitleImageTableViewController.swift */, - 81FC6B641A9D1C2000104E45 /* SimpleQueryTableStoryboard-Swift.storyboard */, - ); - path = QueryTableViewController; - sourceTree = ""; - }; - 81FC6B661A9D1CE900104E45 /* QueryCollectionViewController */ = { - isa = PBXGroup; - children = ( - F57F3D281B0C05280087F60B /* DeletionCollectionViewController.swift */, - 81FC6B691A9D1CE900104E45 /* SimpleCollectionViewController.swift */, - 81FC6B671A9D1CE900104E45 /* PaginatedCollectionViewController.swift */, - 81FC6B681A9D1CE900104E45 /* SectionedCollectionViewController.swift */, - 81FC6B6A1A9D1CE900104E45 /* StoryboardCollectionViewController.swift */, - 81FC6B6B1A9D1CE900104E45 /* SubtitleImageCollectionViewController.swift */, - 81FC6B711A9D1CFD00104E45 /* SimpleQueryCollectionStoryboard-Swift.storyboard */, - ); - path = QueryCollectionViewController; - sourceTree = ""; - }; - 81FC6B731A9D1D4700104E45 /* ProductTableViewController */ = { - isa = PBXGroup; - children = ( - 81FC6B741A9D1D4700104E45 /* CustomProductTableViewController.swift */, - ); - path = ProductTableViewController; - sourceTree = ""; - }; - BCCBE8CA23BFB89D0044A79C /* SignInWithAppleTests */ = { - isa = PBXGroup; - children = ( - BCCBE8CB23BFB89D0044A79C /* SignInWithAppleTests.m */, - BCCBE8CD23BFB89D0044A79C /* Info.plist */, - ); - path = SignInWithAppleTests; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 4A0ECC02200D8C0200BA84A3 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D150292A510400C4D90E /* PFPurchaseTableViewCell.h in Headers */, - 7C77D151292A510400C4D90E /* PFTextField.h in Headers */, - 7C77D152292A510400C4D90E /* PFQueryTableViewController.h in Headers */, - 7C77D153292A510400C4D90E /* PFAppleUtils.h in Headers */, - 7C77D154292A510400C4D90E /* PFSignUpView.h in Headers */, - 7C77D155292A510400C4D90E /* PFTableViewCell.h in Headers */, - 7C77D156292A510400C4D90E /* ParseUIConstants.h in Headers */, - 7C77D157292A510400C4D90E /* PFLogInView.h in Headers */, - 7C77D158292A510400C4D90E /* PFResources.h in Headers */, - 7C77D159292A510400C4D90E /* PFLogInViewController.h in Headers */, - 7C77D15A292A510400C4D90E /* ParseUI.h in Headers */, - 7C77D15B292A510400C4D90E /* PFProductTableViewController.h in Headers */, - 7C77D15C292A510400C4D90E /* PFCollectionViewCell.h in Headers */, - 7C77D15D292A510400C4D90E /* PFAppleAuthenticationProvider.h in Headers */, - 7C77D15E292A510400C4D90E /* PFImageView.h in Headers */, - 7C77D15F292A510400C4D90E /* PFSignUpViewController.h in Headers */, - 7C77D160292A510400C4D90E /* PFLogInView_Private.h in Headers */, - 7C77D161292A510400C4D90E /* PFQueryCollectionViewController.h in Headers */, - 7C77D163292A511000C4D90E /* PFActivityIndicatorCollectionReusableView.h in Headers */, - 7C77D164292A511000C4D90E /* PFActivityIndicatorTableViewCell.h in Headers */, - 7C77D165292A511000C4D90E /* PFImageCache.h in Headers */, - 7C77D166292A511000C4D90E /* PFColor.h in Headers */, - 7C77D167292A511000C4D90E /* PFUIAlertView.h in Headers */, - 7C77D168292A511000C4D90E /* PFRect.h in Headers */, - 7C77D169292A511000C4D90E /* PFImage.h in Headers */, - 7C77D16A292A511000C4D90E /* PFLocalization.h in Headers */, - 7C77D16B292A511000C4D90E /* PFDismissButton.h in Headers */, - 7C77D16C292A511000C4D90E /* PFTextButton.h in Headers */, - 7C77D16D292A511000C4D90E /* PFPrimaryButton.h in Headers */, - 7C77D16E292A511000C4D90E /* PFActionButton.h in Headers */, - 7C77D16F292A511000C4D90E /* PFLoadingView.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4A9A9494200D0329005D8F4B /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D109292A509000C4D90E /* PFPurchaseTableViewCell.h in Headers */, - 7C77D10A292A509000C4D90E /* PFTextField.h in Headers */, - 7C77D10B292A509000C4D90E /* PFQueryTableViewController.h in Headers */, - 7C77D10C292A509000C4D90E /* PFAppleUtils.h in Headers */, - 7C77D10D292A509000C4D90E /* PFSignUpView.h in Headers */, - 7C77D10E292A509000C4D90E /* PFTableViewCell.h in Headers */, - 7C77D10F292A509000C4D90E /* ParseUIConstants.h in Headers */, - 7C77D110292A509000C4D90E /* PFLogInView.h in Headers */, - 7C77D111292A509000C4D90E /* PFResources.h in Headers */, - 7C77D112292A509000C4D90E /* PFLogInViewController.h in Headers */, - 7C77D113292A509000C4D90E /* ParseUI.h in Headers */, - 7C77D114292A509000C4D90E /* PFProductTableViewController.h in Headers */, - 7C77D115292A509000C4D90E /* PFCollectionViewCell.h in Headers */, - 7C77D116292A509000C4D90E /* PFAppleAuthenticationProvider.h in Headers */, - 7C77D117292A509000C4D90E /* PFImageView.h in Headers */, - 7C77D118292A509000C4D90E /* PFSignUpViewController.h in Headers */, - 7C77D119292A509000C4D90E /* PFLogInView_Private.h in Headers */, - 7C77D11A292A509000C4D90E /* PFQueryCollectionViewController.h in Headers */, - 7C77D11C292A509D00C4D90E /* PFActivityIndicatorCollectionReusableView.h in Headers */, - 7C77D11D292A509D00C4D90E /* PFActivityIndicatorTableViewCell.h in Headers */, - 7C77D11E292A509D00C4D90E /* PFImageCache.h in Headers */, - 7C77D11F292A509D00C4D90E /* PFColor.h in Headers */, - 7C77D120292A509D00C4D90E /* PFUIAlertView.h in Headers */, - 7C77D121292A509D00C4D90E /* PFRect.h in Headers */, - 7C77D122292A509D00C4D90E /* PFImage.h in Headers */, - 7C77D123292A509D00C4D90E /* PFLocalization.h in Headers */, - 7C77D124292A509D00C4D90E /* PFDismissButton.h in Headers */, - 7C77D125292A509D00C4D90E /* PFTextButton.h in Headers */, - 7C77D126292A509D00C4D90E /* PFPrimaryButton.h in Headers */, - 7C77D127292A509D00C4D90E /* PFActionButton.h in Headers */, - 7C77D128292A509D00C4D90E /* PFLoadingView.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 4A0ECBE4200D8C0200BA84A3 /* ParseUI-Dynamic */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4A0ECC21200D8C0200BA84A3 /* Build configuration list for PBXNativeTarget "ParseUI-Dynamic" */; - buildPhases = ( - 4A0ECBE5200D8C0200BA84A3 /* Sources */, - 4A0ECC00200D8C0200BA84A3 /* Frameworks */, - 4A0ECC02200D8C0200BA84A3 /* Headers */, - 4A0ECC20200D8C0200BA84A3 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "ParseUI-Dynamic"; - packageProductDependencies = ( - 6B63F15F2BC34E4A00F89DEE /* ParseObjC */, - ); - productName = ParseUI; - productReference = 7C77D162292A510400C4D90E /* ParseUI.framework */; - productType = "com.apple.product-type.framework"; - }; - 4A9A9496200D0329005D8F4B /* ParseUI */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4A9A949C200D0329005D8F4B /* Build configuration list for PBXNativeTarget "ParseUI" */; - buildPhases = ( - 4A9A9492200D0329005D8F4B /* Sources */, - 4A9A9493200D0329005D8F4B /* Frameworks */, - 4A9A9494200D0329005D8F4B /* Headers */, - 4A9A9495200D0329005D8F4B /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ParseUI; - packageProductDependencies = ( - 39E249A42AD1DD2E0014357C /* ParseObjC */, - ); - productName = ParseUI; - productReference = 7C77D22D292A604700C4D90E /* ParseUI.framework */; - productType = "com.apple.product-type.framework"; - }; - 8129E5DE1A9CB067006752BC /* ParseUIDemo-Swift */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8129E5FD1A9CB067006752BC /* Build configuration list for PBXNativeTarget "ParseUIDemo-Swift" */; - buildPhases = ( - 8129E5E01A9CB067006752BC /* Sources */, - 8129E5F11A9CB067006752BC /* Frameworks */, - 8129E5F41A9CB067006752BC /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "ParseUIDemo-Swift"; - packageProductDependencies = ( - 39452DF72AD9121D0066C2AE /* ParseObjC */, - 39452DF92AD9121D0066C2AE /* ParseUI */, - 39452DFC2AD914110066C2AE /* BoltsSwift */, - ); - productName = ParseUIDemo; - productReference = 7C77D22F292A604700C4D90E /* ParseUIDemo-Swift.app */; - productType = "com.apple.product-type.application"; - }; - 81472F661A1AB33800FD6EED /* ParseUIDemo */ = { - isa = PBXNativeTarget; - buildConfigurationList = 81472F871A1AB33800FD6EED /* Build configuration list for PBXNativeTarget "ParseUIDemo" */; - buildPhases = ( - 81472F631A1AB33800FD6EED /* Sources */, - 81472F641A1AB33800FD6EED /* Frameworks */, - 81472F651A1AB33800FD6EED /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 39452DF62AD911740066C2AE /* PBXTargetDependency */, - ); - name = ParseUIDemo; - packageProductDependencies = ( - 6B63F1652BC3508200F89DEE /* ParseObjC */, - ); - productName = ParseUIDemo; - productReference = 7C77D21F292A56F600C4D90E /* ParseUIDemo.app */; - productType = "com.apple.product-type.application"; - }; - BCCBE8C823BFB89D0044A79C /* SignInWithAppleTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = BCCBE8D123BFB89D0044A79C /* Build configuration list for PBXNativeTarget "SignInWithAppleTests" */; - buildPhases = ( - BCCBE8C523BFB89D0044A79C /* Sources */, - BCCBE8C623BFB89D0044A79C /* Frameworks */, - BCCBE8C723BFB89D0044A79C /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 39452DF22AD910490066C2AE /* PBXTargetDependency */, - ); - name = SignInWithAppleTests; - packageProductDependencies = ( - 39E22AD62AD0676700D9AE5C /* OCMock */, - 39452DEB2AD8FC110066C2AE /* ParseObjC */, - ); - productName = SignInWithAppleTests; - productReference = 7C77D230292A604700C4D90E /* SignInWithAppleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - attributes = { - CLASSPREFIX = PF; - DefaultBuildSystemTypeForWorkspace = Original; - LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 1130; - ORGANIZATIONNAME = "Parse Inc."; - TargetAttributes = { - 4A0ECBE4200D8C0200BA84A3 = { - ProvisioningStyle = Automatic; - }; - 4A9A9496200D0329005D8F4B = { - CreatedOnToolsVersion = 9.2; - ProvisioningStyle = Automatic; - }; - 81472F661A1AB33800FD6EED = { - CreatedOnToolsVersion = 6.1; - }; - BCCBE8C823BFB89D0044A79C = { - CreatedOnToolsVersion = 11.3; - ProvisioningStyle = Automatic; - TestTargetID = 81472F661A1AB33800FD6EED; - }; - }; - }; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseUI" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 1; - knownRegions = ( - da, - de, - es, - fr, - it, - ja, - nl, - no, - sl, - sv, - tr, - en, - Base, - he, - "pt-BR", - ); - mainGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; - packageReferences = ( - 39E22AD52AD0676700D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */, - 39452DFB2AD914110066C2AE /* XCRemoteSwiftPackageReference "Bolts-Swift" */, - ); - productRefGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 81472F661A1AB33800FD6EED /* ParseUIDemo */, - 8129E5DE1A9CB067006752BC /* ParseUIDemo-Swift */, - 4A9A9496200D0329005D8F4B /* ParseUI */, - 4A0ECBE4200D8C0200BA84A3 /* ParseUI-Dynamic */, - BCCBE8C823BFB89D0044A79C /* SignInWithAppleTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 4A0ECC20200D8C0200BA84A3 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4A9A9495200D0329005D8F4B /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8129E5F41A9CB067006752BC /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8129E5F51A9CB067006752BC /* Images.xcassets in Resources */, - 8129E5F71A9CB067006752BC /* 0.png in Resources */, - 81FC6B651A9D1C2000104E45 /* SimpleQueryTableStoryboard-Swift.storyboard in Resources */, - 8129E5F81A9CB067006752BC /* 1.png in Resources */, - 8129E5F91A9CB067006752BC /* 2.png in Resources */, - 8129E5FA1A9CB067006752BC /* SimpleQueryCollectionStoryboard.storyboard in Resources */, - 81FC6B721A9D1CFD00104E45 /* SimpleQueryCollectionStoryboard-Swift.storyboard in Resources */, - 8129E5FB1A9CB067006752BC /* Icon.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81472F651A1AB33800FD6EED /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 81472FBC1A1AB37500FD6EED /* Images.xcassets in Resources */, - 814155B11A9CD9CA002D9683 /* SimpleQueryTableStoryboard.storyboard in Resources */, - 81472FBE1A1AB37500FD6EED /* 0.png in Resources */, - 81472FBF1A1AB37500FD6EED /* 1.png in Resources */, - 81472FC01A1AB37500FD6EED /* 2.png in Resources */, - 812E5C011A7A8EB4000FBDE1 /* SimpleQueryCollectionStoryboard.storyboard in Resources */, - 81472FBD1A1AB37500FD6EED /* Icon.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - BCCBE8C723BFB89D0044A79C /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 4A0ECBE5200D8C0200BA84A3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D170292A511C00C4D90E /* PFLogInViewController.m in Sources */, - 7C77D171292A511C00C4D90E /* PFResources.m in Sources */, - 7C77D172292A511C00C4D90E /* PFLogInView.m in Sources */, - 7C77D173292A511C00C4D90E /* PFProductTableViewController.m in Sources */, - 7C77D174292A511C00C4D90E /* PFSignUpViewController.m in Sources */, - 7C77D175292A511C00C4D90E /* PFImageView.m in Sources */, - 7C77D176292A511C00C4D90E /* PFAppleAuthenticationProvider.m in Sources */, - 7C77D177292A511C00C4D90E /* PFCollectionViewCell.m in Sources */, - 7C77D178292A511C00C4D90E /* PFQueryCollectionViewController.m in Sources */, - 7C77D179292A511C00C4D90E /* PFQueryTableViewController.m in Sources */, - 7C77D17A292A511C00C4D90E /* PFTextField.m in Sources */, - 7C77D17B292A511C00C4D90E /* PFPurchaseTableViewCell.m in Sources */, - 7C77D17C292A511C00C4D90E /* PFAppleUtils.m in Sources */, - 7C77D17D292A511C00C4D90E /* PFTableViewCell.m in Sources */, - 7C77D17E292A511C00C4D90E /* PFSignUpView.m in Sources */, - 7C77D17F292A511C00C4D90E /* PFActivityIndicatorTableViewCell.m in Sources */, - 7C77D180292A511C00C4D90E /* PFActivityIndicatorCollectionReusableView.m in Sources */, - 7C77D181292A511C00C4D90E /* PFLocalization.m in Sources */, - 7C77D182292A511C00C4D90E /* PFImage.m in Sources */, - 7C77D183292A511C00C4D90E /* PFUIAlertView.m in Sources */, - 7C77D184292A511C00C4D90E /* PFColor.m in Sources */, - 7C77D185292A511C00C4D90E /* PFRect.m in Sources */, - 7C77D186292A511C00C4D90E /* PFImageCache.m in Sources */, - 7C77D187292A511C00C4D90E /* PFTextButton.m in Sources */, - 7C77D188292A511C00C4D90E /* PFPrimaryButton.m in Sources */, - 7C77D189292A511C00C4D90E /* PFActionButton.m in Sources */, - 7C77D18A292A511C00C4D90E /* PFDismissButton.m in Sources */, - 7C77D18B292A511C00C4D90E /* PFLoadingView.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4A9A9492200D0329005D8F4B /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D18C292A512300C4D90E /* PFLogInViewController.m in Sources */, - 7C77D18D292A512300C4D90E /* PFResources.m in Sources */, - 7C77D18E292A512300C4D90E /* PFLogInView.m in Sources */, - 7C77D18F292A512300C4D90E /* PFProductTableViewController.m in Sources */, - 7C77D190292A512300C4D90E /* PFSignUpViewController.m in Sources */, - 7C77D191292A512300C4D90E /* PFImageView.m in Sources */, - 7C77D192292A512300C4D90E /* PFAppleAuthenticationProvider.m in Sources */, - 7C77D193292A512300C4D90E /* PFCollectionViewCell.m in Sources */, - 7C77D194292A512300C4D90E /* PFQueryCollectionViewController.m in Sources */, - 7C77D195292A512300C4D90E /* PFQueryTableViewController.m in Sources */, - 7C77D196292A512300C4D90E /* PFTextField.m in Sources */, - 7C77D197292A512300C4D90E /* PFPurchaseTableViewCell.m in Sources */, - 7C77D198292A512300C4D90E /* PFAppleUtils.m in Sources */, - 7C77D199292A512300C4D90E /* PFTableViewCell.m in Sources */, - 7C77D19A292A512300C4D90E /* PFSignUpView.m in Sources */, - 7C77D19B292A512300C4D90E /* PFActivityIndicatorTableViewCell.m in Sources */, - 7C77D19C292A512300C4D90E /* PFActivityIndicatorCollectionReusableView.m in Sources */, - 7C77D19D292A512300C4D90E /* PFLocalization.m in Sources */, - 7C77D19E292A512300C4D90E /* PFImage.m in Sources */, - 7C77D19F292A512300C4D90E /* PFUIAlertView.m in Sources */, - 7C77D1A0292A512300C4D90E /* PFColor.m in Sources */, - 7C77D1A1292A512300C4D90E /* PFRect.m in Sources */, - 7C77D1A2292A512300C4D90E /* PFImageCache.m in Sources */, - 7C77D1A3292A512300C4D90E /* PFTextButton.m in Sources */, - 7C77D1A4292A512300C4D90E /* PFPrimaryButton.m in Sources */, - 7C77D1A5292A512300C4D90E /* PFActionButton.m in Sources */, - 7C77D1A6292A512300C4D90E /* PFDismissButton.m in Sources */, - 7C77D1A7292A512300C4D90E /* PFLoadingView.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8129E5E01A9CB067006752BC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 81FC6B4A1A9D1ADB00104E45 /* CustomLogInViewController.swift in Sources */, - 81FC6B601A9D1BFC00104E45 /* SectionedTableViewController.swift in Sources */, - 81FC6B5F1A9D1BFC00104E45 /* PaginatedTableViewController.swift in Sources */, - 81FC6B611A9D1BFC00104E45 /* SimpleTableViewController.swift in Sources */, - F57F3D291B0C05280087F60B /* DeletionCollectionViewController.swift in Sources */, - 81FC6B6E1A9D1CE900104E45 /* SimpleCollectionViewController.swift in Sources */, - F57F3D271B0C050C0087F60B /* DeletionTableViewController.swift in Sources */, - 81FC6B6D1A9D1CE900104E45 /* SectionedCollectionViewController.swift in Sources */, - 81FC6B561A9D1ADB00104E45 /* CustomSignUpViewController.swift in Sources */, - 81FC6B621A9D1BFC00104E45 /* StoryboardTableViewController.swift in Sources */, - 81FC6B751A9D1D4700104E45 /* CustomProductTableViewController.swift in Sources */, - 81FC6B6C1A9D1CE900104E45 /* PaginatedCollectionViewController.swift in Sources */, - 81FC6B6F1A9D1CE900104E45 /* StoryboardCollectionViewController.swift in Sources */, - 81FC6B701A9D1CE900104E45 /* SubtitleImageCollectionViewController.swift in Sources */, - 8129E6091A9CB1BE006752BC /* AppDelegate.swift in Sources */, - 8129E63A1A9CB320006752BC /* UIDemoViewController.swift in Sources */, - 81FC6B631A9D1BFC00104E45 /* SubtitleImageTableViewController.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81472F631A1AB33800FD6EED /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 81C5993F1A64346000F574E8 /* SimpleCollectionViewController.m in Sources */, - 81472FBB1A1AB37500FD6EED /* main.m in Sources */, - 81C599421A6454C900F574E8 /* PaginatedCollectionViewController.m in Sources */, - 81472FB31A1AB37500FD6EED /* CustomSignUpViewController.m in Sources */, - 81472FB41A1AB37500FD6EED /* CustomLogInViewController.m in Sources */, - 81472FB91A1AB37500FD6EED /* CustomProductTableViewController.m in Sources */, - 819A4B3A1A6808EA00D01241 /* SubtitleImageCollectionViewController.m in Sources */, - F57F3D241B0C03DB0087F60B /* DeletionTableViewController.m in Sources */, - 812E5C041A7A8EFB000FBDE1 /* StoryboardCollectionViewController.m in Sources */, - 81472FB51A1AB37500FD6EED /* SimpleTableViewController.m in Sources */, - F57F3D231B0C03D40087F60B /* DeletionCollectionViewController.m in Sources */, - 81472FB61A1AB37500FD6EED /* PaginatedTableViewController.m in Sources */, - 81C8D9BD1A890BCA007B8DCF /* StoryboardTableViewController.m in Sources */, - 81472FB71A1AB37500FD6EED /* SectionedTableViewController.m in Sources */, - 81472FB11A1AB37500FD6EED /* AppDelegate.m in Sources */, - 81472FB21A1AB37500FD6EED /* PFUIDemoViewController.m in Sources */, - 81C599491A64636200F574E8 /* SectionedCollectionViewController.m in Sources */, - 81472FB81A1AB37500FD6EED /* SubtitleImageTableViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - BCCBE8C523BFB89D0044A79C /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BCA5CC8523BFCFB8003BC0A0 /* SignInWithAppleTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 39452DF22AD910490066C2AE /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 81472F661A1AB33800FD6EED /* ParseUIDemo */; - targetProxy = 39452DF12AD910490066C2AE /* PBXContainerItemProxy */; - }; - 39452DF62AD911740066C2AE /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4A9A9496200D0329005D8F4B /* ParseUI */; - targetProxy = 39452DF52AD911740066C2AE /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 7C77D0C1292A507500C4D90E /* ParseUI.strings */ = { - isa = PBXVariantGroup; - children = ( - 7C77D0C2292A507500C4D90E /* de */, - 7C77D0C3292A507500C4D90E /* he */, - 7C77D0C4292A507500C4D90E /* en */, - 7C77D0C5292A507500C4D90E /* sv */, - 7C77D0C6292A507500C4D90E /* pt-BR */, - 7C77D0C7292A507500C4D90E /* fr */, - ); - name = ParseUI.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4A9A948E200D02CE005D8F4B /* Debug.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_SHADOW = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNKNOWN_PRAGMAS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_LABEL = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = ( - "$(value)", - "$(SANITIZE_FLAGS)", - "-Wl,-undefined,dynamic_lookup", - ); - SDKROOT = iphoneos; - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4A9A948F200D02CE005D8F4B /* Release.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = NO; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_SHADOW = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNKNOWN_PRAGMAS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_LABEL = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - }; - name = Release; - }; - 4A0ECC22200D8C0200BA84A3 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4A9A9491200D02CE005D8F4B /* ParseUI-iOS-Dynamic.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_MODULES_AUTOLINK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_ENABLE_DEBUG_INFO = YES; - SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 4A0ECC23200D8C0200BA84A3 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4A9A9491200D02CE005D8F4B /* ParseUI-iOS-Dynamic.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_MODULES_AUTOLINK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_ENABLE_DEBUG_INFO = NO; - ONLY_ACTIVE_ARCH = YES; - SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 4A9A949D200D0329005D8F4B /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4A9A9480200D02CE005D8F4B /* ParseUI-iOS.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)", - "$(PROJECT_DIR)", - ); - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_ENABLE_DEBUG_INFO = YES; - SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 4A9A949E200D0329005D8F4B /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4A9A9480200D02CE005D8F4B /* ParseUI-iOS.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)", - "$(PROJECT_DIR)", - ); - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_ENABLE_DEBUG_INFO = NO; - ONLY_ACTIVE_ARCH = YES; - SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 8129E5FE1A9CB067006752BC /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)", - "$(PROJECT_DIR)", - ); - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.parse.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "ParseUIDemo-Swift"; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 8129E5FF1A9CB067006752BC /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)", - "$(PROJECT_DIR)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.parse.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "ParseUIDemo-Swift"; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 81472F881A1AB33800FD6EED /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_ENTITLEMENTS = ParseUIDemo/ParseUIDemo.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = ""; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)", - "$(PROJECT_DIR)", - ); - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - /usr/lib/swift, - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.parse.ParseUIDemo; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 81472F891A1AB33800FD6EED /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_ENTITLEMENTS = ParseUIDemo/ParseUIDemo.entitlements; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)", - "$(PROJECT_DIR)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - /usr/lib/swift, - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.parse.ParseUIDemo; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - BCCBE8D223BFB89D0044A79C /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INFOPLIST_FILE = SignInWithAppleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.2; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.parseplatform.SignInWithAppleTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ParseUIDemo.app/ParseUIDemo"; - }; - name = Debug; - }; - BCCBE8D323BFB89D0044A79C /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INFOPLIST_FILE = SignInWithAppleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.2; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.parseplatform.SignInWithAppleTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ParseUIDemo.app/ParseUIDemo"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseUI" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 1DEB922408733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4A0ECC21200D8C0200BA84A3 /* Build configuration list for PBXNativeTarget "ParseUI-Dynamic" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4A0ECC22200D8C0200BA84A3 /* Debug */, - 4A0ECC23200D8C0200BA84A3 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4A9A949C200D0329005D8F4B /* Build configuration list for PBXNativeTarget "ParseUI" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4A9A949D200D0329005D8F4B /* Debug */, - 4A9A949E200D0329005D8F4B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 8129E5FD1A9CB067006752BC /* Build configuration list for PBXNativeTarget "ParseUIDemo-Swift" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8129E5FE1A9CB067006752BC /* Debug */, - 8129E5FF1A9CB067006752BC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 81472F871A1AB33800FD6EED /* Build configuration list for PBXNativeTarget "ParseUIDemo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 81472F881A1AB33800FD6EED /* Debug */, - 81472F891A1AB33800FD6EED /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - BCCBE8D123BFB89D0044A79C /* Build configuration list for PBXNativeTarget "SignInWithAppleTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BCCBE8D223BFB89D0044A79C /* Debug */, - BCCBE8D323BFB89D0044A79C /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - -/* Begin XCRemoteSwiftPackageReference section */ - 39452DFB2AD914110066C2AE /* XCRemoteSwiftPackageReference "Bolts-Swift" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/BoltsFramework/Bolts-Swift.git"; - requirement = { - kind = exactVersion; - version = 1.5.0; - }; - }; - 39E22AD52AD0676700D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/erikdoe/ocmock"; - requirement = { - kind = revision; - revision = 67bb9602f0a7541f24dc2d6d0d7389ca3e4c2c89; - }; - }; -/* End XCRemoteSwiftPackageReference section */ - -/* Begin XCSwiftPackageProductDependency section */ - 39452DEB2AD8FC110066C2AE /* ParseObjC */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseObjC; - }; - 39452DF72AD9121D0066C2AE /* ParseObjC */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseObjC; - }; - 39452DF92AD9121D0066C2AE /* ParseUI */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseUI; - }; - 39452DFC2AD914110066C2AE /* BoltsSwift */ = { - isa = XCSwiftPackageProductDependency; - package = 39452DFB2AD914110066C2AE /* XCRemoteSwiftPackageReference "Bolts-Swift" */; - productName = BoltsSwift; - }; - 39E22AD62AD0676700D9AE5C /* OCMock */ = { - isa = XCSwiftPackageProductDependency; - package = 39E22AD52AD0676700D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */; - productName = OCMock; - }; - 39E249A42AD1DD2E0014357C /* ParseObjC */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseObjC; - }; - 6B63F15F2BC34E4A00F89DEE /* ParseObjC */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseObjC; - }; - 6B63F1652BC3508200F89DEE /* ParseObjC */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseObjC; - }; -/* End XCSwiftPackageProductDependency section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/ParseUI/ParseUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ParseUI/ParseUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a62..000000000 --- a/ParseUI/ParseUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ParseUI/ParseUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ParseUI/ParseUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/ParseUI/ParseUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI-Dynamic.xcscheme b/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI-Dynamic.xcscheme deleted file mode 100644 index c75f54261..000000000 --- a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI-Dynamic.xcscheme +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI.xcscheme b/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI.xcscheme deleted file mode 100644 index a3eb8e73b..000000000 --- a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI.xcscheme +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo-Swift.xcscheme b/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo-Swift.xcscheme deleted file mode 100644 index 0daea4b72..000000000 --- a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo-Swift.xcscheme +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo.xcscheme b/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo.xcscheme deleted file mode 100644 index bbbccb69b..000000000 --- a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo.xcscheme +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorCollectionReusableView.h b/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorCollectionReusableView.h deleted file mode 100644 index 44004498b..000000000 --- a/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorCollectionReusableView.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -/** - The `PFActivityIndicatorCollectionReusableView` class represents a collection footer - that has a simple text label and displays UIActivityIndicatorView if property is set to `YES`. - An instance of this class is used as a default next page button inside . - */ -@interface PFActivityIndicatorCollectionReusableView : UICollectionReusableView - -@property (nonatomic, strong, readonly) UILabel *textLabel; - -@property (nonatomic, assign, getter=isAnimating) BOOL animating; - -- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents; -- (void)removeTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents; - -@end diff --git a/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorCollectionReusableView.m b/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorCollectionReusableView.m deleted file mode 100644 index 3385edd81..000000000 --- a/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorCollectionReusableView.m +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFActivityIndicatorCollectionReusableView.h" - -#import "PFRect.h" - -@interface PFActivityIndicatorCollectionReusableView () { - UIActivityIndicatorView *_activityIndicator; - UIButton *_actionButton; -} - -@end - -@implementation PFActivityIndicatorCollectionReusableView - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (!self) return nil; - - _actionButton = [UIButton buttonWithType:UIButtonTypeCustom]; - _actionButton.backgroundColor = self.backgroundColor; - [self addSubview:_actionButton]; - - _textLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - _textLabel.numberOfLines = 0; - _textLabel.textAlignment = NSTextAlignmentCenter; - [self addSubview:_textLabel]; - - _activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; - _activityIndicator.hidesWhenStopped = YES; - [self addSubview:_activityIndicator]; - - return self; -} - -#pragma mark - -#pragma mark Dealloc - -- (void)dealloc { - [self removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; -} - -#pragma mark - -#pragma mark UIView - -- (void)setBackgroundColor:(UIColor *)backgroundColor { - [super setBackgroundColor:backgroundColor]; - _actionButton.backgroundColor = backgroundColor; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - - const CGRect bounds = self.bounds; - - _actionButton.frame = bounds; - - _textLabel.frame = PFRectMakeWithSizeCenteredInRect([_textLabel sizeThatFits:bounds.size], bounds); - _activityIndicator.frame = PFRectMakeWithSizeCenteredInRect([_activityIndicator sizeThatFits:bounds.size], bounds); -} - -#pragma mark - -#pragma mark Accessors - -- (void)setAnimating:(BOOL)animating { - if (self.animating != animating) { - - if (animating) { - [_activityIndicator startAnimating]; - _textLabel.alpha = 0.0f; - } else { - [_activityIndicator stopAnimating]; - _textLabel.alpha = 1.0f; - } - } -} - -- (BOOL)isAnimating { - return [_activityIndicator isAnimating]; -} - -#pragma mark - -#pragma mark Actions - -- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents { - [_actionButton addTarget:target action:action forControlEvents:controlEvents]; -} - -- (void)removeTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents { - [_actionButton removeTarget:target action:action forControlEvents:controlEvents]; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorTableViewCell.h b/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorTableViewCell.h deleted file mode 100644 index 5d7890642..000000000 --- a/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorTableViewCell.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -#if __has_include() -#import -#else -#import "PFTableViewCell.h" -#endif - -/** - The `PFActivityIndicatorTableViewCell` class represents a table view cell - that displays UIActivityIndicatorView as the accessory view. - */ -@interface PFActivityIndicatorTableViewCell : PFTableViewCell - -@property (nonatomic, assign, getter=isAnimating) BOOL animating; - -@end diff --git a/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorTableViewCell.m b/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorTableViewCell.m deleted file mode 100644 index b825bd15c..000000000 --- a/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorTableViewCell.m +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFActivityIndicatorTableViewCell.h" - -@interface PFActivityIndicatorTableViewCell () - -@property (nonatomic, strong) UIActivityIndicatorView *activityIndicator; - -@end - -@implementation PFActivityIndicatorTableViewCell - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier -{ - self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; - if (self) { - _activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; - _activityIndicator.hidesWhenStopped = YES; - self.accessoryView = _activityIndicator; - } - return self; -} - -#pragma mark - -#pragma mark Accessors - -- (void)setAnimating:(BOOL)animating { - if (self.animating != animating) { - - if (animating) { - [_activityIndicator startAnimating]; - } else { - [_activityIndicator stopAnimating]; - } - } -} - -- (BOOL)isAnimating { - return [_activityIndicator isAnimating]; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Extensions/PFColor.h b/ParseUI/ParseUI/Internal/Extensions/PFColor.h deleted file mode 100644 index 7e03aa06b..000000000 --- a/ParseUI/ParseUI/Internal/Extensions/PFColor.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -@interface PFColor : UIColor - -///-------------------------------------- -/// @name Common -///-------------------------------------- - -+ (UIColor *)commonBackgroundColor; - -///-------------------------------------- -/// @name TextFields -///-------------------------------------- - -+ (UIColor *)textFieldBackgroundColor; -+ (UIColor *)textFieldTextColor; -+ (UIColor *)textFieldPlaceholderColor; -+ (UIColor *)textFieldSeparatorColor; - -///-------------------------------------- -/// @name Buttons -///-------------------------------------- - -+ (UIColor *)loginButtonBackgroundColor; -+ (UIColor *)signupButtonBackgroundColor; -+ (UIColor *)appleButtonBackgroundColor; - -@end diff --git a/ParseUI/ParseUI/Internal/Extensions/PFColor.m b/ParseUI/ParseUI/Internal/Extensions/PFColor.m deleted file mode 100644 index 59b6c9bc7..000000000 --- a/ParseUI/ParseUI/Internal/Extensions/PFColor.m +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFColor.h" - -@implementation PFColor - -#pragma mark - -#pragma mark Common - -+ (UIColor *)commonBackgroundColor { - return [UIColor colorWithRed:249/255.0f - green:251.0f/255.0f - blue:1.0f - alpha:1.0f]; -} - -#pragma mark - -#pragma mark TextField - -+ (UIColor *)textFieldBackgroundColor { - return [UIColor whiteColor]; -} - -+ (UIColor *)textFieldTextColor { - return [UIColor blackColor]; -} - -+ (UIColor *)textFieldPlaceholderColor { - return [UIColor colorWithWhite:194.0f/255.0f alpha:1.0f]; -} - -+ (UIColor *)textFieldSeparatorColor { - return [UIColor colorWithWhite:227.0f/255.0f alpha:1.0f]; -} - -#pragma mark - -#pragma mark Buttons - -+ (UIColor *)loginButtonBackgroundColor { - return [UIColor colorWithRed:97.0f/255.0f - green:106.f/255.0f - blue:116.0f/255.0f - alpha:1.0f]; -} - -+ (UIColor *)signupButtonBackgroundColor { - return [UIColor colorWithRed:108.0f/255.0f - green:150.0f/255.0f - blue:249.0f/255.0f - alpha:1.0f]; -} - -+ (UIColor *)appleButtonBackgroundColor { - return [UIColor blackColor]; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Extensions/PFImage.h b/ParseUI/ParseUI/Internal/Extensions/PFImage.h deleted file mode 100644 index b7d522253..000000000 --- a/ParseUI/ParseUI/Internal/Extensions/PFImage.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -@interface PFImage : UIImage - -+ (UIImage *)imageWithColor:(UIColor *)color; -+ (UIImage *)imageWithColor:(UIColor *)color cornerRadius:(CGFloat)cornerRadius; - -+ (UIImage *)imageNamed:(NSString *)name; - -@end diff --git a/ParseUI/ParseUI/Internal/Extensions/PFImage.m b/ParseUI/ParseUI/Internal/Extensions/PFImage.m deleted file mode 100644 index 87e81210f..000000000 --- a/ParseUI/ParseUI/Internal/Extensions/PFImage.m +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFImage.h" - -#import "PFColor.h" -#import "PFRect.h" -#import "PFResources.h" - -@implementation PFImage - -+ (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size -{ - UIGraphicsBeginImageContext(size); - CGContextRef context = UIGraphicsGetCurrentContext(); - - CGContextSetFillColorWithColor(context, color.CGColor); - CGContextFillRect(context, (CGRect){.size = size}); - - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - return image; -} - -+ (UIImage *)imageWithColor:(UIColor *)color cornerRadius:(CGFloat)cornerRadius { - CGSize size = CGSizeMake(cornerRadius * 2.0f + 1.0f, cornerRadius * 2.0f + 1.0f); - - UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f); - - [color setFill]; - UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:PFRectMakeWithSize(size) cornerRadius:cornerRadius]; - [path fill]; - - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(cornerRadius, - cornerRadius, - cornerRadius, - cornerRadius) - resizingMode:UIImageResizingModeStretch]; - - return image; -} - -+ (UIImage *)imageWithColor:(UIColor *)color { - return [self imageWithColor:color size:CGSizeMake(1.0f, 1.0f)]; -} - -+ (UIImage *)imageNamed:(NSString *)imageName { - UIImage *image = [UIImage imageNamed:imageName]; - if (image) { - // If there is an external override for the image at the given path, use it. - return image; - } - - NSString *fileExtension = [imageName pathExtension]; - NSMutableString *filenameWithoutExtension = [[imageName stringByDeletingPathExtension] mutableCopy]; - [filenameWithoutExtension replaceOccurrencesOfString:@"-\\." - withString:@"_" - options:NSRegularExpressionSearch - range:NSMakeRange(0, [filenameWithoutExtension length])]; - - NSData *data = nil; - - int imageScale = (int)ceil([UIScreen mainScreen].scale); - while (data == nil && imageScale > 1) { - NSString *selectorName = [filenameWithoutExtension stringByAppendingFormat:@"%dx_%@", - imageScale, - fileExtension]; - SEL selector = NSSelectorFromString(selectorName); - if ([PFResources respondsToSelector:selector]) { - data = (NSData *)[PFResources performSelector:selector]; - } - if (data == nil) { - imageScale--; - } - } - if (!data) { - NSString *selectorName = [filenameWithoutExtension stringByAppendingFormat:@"_%@", fileExtension]; - SEL selector = NSSelectorFromString(selectorName); - data = (NSData *)[PFResources performSelector:selector]; - } - image = [[UIImage alloc] initWithData:data]; - - // we need to indicate to the framework that the data is already a 2x image, otherwise the framework - // stretches the image by 2x again. To do that, we drop down to CGImage layer to take advantage of - // +[UIImage imageWithCGImage:scale:orientation] - return [UIImage imageWithCGImage:image.CGImage scale:imageScale orientation:image.imageOrientation]; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Extensions/PFRect.h b/ParseUI/ParseUI/Internal/Extensions/PFRect.h deleted file mode 100644 index e6c1f0503..000000000 --- a/ParseUI/ParseUI/Internal/Extensions/PFRect.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import -#import - -extern CGRect PFRectMakeWithOriginSize(CGPoint origin, CGSize size); -extern CGRect PFRectMakeWithOrigin(CGPoint origin); -extern CGRect PFRectMakeWithSize(CGSize size); - -extern CGRect PFRectMakeWithSizeCenteredInRect(CGSize size, CGRect rect); -extern CGSize PFSizeMin(CGSize size1, CGSize size2); diff --git a/ParseUI/ParseUI/Internal/Extensions/PFRect.m b/ParseUI/ParseUI/Internal/Extensions/PFRect.m deleted file mode 100644 index 7ca81f920..000000000 --- a/ParseUI/ParseUI/Internal/Extensions/PFRect.m +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFRect.h" - -CGRect PFRectMakeWithOriginSize(CGPoint origin, CGSize size) { - return CGRectMake(origin.x, origin.y, size.width, size.height); -} - -CGRect PFRectMakeWithOrigin(CGPoint origin) { - return PFRectMakeWithOriginSize(origin, CGSizeZero); -} - -CGRect PFRectMakeWithSize(CGSize size) { - return PFRectMakeWithOriginSize(CGPointZero, size); -} - -CGRect PFRectMakeWithSizeCenteredInRect(CGSize size, CGRect rect) { - CGPoint center = CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect)); - CGPoint origin = CGPointMake(floor(center.x - size.width / 2.0f), - floor(center.y - size.height / 2.0f)); - return PFRectMakeWithOriginSize(origin, size); -} - -CGSize PFSizeMin(CGSize size1, CGSize size2) { - CGSize size = CGSizeZero; - size.width = MIN(size1.width, size2.width); - size.height = MIN(size1.height, size2.height); - return size; -} diff --git a/ParseUI/ParseUI/Internal/Extensions/PFUIAlertView.h b/ParseUI/ParseUI/Internal/Extensions/PFUIAlertView.h deleted file mode 100644 index f6742b310..000000000 --- a/ParseUI/ParseUI/Internal/Extensions/PFUIAlertView.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -typedef void(^PFUIAlertViewCompletion)(NSUInteger selectedOtherButtonIndex); -typedef void(^PFUIAlertViewTextFieldCompletion)(UITextField *textField, NSUInteger selectedOtherButtonIndex); -typedef void(^PFUIAlertViewTextFieldCustomizationHandler)(UITextField *textField); - -@interface PFUIAlertView : NSObject - -///-------------------------------------- -#pragma mark - Present -///-------------------------------------- - -+ (void)presentAlertInViewController:(UIViewController *)viewController - withTitle:(NSString *)title - message:(nullable NSString *)message - cancelButtonTitle:(NSString *)cancelButtonTitle - otherButtonTitles:(nullable NSArray *)otherButtonTitles - completion:(nullable PFUIAlertViewCompletion)completion; - -+ (void)presentAlertInViewController:(UIViewController *)viewController - withTitle:(NSString *)title - message:(nullable NSString *)message - textFieldCustomizationHandler:(PFUIAlertViewTextFieldCustomizationHandler)textFieldCustomizationHandler - cancelButtonTitle:(NSString *)cancelButtonTitle - otherButtonTitles:(nullable NSArray *)otherButtonTitles - completion:(nullable PFUIAlertViewTextFieldCompletion)completion; - -///-------------------------------------- -#pragma mark - Convenience -///-------------------------------------- - -+ (void)presentAlertInViewController:(UIViewController *)viewController - withTitle:(NSString *)title - error:(NSError *)error; -+ (void)presentAlertInViewController:(UIViewController *)viewController - withTitle:(NSString *)title - message:(nullable NSString *)message; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Internal/Extensions/PFUIAlertView.m b/ParseUI/ParseUI/Internal/Extensions/PFUIAlertView.m deleted file mode 100644 index 155f70d62..000000000 --- a/ParseUI/ParseUI/Internal/Extensions/PFUIAlertView.m +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFUIAlertView.h" - -#import "PFLocalization.h" - -@interface PFUIAlertView () - -@property (nonatomic, copy) PFUIAlertViewCompletion completion; - -@end - -@implementation PFUIAlertView - -///-------------------------------------- -#pragma mark - Present -///-------------------------------------- - -+ (void)presentAlertInViewController:(UIViewController *)viewController - withTitle:(NSString *)title - message:(nullable NSString *)message - cancelButtonTitle:(NSString *)cancelButtonTitle - otherButtonTitles:(nullable NSArray *)otherButtonTitles - completion:(nullable PFUIAlertViewCompletion)completion { - if ([UIAlertController class] != nil) { - __block UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title - message:message - preferredStyle:UIAlertControllerStyleAlert]; - - void (^alertActionHandler)(UIAlertAction *) = [^(UIAlertAction *action) { - if (completion) { - // This block intentionally retains alertController, and releases it afterwards. - if (action.style == UIAlertActionStyleCancel) { - completion(NSNotFound); - } else { - NSUInteger index = [alertController.actions indexOfObject:action]; - completion(index - 1); - } - } - alertController = nil; - } copy]; - - [alertController addAction:[UIAlertAction actionWithTitle:cancelButtonTitle - style:UIAlertActionStyleCancel - handler:alertActionHandler]]; - - for (NSString *buttonTitle in otherButtonTitles) { - [alertController addAction:[UIAlertAction actionWithTitle:buttonTitle - style:UIAlertActionStyleDefault - handler:alertActionHandler]]; - } - - [viewController presentViewController:alertController animated:YES completion:nil]; - } else { -#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0 - __block PFUIAlertView *pfAlertView = [[self alloc] init]; - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title - message:message - delegate:nil - cancelButtonTitle:cancelButtonTitle - otherButtonTitles:nil]; - - for (NSString *buttonTitle in otherButtonTitles) { - [alertView addButtonWithTitle:buttonTitle]; - } - - pfAlertView.completion = ^(NSUInteger index) { - if (completion) { - completion(index); - } - - pfAlertView = nil; - }; - - alertView.delegate = pfAlertView; - [alertView show]; -#endif - } -} - -+ (void)presentAlertInViewController:(UIViewController *)viewController - withTitle:(NSString *)title - message:(nullable NSString *)message - textFieldCustomizationHandler:(PFUIAlertViewTextFieldCustomizationHandler)textFieldCustomizationHandler - cancelButtonTitle:(NSString *)cancelButtonTitle - otherButtonTitles:(nullable NSArray *)otherButtonTitles - completion:(nullable PFUIAlertViewTextFieldCompletion)completion { - if ([UIAlertController class] != nil) { - __block UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title - message:message - preferredStyle:UIAlertControllerStyleAlert]; - [alertController addTextFieldWithConfigurationHandler:textFieldCustomizationHandler]; - void (^alertActionHandler)(UIAlertAction *) = [^(UIAlertAction *action) { - if (completion) { - UITextField *textField = alertController.textFields.firstObject; - // This block intentionally retains alertController, and releases it afterwards. - if (action.style == UIAlertActionStyleCancel) { - completion(textField, NSNotFound); - } else { - NSUInteger index = [alertController.actions indexOfObject:action]; - completion(textField, index - 1); - } - } - alertController = nil; - } copy]; - - [alertController addAction:[UIAlertAction actionWithTitle:cancelButtonTitle - style:UIAlertActionStyleCancel - handler:alertActionHandler]]; - - for (NSString *buttonTitle in otherButtonTitles) { - [alertController addAction:[UIAlertAction actionWithTitle:buttonTitle - style:UIAlertActionStyleDefault - handler:alertActionHandler]]; - } - - [viewController presentViewController:alertController animated:YES completion:nil]; - } else { -#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0 - __block PFUIAlertView *pfAlertView = [[self alloc] init]; - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title - message:message - delegate:nil - cancelButtonTitle:cancelButtonTitle - otherButtonTitles:nil]; - alertView.alertViewStyle = UIAlertViewStylePlainTextInput; - for (NSString *buttonTitle in otherButtonTitles) { - [alertView addButtonWithTitle:buttonTitle]; - } - textFieldCustomizationHandler([alertView textFieldAtIndex:0]); - - __weak UIAlertView *walertView = alertView; - pfAlertView.completion = ^(NSUInteger index) { - if (completion) { - UITextField *textField = [walertView textFieldAtIndex:0]; - completion(textField, index); - } - - pfAlertView = nil; - }; - - alertView.delegate = pfAlertView; - [alertView show]; -#endif - } -} - -///-------------------------------------- -#pragma mark - Convenience -///-------------------------------------- - -+ (void)presentAlertInViewController:(UIViewController *)viewController - withTitle:(NSString *)title - error:(NSError *)error { - NSString *message = error.userInfo[@"error"]; - if (!message) { - message = [error.userInfo[@"originalError"] localizedDescription]; - } - if (!message) { - message = [error localizedDescription]; - } - [self presentAlertInViewController:viewController withTitle:title message:message]; -} - -+ (void)presentAlertInViewController:(UIViewController *)viewController - withTitle:(NSString *)title - message:(nullable NSString *)message { - [self presentAlertInViewController:viewController - withTitle:title - message:message - cancelButtonTitle:PFLocalizedString(@"OK", @"OK") - otherButtonTitles:nil - completion:nil]; -} - -#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0 - -///-------------------------------------- -#pragma mark - UIAlertViewDelegate -///-------------------------------------- - -- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { - if (self.completion) { - if (buttonIndex == alertView.cancelButtonIndex) { - self.completion(NSNotFound); - } else { - self.completion(buttonIndex - 1); - } - } -} - -#endif - -@end diff --git a/ParseUI/ParseUI/Internal/PFImageCache.h b/ParseUI/ParseUI/Internal/PFImageCache.h deleted file mode 100644 index 38c184e28..000000000 --- a/ParseUI/ParseUI/Internal/PFImageCache.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -/** - A memory cache for UIImage, based on NSCache - */ -@interface PFImageCache : NSCache - -+ (instancetype)sharedCache; - -- (void)setImage:(UIImage *)image forURL:(NSURL *)url; -- (UIImage *)imageForURL:(NSURL *)url; - -@end diff --git a/ParseUI/ParseUI/Internal/PFImageCache.m b/ParseUI/ParseUI/Internal/PFImageCache.m deleted file mode 100644 index 260cd50e7..000000000 --- a/ParseUI/ParseUI/Internal/PFImageCache.m +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFImageCache.h" - -static NSString *PFImageCacheKeyFromURL(NSURL *url) { - return [url absoluteString]; -} - -@implementation PFImageCache - -+ (instancetype)sharedCache { - static dispatch_once_t onceToken; - static PFImageCache *sharedCache; - dispatch_once(&onceToken, ^{ - sharedCache = [[self alloc] init]; - }); - return sharedCache; -} - -- (void)setImage:(UIImage *)image forURL:(NSURL *)url { - [self setObject:image forKey:PFImageCacheKeyFromURL(url)]; -} - -- (UIImage *)imageForURL:(NSURL *)url { - return [self objectForKey:PFImageCacheKeyFromURL(url)]; -} - -@end diff --git a/ParseUI/ParseUI/Internal/PFLocalization.h b/ParseUI/ParseUI/Internal/PFLocalization.h deleted file mode 100644 index a328dfb83..000000000 --- a/ParseUI/ParseUI/Internal/PFLocalization.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -#define PFLocalizedString(key, comment) \ -[PFLocalization localizedStringForKey:key] - -/** - Used by the above macro to fetch a localized string - */ -@interface PFLocalization : NSObject - -+ (NSString *)localizedStringForKey:key; - -@end diff --git a/ParseUI/ParseUI/Internal/PFLocalization.m b/ParseUI/ParseUI/Internal/PFLocalization.m deleted file mode 100644 index 947665dd9..000000000 --- a/ParseUI/ParseUI/Internal/PFLocalization.m +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFLocalization.h" - -@implementation PFLocalization - -+ (NSString *)localizedStringForKey:key { - return [[self resourcesBundle] localizedStringForKey:key value:nil table:@"ParseUI"]; -} - -+ (NSBundle *)resourcesBundle { - static NSBundle *bundle; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - NSBundle *classBundle = [NSBundle bundleForClass:[self class]]; - NSURL *bundleURL = [classBundle URLForResource:@"ParseUI" withExtension:@"bundle"]; - - if (bundleURL) { - bundle = [NSBundle bundleWithURL:bundleURL]; - } else { - bundleURL = [classBundle URLForResource:@"ParseObjC_ParseUI" withExtension:@"bundle"]; - if (bundleURL) { - bundle = [NSBundle bundleWithURL:bundleURL]; - } - else { - bundle = [NSBundle mainBundle]; - } - } - }); - return bundle; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.h b/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.h deleted file mode 100644 index a7b79552c..000000000 --- a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// PFAppleAuthenticationProvider.h -// ParseUIDemo -// -// Created by Darren Black on 20/12/2019. -// Copyright © 2019 Parse Inc. All rights reserved. -// - -#import - -@import ParseCore; - -NS_ASSUME_NONNULL_BEGIN - -@interface PFAppleAuthenticationProvider : NSObject - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.m b/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.m deleted file mode 100644 index 033f1ebc5..000000000 --- a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.m +++ /dev/null @@ -1,17 +0,0 @@ -// -// PFAppleAuthenticationProvider.m -// ParseUIDemo -// -// Created by Darren Black on 20/12/2019. -// Copyright © 2019 Parse Inc. All rights reserved. -// - -#import "PFAppleAuthenticationProvider.h" - -@implementation PFAppleAuthenticationProvider - -- (BOOL)restoreAuthenticationWithAuthData:(nullable NSDictionary *)authData { - return authData[@"id"] != nil; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.h b/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.h deleted file mode 100644 index ff92b4f5c..000000000 --- a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// PFAppleUtils.h -// ParseUIDemo -// -// Created by Darren Black on 20/12/2019. -// Copyright © 2019 Parse Inc. All rights reserved. -// - -#import - -@import ParseCore; -@import AuthenticationServices; - -NS_ASSUME_NONNULL_BEGIN - -extern NSString *const PFAppleUserAuthenticationType; -extern NSString *const PFAppleAuthUserKey; -extern NSString *const PFAppleAuthCredentialKey; - -API_AVAILABLE(ios(13.0)) -@interface PFAppleLoginManager : NSObject - -@end - -API_AVAILABLE(ios(13.0)) -@interface PFAppleUtils : NSObject - -+ (BFTask *)logInInBackground; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.m b/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.m deleted file mode 100644 index 1e32d097b..000000000 --- a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.m +++ /dev/null @@ -1,125 +0,0 @@ -// -// PFAppleUtils.m -// ParseUIDemo -// -// Created by Darren Black on 20/12/2019. -// Copyright © 2019 Parse Inc. All rights reserved. -// - -#import "PFAppleUtils.h" -#import "PFAppleAuthenticationProvider.h" -#import - -#if __has_include() -#import -#else -#import "BFTask.h" -#endif - -NSString *const PFAppleUserAuthenticationType = @"apple"; -NSString *const PFAppleAuthUserKey = @"user"; -NSString *const PFAppleAuthCredentialKey = @"credential"; - -API_AVAILABLE(ios(13.0)) -@interface PFAppleLoginManager () - -@property (strong, nonatomic) BFTask *userTask; -@property (strong, nonatomic) BFTaskCompletionSource *completionSource; -@property (strong, nonatomic) PFAppleLoginManager *strongSelf; - -@property (weak, nonatomic) ASAuthorizationController *controller; - -@end - -@implementation PFAppleLoginManager - --(BFTask *) loginTaskWithController:(ASAuthorizationController *)controller { - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - - self.userTask = source.task; - controller.delegate = self; - controller.presentationContextProvider = self; - self.completionSource = source; - self.strongSelf = self; - self.controller = controller; - - return source.task; -} - -- (nonnull ASPresentationAnchor)presentationAnchorForAuthorizationController:(nonnull ASAuthorizationController *)controller { - return UIApplication.sharedApplication.keyWindow; -} - -- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization { - ASAuthorizationAppleIDCredential *cred = authorization.credential; - NSString *userId = cred.user; - NSData *token = cred.identityToken; - NSString *tokenString = [[NSString alloc] initWithData:token encoding:NSUTF8StringEncoding]; - - __weak typeof(self) wself = self; - - [[[PFUser logInWithAuthTypeInBackground:PFAppleUserAuthenticationType - authData:@{@"token" : tokenString, @"id" : userId}] continueWithSuccessBlock:^id _Nullable(BFTask<__kindof PFUser *> * _Nonnull t) { - __strong typeof(wself) sself = wself; - [sself.completionSource setResult:@{PFAppleAuthUserKey : t.result, - PFAppleAuthCredentialKey : cred}]; - sself.strongSelf = nil; - return t; - }] continueWithBlock:^id _Nullable(BFTask * _Nonnull t) { - __strong typeof(wself) sself = wself; - if (t.error) { - [sself.completionSource setError:t.error]; - sself.strongSelf = nil; - } - return nil; - }]; -} - -- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error { - [self.completionSource setError:error]; -} - -@end - -@interface PFAppleUtils () - -@property (strong, nonatomic) PFAppleUtils *strongSelf; - -@end - -@implementation PFAppleUtils - -static PFAppleAuthenticationProvider *_authenticationProvider; - -- (instancetype)init -{ - self = [super init]; - if (self) { - if (!_authenticationProvider) { - _authenticationProvider = [[PFAppleAuthenticationProvider alloc] init]; - [PFUser registerAuthenticationDelegate:_authenticationProvider forAuthType:PFAppleUserAuthenticationType]; - } - } - return self; -} - -+ (BFTask *)logInInBackground { - PFAppleLoginManager *manager = [PFAppleLoginManager new]; - return [PFAppleUtils logInInBackgroundWithManager:manager]; -} - -+ (BFTask *)logInInBackgroundWithManager:(PFAppleLoginManager *)manager { - if (!_authenticationProvider) { - [PFAppleUtils new]; - } - - ASAuthorizationAppleIDProvider *provider = [ASAuthorizationAppleIDProvider new]; - ASAuthorizationAppleIDRequest *request = [provider createRequest]; - request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail]; - - ASAuthorizationController *controller = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]]; - [controller performRequests]; - return [manager loginTaskWithController:controller]; -} -@end - diff --git a/ParseUI/ParseUI/Internal/Views/Buttons/PFActionButton.h b/ParseUI/ParseUI/Internal/Views/Buttons/PFActionButton.h deleted file mode 100644 index c9772ef62..000000000 --- a/ParseUI/ParseUI/Internal/Views/Buttons/PFActionButton.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -typedef NS_ENUM(uint8_t, PFActionButtonStyle) -{ - PFActionButtonStyleNormal, - PFActionButtonStyleWide -}; - -@class PFActionButtonConfiguration; - -@interface PFActionButton : UIButton - -@property (nonatomic, assign, getter=isLoading) BOOL loading; - -@property (nonatomic, assign) PFActionButtonStyle buttonStyle; - -///-------------------------------------- -/// @name Class -///-------------------------------------- - -+ (NSString *)titleForButtonStyle:(PFActionButtonStyle)buttonStyle; - -///-------------------------------------- -/// @name Init -///-------------------------------------- - -- (instancetype)initWithConfiguration:(PFActionButtonConfiguration *)configuration - buttonStyle:(PFActionButtonStyle)buttonStyle NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE; - -@end - -@interface PFActionButtonConfiguration : NSObject - -@property (nonatomic, strong, readonly) UIColor *backgroundImageColor; -@property (nonatomic, strong, readonly) UIImage *image; - -- (instancetype)initWithBackgroundImageColor:(UIColor *)backgroundImageColor - image:(UIImage *)image NS_DESIGNATED_INITIALIZER; - -- (void)setTitle:(NSString *)title forButtonStyle:(PFActionButtonStyle)style; -- (NSString *)titleForButtonStyle:(PFActionButtonStyle)style; - -@end diff --git a/ParseUI/ParseUI/Internal/Views/Buttons/PFActionButton.m b/ParseUI/ParseUI/Internal/Views/Buttons/PFActionButton.m deleted file mode 100644 index b40278896..000000000 --- a/ParseUI/ParseUI/Internal/Views/Buttons/PFActionButton.m +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFActionButton.h" - -#import "PFImage.h" -#import "PFRect.h" - -static const UIEdgeInsets PFActionButtonContentEdgeInsets = { .top = 0.0f, .left = 12.0f, .bottom = 0.0f, .right = 0.0f }; - -@interface PFActionButton () -{ - UIActivityIndicatorView *_activityIndicatorView; -} - -@property (nonatomic, strong) PFActionButtonConfiguration *pfActionButtonConfiguration; - -- (instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER; - -@end - -@implementation PFActionButton - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithFrame:(CGRect)frame { - return [super initWithFrame:frame]; -} - -- (instancetype)initWithCoder:(nonnull NSCoder *)decoder { - return [super initWithCoder:decoder]; -} - -- (instancetype)initWithConfiguration:(PFActionButtonConfiguration *)configuration - buttonStyle:(PFActionButtonStyle)buttonStyle { - self = [super initWithFrame:CGRectZero]; - if (!self) return nil; - - self.buttonStyle = buttonStyle; - self.pfActionButtonConfiguration = configuration; - - self.backgroundColor = [UIColor clearColor]; - self.titleLabel.font = [UIFont systemFontOfSize:16.0f]; - - self.contentEdgeInsets = UIEdgeInsetsZero; - self.imageEdgeInsets = UIEdgeInsetsZero; - - UIImage *backgroundImage = [PFImage imageWithColor:configuration.backgroundImageColor cornerRadius:4.0f]; - [self setBackgroundImage:backgroundImage forState:UIControlStateNormal]; - - [self setImage:configuration.image forState:UIControlStateNormal]; - - [self setTitle:[configuration titleForButtonStyle:buttonStyle] - forState:UIControlStateNormal]; - - return self; -} - -#pragma mark - -#pragma mark Layout - -- (void)layoutSubviews { - [super layoutSubviews]; - - _activityIndicatorView.center = self.imageView.center; - self.imageView.alpha = (self.loading ? 0.0f : 1.0f); -} - -- (CGSize)sizeThatFits:(CGSize)boundingSize { - CGSize size = CGSizeZero; - size.width = MAX([super sizeThatFits:boundingSize].width, boundingSize.width); - size.height = MIN(44.0f, boundingSize.height); - return size; -} - -- (CGRect)imageRectForContentRect:(CGRect)contentRect { - CGRect imageRect = PFRectMakeWithSize([self imageForState:UIControlStateNormal].size); - imageRect.origin.x = PFActionButtonContentEdgeInsets.left; - imageRect.origin.y = CGRectGetMidY(contentRect) - CGRectGetMidY(imageRect); - return imageRect; -} - -- (CGRect)titleRectForContentRect:(CGRect)contentRect { - contentRect.origin.x = CGRectGetMaxX([self imageRectForContentRect:contentRect]); - contentRect.size.width = CGRectGetWidth(self.bounds) - CGRectGetMaxX([self imageRectForContentRect:contentRect]); - - CGSize size = [super titleRectForContentRect:contentRect].size; - CGRect rect = PFRectMakeWithSizeCenteredInRect(size, contentRect); - return rect; -} - -#pragma mark - -#pragma mark Configuration - -+ (UIColor *)backgroundImageColor { - return [UIColor clearColor]; -} - -+ (NSString *)titleForButtonStyle:(PFActionButtonStyle)buttonStyle { - return nil; -} - -#pragma mark - -#pragma mark Accessors - -- (void)setLoading:(BOOL)loading { - if (self.loading != loading) { - if (loading) { - if (!_activityIndicatorView) { - _activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; - } - - [_activityIndicatorView startAnimating]; - [self addSubview:_activityIndicatorView]; - [self setNeedsLayout]; - } else { - [_activityIndicatorView stopAnimating]; - [_activityIndicatorView removeFromSuperview]; - } - - self.imageView.alpha = (loading ? 0.0f : 1.0f); - } -} - -- (BOOL)isLoading { - return [_activityIndicatorView isAnimating]; -} - -- (void)setButtonStyle:(PFActionButtonStyle)buttonStyle { - if (self.buttonStyle != buttonStyle) { - _buttonStyle = buttonStyle; - - [self setTitle:[self.pfActionButtonConfiguration titleForButtonStyle:self.buttonStyle] forState:UIControlStateNormal]; - } -} - -@end - -@interface PFActionButtonConfiguration () { - NSMutableDictionary *_titlesDictionary; -} - -@property (nonatomic, strong, readwrite) UIColor *backgroundImageColor; -@property (nonatomic, strong, readwrite) UIImage *image; - -@end - -@implementation PFActionButtonConfiguration - -#pragma mark - -#pragma mark Init - -- (instancetype)init { - return [self initWithBackgroundImageColor:nil image:nil]; -} - -- (instancetype)initWithBackgroundImageColor:(UIColor *)backgroundImageColor - image:(UIImage *)image { - self = [super init]; - if (!self) return nil; - - _backgroundImageColor = backgroundImageColor; - _image = image; - - return self; -} - -#pragma mark - -#pragma mark Title - -- (void)setTitle:(NSString *)title forButtonStyle:(PFActionButtonStyle)style { - if (!_titlesDictionary) { - _titlesDictionary = [NSMutableDictionary dictionaryWithCapacity:style]; - } - _titlesDictionary[@(style)] = title; -} - -- (NSString *)titleForButtonStyle:(PFActionButtonStyle)style { - return _titlesDictionary[@(style)]; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Views/Buttons/PFDismissButton.h b/ParseUI/ParseUI/Internal/Views/Buttons/PFDismissButton.h deleted file mode 100644 index c34e4db00..000000000 --- a/ParseUI/ParseUI/Internal/Views/Buttons/PFDismissButton.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -@interface PFDismissButton : UIButton - -@end diff --git a/ParseUI/ParseUI/Internal/Views/Buttons/PFDismissButton.m b/ParseUI/ParseUI/Internal/Views/Buttons/PFDismissButton.m deleted file mode 100644 index ba40367d4..000000000 --- a/ParseUI/ParseUI/Internal/Views/Buttons/PFDismissButton.m +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFDismissButton.h" - -#import "PFRect.h" - -@implementation PFDismissButton - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (!self) return nil; - - [self setImage:[self _defaultImage] forState:UIControlStateNormal]; - - return self; -} - -#pragma mark - -#pragma mark Init - -- (UIImage *)_defaultImage { - CGRect imageRect = PFRectMakeWithSize(CGSizeMake(22.0f, 22.0f)); - - UIGraphicsBeginImageContextWithOptions(imageRect.size, NO, 0.0f); - - [[UIColor colorWithRed:91.0f/255.0f green:107.0f/255.0f blue:118.0f/255.0f alpha:1.0f] setStroke]; - - UIBezierPath *path = [UIBezierPath bezierPath]; - - [path moveToPoint:CGPointZero]; - [path addLineToPoint:CGPointMake(CGRectGetMaxX(imageRect), CGRectGetMaxY(imageRect))]; - - [path moveToPoint:CGPointMake(CGRectGetMaxX(imageRect), CGRectGetMinY(imageRect))]; - [path addLineToPoint:CGPointMake(CGRectGetMinX(imageRect), CGRectGetMaxY(imageRect))]; - - path.lineWidth = 2.0f; - - [path stroke]; - - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - return image; -} - -#pragma mark - -#pragma mark UIView - -- (CGSize)sizeThatFits:(CGSize)boundingSize { - CGSize size = CGSizeZero; - size.width = MIN(22.0f, boundingSize.width); - size.height = MIN(22.0f, boundingSize.height); - return size; -} - -- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event -{ - CGRect bigBounds = CGRectInset(self.bounds, -22.0f, -22.0f); - return CGRectContainsPoint(bigBounds, point); -} - -@end diff --git a/ParseUI/ParseUI/Internal/Views/Buttons/PFPrimaryButton.h b/ParseUI/ParseUI/Internal/Views/Buttons/PFPrimaryButton.h deleted file mode 100644 index 85171806d..000000000 --- a/ParseUI/ParseUI/Internal/Views/Buttons/PFPrimaryButton.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -@interface PFPrimaryButton : UIButton - -@property (nonatomic, assign, getter=isLoading) BOOL loading; - -- (instancetype)initWithBackgroundImageColor:(UIColor *)color NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE; - -@end diff --git a/ParseUI/ParseUI/Internal/Views/Buttons/PFPrimaryButton.m b/ParseUI/ParseUI/Internal/Views/Buttons/PFPrimaryButton.m deleted file mode 100644 index 5c5a076a5..000000000 --- a/ParseUI/ParseUI/Internal/Views/Buttons/PFPrimaryButton.m +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFPrimaryButton.h" - -#import "PFImage.h" -#import "PFRect.h" - -@interface PFPrimaryButton () -{ - UIActivityIndicatorView *_activityIndicatorView; -} - -- (instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER; - -@end - -@implementation PFPrimaryButton - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithFrame:(CGRect)frame { - return [super initWithFrame:frame]; -} - -- (instancetype)initWithCoder:(nonnull NSCoder *)decoder { - return [super initWithCoder:decoder]; -} - -- (instancetype)initWithBackgroundImageColor:(UIColor *)color { - self = [super initWithFrame:CGRectZero]; - if (!self) return nil; - - [self setBackgroundImage:[PFImage imageWithColor:color] forState:UIControlStateNormal]; - - self.titleLabel.font = [UIFont systemFontOfSize:20.0f]; - self.contentVerticalAlignment = UIControlContentHorizontalAlignmentCenter; - self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; - - return self; -} - -#pragma mark - -#pragma mark Layout - -- (void)layoutSubviews { - [super layoutSubviews]; - - CGFloat activityIndicatorRightInset = 12.0f; - - CGRect activityIndicatorFrame = PFRectMakeWithSizeCenteredInRect(_activityIndicatorView.bounds.size, self.bounds); - activityIndicatorFrame.origin.x = (CGRectGetMinX(self.titleLabel.frame) - - CGRectGetWidth(activityIndicatorFrame) - - activityIndicatorRightInset); - _activityIndicatorView.frame = activityIndicatorFrame; -} - -- (CGSize)sizeThatFits:(CGSize)boundingSize { - CGSize size = CGSizeZero; - size.width = boundingSize.width; - size.height = MIN(56.0f, boundingSize.height); - return size; -} - -#pragma mark - -#pragma mark Accessors - -- (void)setLoading:(BOOL)loading { - if (self.loading != loading) { - if (loading) { - if (!_activityIndicatorView) { - _activityIndicatorView = [[UIActivityIndicatorView alloc] - initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; - } - - [_activityIndicatorView startAnimating]; - [self addSubview:_activityIndicatorView]; - [self setNeedsLayout]; - } else { - [_activityIndicatorView stopAnimating]; - [_activityIndicatorView removeFromSuperview]; - } - } -} - -- (BOOL)isLoading { - return [_activityIndicatorView isAnimating]; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Views/Buttons/PFTextButton.h b/ParseUI/ParseUI/Internal/Views/Buttons/PFTextButton.h deleted file mode 100644 index 75db8f251..000000000 --- a/ParseUI/ParseUI/Internal/Views/Buttons/PFTextButton.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -@interface PFTextButton : UIButton - -@end diff --git a/ParseUI/ParseUI/Internal/Views/Buttons/PFTextButton.m b/ParseUI/ParseUI/Internal/Views/Buttons/PFTextButton.m deleted file mode 100644 index 9ada72677..000000000 --- a/ParseUI/ParseUI/Internal/Views/Buttons/PFTextButton.m +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFTextButton.h" - -@implementation PFTextButton - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (!self) return nil; - - self.titleLabel.font = [UIFont systemFontOfSize:16.0f]; - [self setTitleColor:[UIColor colorWithRed:82.0f/255.0f - green:152.0f/255.0f - blue:252.0f/255.0f - alpha:1.0f] - forState:UIControlStateNormal]; - - return self; -} - -#pragma mark - -#pragma mark UIView - -- (CGSize)sizeThatFits:(CGSize)boundingSize { - CGSize size = [super sizeThatFits:boundingSize]; - size.width = MAX(32.0f, boundingSize.width); - size.height = MIN(32.0f, boundingSize.height); - return size; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Views/PFLoadingView.h b/ParseUI/ParseUI/Internal/Views/PFLoadingView.h deleted file mode 100644 index 2663181d1..000000000 --- a/ParseUI/ParseUI/Internal/Views/PFLoadingView.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -/** - A loading view that is used to show users that data is being loaded before any data is available. - */ -@interface PFLoadingView : UIView - -@end diff --git a/ParseUI/ParseUI/Internal/Views/PFLoadingView.m b/ParseUI/ParseUI/Internal/Views/PFLoadingView.m deleted file mode 100644 index 1b36ec024..000000000 --- a/ParseUI/ParseUI/Internal/Views/PFLoadingView.m +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFLoadingView.h" - -#import "PFRect.h" -#import "PFLocalization.h" - -@interface PFLoadingView () - -@property (nonatomic, strong) UILabel *loadingLabel; -@property (nonatomic, strong) UIActivityIndicatorView *activityIndicator; - -@end - -@implementation PFLoadingView - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - _activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; - [_activityIndicator startAnimating]; - [self addSubview:_activityIndicator]; - - _loadingLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - _loadingLabel.text = PFLocalizedString(@"Loading...", @"Loading message of PFQueryTableViewController"); - _loadingLabel.backgroundColor = [UIColor clearColor]; - _loadingLabel.shadowOffset = CGSizeMake(0.0f, 1.0f); - _loadingLabel.shadowColor = [UIColor whiteColor]; - [_loadingLabel sizeToFit]; - [self addSubview:_loadingLabel]; - } - return self; -} - -#pragma mark - -#pragma mark UIView - -- (void)layoutSubviews { - [super layoutSubviews]; - - const CGRect bounds = self.bounds; - - CGFloat viewsInset = 4.0f; - CGFloat startX = floor((CGRectGetMaxX(bounds) - - CGRectGetWidth(_loadingLabel.frame) - - CGRectGetWidth(_activityIndicator.frame) - - viewsInset) - / 2.0f); - - CGRect activityIndicatorFrame = PFRectMakeWithSizeCenteredInRect(_activityIndicator.frame.size, bounds); - activityIndicatorFrame.origin.x = startX; - _activityIndicator.frame = activityIndicatorFrame; - - CGRect loadingLabelFrame = PFRectMakeWithSizeCenteredInRect(_loadingLabel.frame.size, bounds); - loadingLabelFrame.origin.x = CGRectGetMaxX(activityIndicatorFrame) + viewsInset; - _loadingLabel.frame = loadingLabelFrame; -} - -@end diff --git a/ParseUI/ParseUI/Resources/Images/apple_icon.png b/ParseUI/ParseUI/Resources/Images/apple_icon.png deleted file mode 100644 index 7ff6bcc5d6231531047fe001a2e61f5ff40b8b18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmV;L0cHM)P)Px$R7pfZR5%f(lQArVK@`Wo`%=_~r4x~gL?Q+TgP0^@vvjjcx-uFK7KzbnXkwJG z*)SMvNLU&y2C)!>kXHKnz3RJbg~UBC`Q^QL_x}G}zuqNDL}Xc3hHF@ikcCl%DeQvA zXxNRYP_L*1`3ziyJd7f|Z5ch0C&Nxeg|HtQa0Da2Njr|n;248*Fb?;y4^`-a0Vu%~ zbi*Z7oO6%lufQM&>+k{Jt5;@uWhB1RY57_wZOKGBKM zvB5wkLllRY4a&zZ(8zP>(p^J7Nn3Aa&meA>>@*urRfKo2#1*2Pccob~xX44E@g`ER zAm8gC(rmTEL>o-E+3!@%c_(733ES)E8;CTBme*a07*qoM6N<$ Eg4-Xi+W-In diff --git a/ParseUI/ParseUI/Resources/Images/apple_icon@2x.png b/ParseUI/ParseUI/Resources/Images/apple_icon@2x.png deleted file mode 100644 index c826f381f1f39271998329bd2548c49354a8a903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 844 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 diff --git a/ParseUI/ParseUI/Resources/Images/facebook_icon@3x.png b/ParseUI/ParseUI/Resources/Images/facebook_icon@3x.png deleted file mode 100644 index 287456bb8ebf3a41d6c42715e007af97b9acc728..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1754 zcmaJ?2~ZPf6pnxxp+LNfh}LaHD@u+HawH^Z4j>VOh@l3@gC$vD37d_{0)bK|rlO#N zAP8dwMA0gidSE>e2CTQmf(jI&45(<)NL3ibq9b;LfbC4_o7w&U_s{#j_r3SOoy`ah z339NTWk({B93)~<7_ka0580M@cgaXkiNysEkmIYdXgmqh!X&;Di-G|O3dO)-Fr-Z0 zbPMK^NY?WZnH-l(S8x;fPQ3esL zQ)m$lj$mrQ!U#oS2{?~RDE(Lhsu`nI>qgo{G>oB#Gz^f=w3IX&D3$(yD2k3n>+mr6 zlivR%*2$7JFe41sVF_9VadFY}EU7dcp%#X4Oe@2%_|Yzg#$q_8i^Vj6PzWrPLJCA} z@!f|3QYlBG*5Qy^0ZT+YDnUU<5GBWlC18m_AGW7R$OgfHCBB|sLV>`W$rcDewiin@ ziWOms1Qb@|qgdr9EPq_AWfo8kky!+5kwjP-sKroVxMmJAz80Tx`9`qH@wNDli)9dE z7?zv;$4!qO5#wXoj?FFMj7>hQCdOS$%yl-lIEeUMq!JNdrf=&h>>OFh8hvbl}vs=eaaa!qye&@Vg!T74QR@wh+FiMabB5Vrxdg{-wr=gQfct zyC7?L>*fBEo_Ie$UY+`)c%!bce!$;pw)eT1Zr;0|!QO8>tQ9WIf;!mV#;T!R{ieud znq^&mnE3?ldH4_-u)j}Om)Nahts%0rt!;;U-r7Zb+n$-t7jJD994rx3{#ag~8X2&v z-Fx4P%+IdnH*`Ds8ZLo(t~WM$1o0s^FimJ%TWU20NUyNU`R+wQTF_wiSN96;6x16i z>k1DX_;8`Ry4oamJI9~1L-Y98=rfKTCk2UwYRV9-{|j@19=QKrC*EM`D$lh zuRe8mThzW43nmtKPii)nL{LggOPwI<5I^DFuE0{y+}zwR%?VctTYT&hZhu_1=q%6A z&y{X^byJzOyh3G&d|O>r6`b0OqUgZT&`=ePMx#?g7v#eqvc-gg-}cy?uBoXBH2ZP6 zTr$#sJ(Ag!zdp_oACmo7>z|4C%k=9#$R_Ivx-0$}b8l1B22EM~&iRjh?@n)RZ;!tM zR)^m2e`{y6i3=_!8^4dR<^$=9AIi(!78%3C!?zuBj-2sk=A*{OMr@_I7&z@CuAh-1 z@^{I+?tI(b=V(ew3fFOa7YCX6HQd0O?bvW^4s_}dzk9sk<}l&W#xhQep-+i=@6UZ3 zg`AetFN;#rQYa1%4h09Zn!=ne$DQ>qKH`!`BR~B-ak}irwBy!%X012&(_}&ZlR^_< zGMP@qg+*|R>Q!5oJ$NShWollG20@~LmGx(+Ic%XPs-u&L+qm5Iu9$uKc1)$g%mr=-8e1L58FK5+eKz{YosX{kN z`a#N+v|7iKIYxlo$v)Zgd|CilwwFSy=qy`M*O$}K{mtQxa=E-Kxu)gio23|r)rL

Ru)!QR#t-k{zJ;RIP?3J6KqL63&CwuwpW!AKO2%HAVhRR5NZ4y DVXC#_ diff --git a/ParseUI/ParseUI/Resources/Images/parse_logo.png b/ParseUI/ParseUI/Resources/Images/parse_logo.png deleted file mode 100644 index 68d8befc2f30b1e3f61519ca40cda76ac030ab13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5403 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 V5$q|d^!Fd1$_nc8wXzoB{|9T(J8l2~ diff --git a/ParseUI/ParseUI/Resources/Images/parse_logo@3x.png b/ParseUI/ParseUI/Resources/Images/parse_logo@3x.png deleted file mode 100644 index 80629f4e679b8a61d1ad22ff568bfc78a455b073..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9845 zcmaKSbwHDE*Z)Aeq(nM~43XXlX&5E20SbyB%|?$J5()?c3Q{7u(I6$=sf0?WAl*m_ zh=kJeyZOfR{{DEMmp{f8=X|bn&UMaxU)N^~*VomgreLK2fk4z+chv5IK!iA;-A6_O zeBQ>^D*^vlJk=k18o1hedRuv*K`JO$Yc#hO#>x(T4{e3=b?-*YgFsh!9Sk3OK13p9 zZCo)TR+lm&J{UJZ8w8S9@^Q1WaYB1?Tchn9Tok}NO)X$<2b2QXND?WAbW=s!JKTBV zfi`%eYiRSt$wmeRR#N1a_mKqvFlbLJZXb-Z3s%-g0sI%PEYQ9j76o(vCF1F%0RG#k zhe&;HRaXx*x1@-qu#K3w1h=$|h`6M<#BFgQZm5_zOjHaeDh?AChsuh{$cjsH|MLe1 zR`WpF%HC7c_-8GkrvSG1^mLOI74`P^7V(COxO&)$ip$8zh>Af)p-^E!LKy4o;%Vh0 z?1JU}7eNh;wefIp^K@`^;l4z)vUYv!sQ?Bn{o4hM+kaqPu>XV!2$-mkm7A!zh}fk| z{|X|J|Fx`shyQNN?f;7Rk1p!J+XA@qU;GdSj1j%u+5c~+{~ZF-=d$^q zyahV{$$Yd6knSEpUfWvGx`ROAbuBd&L!YUwG^7XHd%72L0y{Z7MDs^Pd3u?{ala6?ku9{^BHmU!jb%Y_roz7fTJ#C0={~r!iLx znB-QE?~>1EA;}p{Qb9{g@5S%VkWK0W6L&(Cz7XYP6a9gwS9U9Lma(0~fKd>bLDt5F ze4w|pDDzSs6iaTF1x>Y!8J8B8rAq+@0=q(Vjk%=={+jcTKuSgp*a`!kFuYOpcv0tO zh%H6ls6|BQ=3%E(UQ5Q~pLK)P3-ZsJ$0Q^HDa2hA9QN+|pYuDELpJ9%h3kgTG?5w4 ze42H+%J2|U06y8W(eEL`43QA(ck1(gY+hQpr!?fdQC6}dpw10#%MNHRtzIx3Z)}^_ zH%8vK*nhK11k9*Gwz4a6j^7`lrIY9bPGU@oj_*$}Ue1IeCRERTN~$NCDbCDlI`&gM ztJ=tbaZoId`&OK9>1W$(Kc4~(L8XjX8ekZ3Fr#3lFmm+iZU$T$j#b&e^cBoNljW7$ zGG^i5pkYt=*MMmOBCp3jomb-TSeV)La31Ss{M$7zc%xbNx#e}!yPWP)ETEu_dd`s0 zZJ6@hZ_EMTuT0#3`4A36{G`J>rmapH*w2v>PydaSp8A9WDTxk1V*g&bkqM9Wm3=`E z$OHQ^2d~=m;bIH=yQfkhiC1hI_*yNq3Hw{yJh@-FR2C0-r1FoxUt!IVr#l3Za+xh) z2Eqc)vfR$o3CyLpVF)s7z8_J_x8k~8{)6@gdqRDFe^UG8D$oT2rmU+lr>e#Kmo%LAFX;-}%FB1n<>crTVjPlrRe}NN zb3=KE_{7X65%&ke(*DurR_tDM&ZAGp;>iIC0R6e1RGf##-`bXnGUgfNc7J6$VEf(4 zzM5qP)IYwq)mP$*d;i{lqN;@aDV%5<2{)jqjDqu;PWIX0FLxS1?CIE*#UcKl5UY_# zrnIQ>u){8w3q#n0CjXgP^K)+=X#7{qvGHt3JdP0!WF?SZ5=?l}yJVZtzk^I&z+T3C z*=|iSk|41E!CuDol#eL7O=1@8TyOPKSZFO1>V;lFeAkfcioO|sT z_l<+B_)ukeFEHc1oEI_v=bZ;>a)RB!mY@o0s4CgLlLaddOEvGZSZ8VrGV4D^wuCi( z5ICE9>56_>WJebu)zt5V(P7EiB{9Pa3$4W- zq``V=SWeT`^uxM{Qb;v_bMsrt#2lo5wKG}oB^wxozZiMxO`5)eu(9f)o^B*#%FqJrxyzaHuj~bBSL$MWu>_^4-DszZ!io*S2eLa*K%HwR3FX! z5YQYTZ!SG0gIF|=S}>e!C`&X5mPlQKA8L+>4x*9^7b|ui&8|ro>FLe>=o3Em5FX{= zeB;rMv3O{+==JV5M=W`kwU8wLA4xhp+mJo!PpjXEyQ5YZu`*w3%1?H3-!_oU)XLOF zj+kqeq+u%j#Q7{j0e>z~OMN0WFdgwCOF5^3)Qsq(`k}!sNY$EGH3R!frBMEjn_EcJ zJjdyNA7c|0`-3)SCukdF#e?0}e>{8bx54HOL7nQB(Y#JMn*3f5K@I1*^}%c@zfsSf zn;b8`$Jw!j3#LSH?#xDhev-d)I(nrR(-C{{bO}dJabM~7^|1$abV=706!WzMM2sJI z)fOr4cbo)_1^Y`M7MB)vI`PH2n5d!PG%UfC8v(-857^S5p8FRl*QIqkc2->5Greas z)^`4EWO(P*kHGp!6v8VZw6J8?n}3_q(uhXIzGJnIwaARP&C$_2=QBiQ@%Hc88{~** zjwVyi*aeyECLxI&{y(ZXD#E*nk~4P;YZlj=(sAy|Y&x$eR;2K+-sHMaR^pelQ`=UQ zmnx?=j1K8$E^_6QoE&%wKXm<+6o?8e@gjUt`7zV2^kP6eg2YEgzbW3uHqW_f?$9|M zGjEhw2L0_nmaUN3sG!T29eEqfa4%Cl6k0q*92=DF`Xn_)i;!uuJ{ zkH@H|wOF!XjeVA;_U`kctrF)3#1t(X0YA;<3XpFJv3Wa6qYf@LIesNAx>@DEC7rpx ziuuCn-OW}_xz5Y32aiX8P70NXS4Hc$rtF?Sus|v;n}R3L!n;CdZ`!{~HnGNpjA*cN zq672FA@9a$wxk`TO1uiI2!>kfO={2N9?kMwJUWNHpo+Xo>3bZXn^fS*{k5aJBM=u_ zPOQq1;wQKe0bcx{?pYt@q`JxCT2Y3~6!Yas_5IZq9w9K5=c< zY)67xSe0`Pxy{$b5O`J7?#O}9pmsnyI2~FQ_@_Ey4S~^Re&k7SZ*;#Yk)>KMOZ{%w zLA^pz+>>$-^l=64>D!Y*J}^UvCrt%g8pL23Q%P!|#xi|)lCB!E%BPz7b;6-iD<`qK zQp7g(M7F2yjki{bc3m5E!5jbMi=M9#21@l{izV>2@(O~)H2-pg?yTu|SP2cho%~^1 zwF(X0(q|Yund2gy@@*5d|HkOb=e%tC&iML#T1)=PpT+P58VSFS@3E21xExJw@<-1c z2)_@Z;Q|#H+5(}sld?u?kZP~Qmn8el*>w)TJ%k6HM6ji>I_gMI1BHEQru>45J4c4& zjP(awa``wCf00|WqJACk9M>W~{ZKMIGNk_?ar2ilAIjEJDr86v^*pAPk%d35;q}k0 zTyc3u@c<2$wAVEj$jzY@jRJ$}Dv`opNJ(9P?Jyp(S^rPo#pznIo3QKjwIXNQbq2_! z$rQt%95(MMk!lcTiq6e>O=vyO4yN)o=UPpRXgS@w*nX?jy*9l#sDVM7oq{M~)oBI3 z{WdjSGDP2|Fm(F*N$uS-I72M?3u#WeFGIx&X?rGnlcTWseY_4)zPg%r*AIu!_s+(r zk+CrM!4Ok%#iuMqp@^qrJSZWYl+}}&t61nn@EUeq-5v~W)7Q8ORj0Y0QBpH(L-?Ov{24m<&AAbQ< z##H6la!ulzja$AStKs@XxTV*!s((>rhzO}{m*5m9r|+82xybWDA2f?8m9BJgb)aW> z7bTC))}tu_{`>+WTla;>Ur92UZPQ-gQ-7}0@#SXnWJ1}}+L#JUrBakz4fn_2Vvm9A3dfkgaIG49U5xWPRr3755#DRfD=hr0Ss(@ey}2 z1Y?x5hE#gJc;e2yQ6mSSJl6;S5I}zc0T}a4Itbc>- zXH|>=FQa9r%Tcj|`I0M%op8X*8$!8@2qth`+YWs);?cL@!KuEhI3f$h*r%nschOSO zWQeva^A3AaZ~g66`cfk<=7-nH=kn!$gi9_C&8+ktb%N$7Ju)bv`ZE1(IjY4^YB|gva zisw6Lh2YiPqp!EsQO{vus~$nUc;y0)9j(VbGv1D(-udgdd|z0CcG-1|i1>!xRyGcU zqggdjt87+@(TDoWA{L6i2N{M}M8`)tb$5SKk+B6RyF-2;pWjMGbJ&_5aSl`{quO~) zQ&?}Ms*lxY8?VUQlF!xY$S*U};TBf!oJkEFld&=1;doIui9xxH8mG1 zgse7EO|P)$uh)cM+3T>=P@YVBmG_E1V-gRSmnPtW?ti>ybt|YM4_DcF-#D|cSmBmc zTBWrHLm)4i%s!dgfWy0j-EQ0T^A*<%H(MAGyu~VP;)XJ9%pED|Sgr7DN*_jujF+2A z8}bUX>n@yP0^4!@YN*v~R*hbvU*Sv)>8H;JeOG15I|N96v2~4i9-+i14P~iiyKTYH z{a0cUG_u#eUF+urzbrJ!`wcqtkJMv|d)zca&YZ*<^jT94(kCw)LC@%frw}sbuWRnk zq;`8{#XdqbS^1M}qRU!0LXY$Jj-?bsEKczQabCA|`-j$#*P7o_>C&}YSTYegYfZJ* zyzEHkh3>Dkt5Ow*deE28w~n$z^icy6l;Z-HM9w3h*BZ>Yq5DxH0{jG+0*IGQiqq}9+ZnA-qr3W4El*Gk zbCe_BhRji`j))Bg(fw#h4@m~KQeR?j(4a<_cNl^w&sqTGn8~Jc7vhLmME~F@8+6Ea zc2n4tM8;Do5`6UY?qQF`WwaUwr<+xQP76bR*(hQ>!w9o*#E68o&ZME%E3vqwRzpf} z0VAR;XIP_AYPQ8QH}c&W34^`(=<&@yXH6O+JsdAIpGzx%k~W#YT^2#cpRf4Q&{ul< zEm0Rsf4syFvrgo>!s~7X5xTYIRTCnXj(qeZksGOXB%P8U^uu??*U$5`6Tj@9a3JGv z3;*oDlYi^G4p?9|iTP9zHfB(!t0DL1Bk%F}M@@`*gZV!)Ob5%dac?@-jt6LQ z?(T1iS1_vX4wV$CnlvC)4?ZjYrc?(u&G4L!R|q0VefmC|nk{?q{cx?CvAvh_XwhDh zXPw0@rXz1bVublYOK{?^Nr@9Ts$@7!Qv#B24PF_?LgHk^H1|w1ClH~}M&|2eo+Ht8 z6Dl+yn|<^4s)wO`Qe~faEP=Xd-#t-4#uJyWowZb)^(-Uns?kpFlP?!%zHbpM(Sxj8 z;}Hhd?!&FRA_uw7_;<$ddKN|{HovJs28FJsPAvl&-no^~*(&PLTcCgCp>Vau2xHD& z6P1Y!uRq)RfxB*&mSb`q#{)Z>DY}FXy;ldAd5f)aafmz0z0lu@9gF6(uzoc7+)^e`lhzO6# z`&D5zond`PcZ0ohd3`^jpY>J4gi!6$$YVC8)oO1 zR727|>4hvTH8XZu#CF3UCp0{xDZvZ@tVv;gyE%a+QXwdzQ&pMtt1RR?*H?58jJx+` zrBlTZgr&+3zOL2JTuUP|`uLLz&n=kRsRM?d#(YPh>|DnR+*i*v_4ne1jqjvx3ff#t ztKpL+_si6iI=Lm(Cc{>c!It72p=%p6qaVicydzZy^)AR8F4q>KPqPW{cw}cRdDN_q z+O8WK59T8Toltcky|6di1ok#HvY%*rj>)qIdZ`fO5O;{Nh}mpS&4;~ZE5YBR(_+mY z8Temxc!X(=jb}}Hs*FF6CCY#QqLDpwewu(OyNZQyhbEz6%VYeVyU5|5e6AE@ z(_>K!e5Hsmoujsh`wgzQA*_^6zKTBZU&l7bkEhs%$pgEH*4bC=OLNaXOSk3oDyv$a zsDuEQGQ@km5dOFD+_Ho}zAoVdJSWGc>oY$ls4p27!UC%FZu45Y#5^Vk?TD{YN2WVu zgFG;0kZO6wr!;@~xc<4Hg}aYIZr189K>S!extSBd+h3Vvdm=1pwZSX@wWd-n-*``IiZNT*2sg?w=N= z?&`{vLrys7F4c=cAgo%J`2E;2`$k=&{BE~73bq&AF^VlsxUMkWgh^4^T8!PvlzoLU z@@*82yRKWt)r&vlN@+XCy!}MsWC--c99WDX(`L9ZWW>q8kmXH{XG%$m)1xG~SZ6UQ zK#U0l9cQKm%KoX&+W=+qI|_>>44olKYjieB@2MAVn~!{FQLSm?`J*OHpa%IgP?O(U zTvLDJDLF_r=hKRIME|(##5UaRUEiv-?>l07$yhB21HgPqCN0%f`4&Z;CPJP06?PNvF$#b0|C0jcB)T4&yoV$6+9dx{TehLO^XMZFXo3~auMAcT%ayu zzB%~!ixcPMtt;beg1+&u-{=T|`{%ddftx0ABILw6$Kl;P!YaRH1f8;>3IEWSa< zKH%Fh50v0V$F*7Du?}k0EB>6;FGTtWVZmMoLq~TJF{i2y|9)^ghaF^j9ev#l_c3eJ zpiwbq3jJZ>Qqh_YM}`0ep4UTPs+I*A{(iFUGf2wG24=9lX{wod{}R&N6!%eFYN|fO zRp4XUHDWagilT{{0EAzbCAMF$>Pz@p!m-n^Pyv8}K$cTrY@~9)wvWH!^CLhM;8Kb7 zHIHzn{M7^0j#loA@8{E}-zN&Nq zCr<*6YdB&gBL^Q61mdiZ{$NNLm$nKN|FANugP1QL)S9FXTxuqK)ga1cFUan~sI~DR z?pxLwF6O??YxquppInb1eMx}s*Ohm>!LDrD9DcTce`&z>-NNI6oJf4A=WBNjR6Fyh zhY051N~Gz;tI5qqprsu7pHr%8 zaBm=1v0@lb!QWI5c=R^yT{+9ROx(aw9!FDL-x~;P8ZO$FfcrzmC=I{7&#Jgmu!+yl1Z7l`Vme~;WNyO zKVaHI$(#+i*AaZZd$nZT%5ML5K_sDp5okB7V`YX1^qowpt_LNeFjvQDTi)@>ZnFK> zK@1pb<(%b9<|Tc#m$;pi+r*Tx_|;KW*(cZc>ylFTjDCrC3jfpqF^hLY;zUEJl~rZS z`T9YkZa0FOw6n0LDu+p3N*7Pvcci2@VK^iU4c~WvsVAlQGxy7~=s}G|AC~LdG4rav zm%Tlz^ubY6O^M~@JsP_sM{-j^X~OTY^ry{bKFuz4_+a7~#gx*qFJcDKK&85G8$KeN z>{D#Z4Az;MF|lzA8e%6lDu0jb^1oT(vBEM@zTEuGMd55S*v<{8Z2PEaCko>HF;~Wj z){rE^W`6=QIQD2wzm{su22ReD@e9XyUTowy-jc2z5%(4-b*ZbIu^53=#gUh-&A%j| zS0#+RQf1iBbO;$6x$;YYdEC-32_GqC!LrfC) z`EObs_ZwKAFdDo#@LAhUr_YiJV_t7AM%?Ho&WKX39eSHVEhv^StK@o`!2{)C3SNfB zr&0`4^R!#ehQFO~8aezV`>^gSe56j8%>D&Kau0tU9s;c9e1z)r z(-BsFs`{R(B~F%mcDMewUzzcfip)vbkNHc%dTyL@_XE>#;qw~TCX_VFu5_$F-LNO2 zj3pOejFXi6h?A5O`{0y9o6OyKwfM>@vx=oO;r`gNzqaKV`HXAWd-0X(uGE*47q7X0 z8p;Z7#dL*CWSeB{G4ar`&}??!JgvP>$bhFnG7!D{^I*ucgecFc)@sv1(0~!I86-u0 zx+B`7+6jF50eR`_OBs@v5~2L^S!inr4SS5cb1Lm>+@@yHfrVbjzS zs21D&)v5*NtcHwx=~6aASEf^uibMA=#B#k|LW=XQVs|Y>OVZWT?Bzlz`a_xS@tLjX zS9tSU=@>nsOAbSXC13)x8knGv7jU+u*PnN_`!WvDmfQk(RO1@_!N}*(Bd%AOgq_Hx z?TRs}Zf`qm7G^H=^;gq%qL13T_N)ZyPFyg5flpTz4}`@4MoEqbZOF9r>^V|!; zotc62`VcQ+S3h-w`5nm;@P!8%G9ve_45o7E?uoQR?V>|Yl+HR{B#9aAZTEq2p<2Dw zI--Bnj$7Ly(W=+j^2bRa zqHI+;aD}RNJ%yi8rnV=rS$oo_MbAV`&ib_@dZl#d|2%qmQ|P7k1DI>1suRN~yRmia z52Ff-=e#-({|qhH7Y2$i*JcZHp!oWwGA5uxV z)x2dbvMndpC%oZSidhWxtP67X%G7gK_+*+99y%*t`-W_jlNZWEJlZN7 zyHUIPmmUmf6Ec{ySuSR-f|r zNP9n>OpGmbh+QhP7w;SjyFDecy7<@&xnNEG4O~6DTb~%53uC@Fz^B1=8d7o_o zhbKSr+If5WMFpdl%W9X0(oksg68`4P;mmQYFp=@th?$#c$;LKn9QUb#bAt0D+sW`Z zXCszay@G>ZXo}~1m%sI>>mur+LmNhudRiv%wf~@%0!69iH=YPx!IBva*!D65H|oNG zUm7$!LOYeBxBx?BNrj&pq^Xz34l!C^nLP!k)Z>Mt*CbQ?SE8Krv2| z2C-L?UWW<1PXt~|1kIOX^!@70%N+g`pNzY-$OL3@CD623Ud-f;t=>2;16=_0Sx~^I&-17PV15>ZR6aWAK diff --git a/ParseUI/ParseUI/Resources/Images/twitter_icon.png b/ParseUI/ParseUI/Resources/Images/twitter_icon.png deleted file mode 100644 index 386d40b5cb5cf75791c2288890d4b4a72a6d1ea0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g!!3HGbRrPd%6k~CayA#8@b22Z19L@rd$YKTt zJ!KGPtXOJa22^l5GbExU!q>+tIX_n~F(p4KRj(qq0H~UQ!KT6r$jnVGNmQuF&B-ga zs<2f8tFQvHLBje<3ScEA*|tg%z5xo(`9-M;rg|oN21<5Z3JMA~MJZ`kK`w4k?LeNb zQbtKhft9{~d3m{Bxv^e;QM$gNrKP35fswwEkuFe$ZgFK^Nn(X=Ua>O75STeGsl~}f znFS@8`FRQ;a}$&DOG|8(lt3220o0wj1#pY6q)xAF#9-3GhTfTYzh5XbW&)OfBJGkFJ zu+};JbB1#b8{ZPMgS8fU%=WA=-B)ft+4{oq*S-T`-x{8HN3`T}y=}Am(<0n@L*=br zN!J~r++5yY&OHC6|1~`0T6f5@HC-|EV$W**%kM;!G}X!_M5Iz2AImKJqkrp`_6+aO zoMC4Z!q)9=?B1~b$3a8u4UTG@!mk%6m2NvOv)Yb(7IRG0jqoP*0@l1IDcUo_GpwH3 zgiR@1fBg8WvIEL9+8MtrY@7RF-}1fT3omDG-=kFKlbOBKu;l->hhi1Nce>&X6Ftt! zXU2Y-o!5QxS^Qi6u(OH6eE(buq?aW`bX;0vbP0l+XkKt)sB9 diff --git a/ParseUI/ParseUI/Resources/Images/twitter_icon@2x.png b/ParseUI/ParseUI/Resources/Images/twitter_icon@2x.png deleted file mode 100644 index a319f37bc37a45f047924be92b7eb15a66c94983..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2031 zcmZuydpy(YAD_#}ayjHuxowl0%H|Ta+2vqvM~PJ~p;;^(X4<}N$b?i=PD3sg=_aLq zLPhRFq;kn+F3FP1aY=q1#zD#1s&mfoa-P@g^E{u==XrlF@6Yqc!*z9WP=aiRfIuK6 zCr2VleC`y>mUVLCeXg%RRD4J=Ne(ukqIR7rv7r#|=*0wqkOmTwV&@Yg#ekQ=2R#AL zeS0zfbQ+QpKtD=FvT5OBGzf%cW5g3XoP@xvcT}Tr+9s-3zv5bIY7!uL`d$`!b!Gi!G9D_o!SS%#V97$&cqD;|fG|I#b zWoBk9Mi?`r!T<`}IE-oVEy zXp}%IiAo8G!lM2c@pq?KNlMIqMle;(Rl*2wibegO?>ioglFx4D0klxn&%N?zk2j+95=6R7-L!=%3^H#lY)_VOZ`%g~PZ&});BTtC$;F}L8=%~g> zZR{w$JZJW*YhCGNH-9RhabL(*zv6jFF_fz(8*!;nt9VUrKX4(54qo~Js~xe?bc4vi z&pXmFF7r&MD8<*NoNv!#$lB`2sJR!Yn2#BM5w7b^X!{W@+wR;@(QxHP;SgurbGNWi z=as;2(aUUlX0~$n7Q@%;d(RzV#Q5($yi+Q!=P>7F4c~q;DW&ONfD7IMlB)CdI7iK>GZ0?cX5p;NnMupV7nFh=o`UT96Rqz8O1E{!U^0S=csK z%WrtF$H*Y}%eonGNwUYN;w2js<*X5osHXEycUTUCJmPhxRuj=YXE|AZ8MmqnIYbym zu(qm{ufjh*IPz3V-NSO+_dIvz>>WIYuVSY*PPSia z_$d6Ohd?{N9_S32uq)oBP-xU4Uotn@!V+PwDdyDqo?><`s*c_^bKyl4o6gN5+V{Cb z59k_ZWv8O4H7rp#pBuICMozPv^`aX5EPnaH*no+nzZOPdzSdRlJFkaY)LyECHp77& zC7Hm+z7pM6hag>>PALmFu597Rc`D@$D^CmMLikF4(s^^v4s8a+M91SQ_vcQ(NYwE@ z{4bCUUjE_+UG?{GruS+L7O<5*NXMMJc{RPU|8{<9@7?QG73XlX5U6wVs&rZ3;3%JV zw@lNjNqPN?7X!^1eS!DQOYFurP}?e6zRb2eO+vQU`oHpc6>3^&>Vw zSx$rA3>|>#-M6Ex65{66!Xw7>pSpxR)h&##e(QETB%ojfV^Mg^F6~ohl4v&XLebI_ zQAtnGeBUDz4WIE=gVtap>qfWo0`K!-0fGb^#&27v z2_4%E`DC;12CPFaX~5NfJ~BuVZ?GRWafM=PVmB*&AwGkDX+_5RybG^#-;hs}VBzqp zluy$}PX0lE>c?uB~A*Kx063Th@8|}u4-0I@M8BVVtBD6voQynP#v}686Uc2QIVxhTxX?Ir1 zz1#=s?}NM1%J68_Y+0H+310gdmo2BC4NxqLICihbnb z6tVcF!jjq^5b3mG$WQEuyBTfJS(eB(pr$#~`VEl)dcz@PZRJ}GyNBaiSV<4|%!l$4 zDcW)F^RYY+K{V%ws}1@)&e2-y!3{6t*C?OmpZHc#vooGxiVC~-{3v8|Nr6@m2%`b| zt&5t&W46T(1V6x%tS?KBuUuN#?seUG%cx-I@ei|>Pd1mPbj4cSNO_q0CElXGQ0q!A z;;r-%Fd@OMsaE**-ZT*rc(`ZCb|CefEa}t5dwSYSt%DkTpG6p8x<@MqT)mqXB3uJ= wWUA^TKN|L1?YN?0dEdS)1@AS{O?i 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 - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ParseUI - CFBundleIdentifier - com.parse.parseui - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 3.0.0 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - iPhoneOS - - CFBundleVersion - 3.0.0 - MinimumOSVersion - 12.0 - - diff --git a/ParseUI/ParseUI/Resources/Localization/de.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/de.lproj/ParseUI.strings deleted file mode 100644 index 7f8656356..000000000 --- a/ParseUI/ParseUI/Resources/Localization/de.lproj/ParseUI.strings +++ /dev/null @@ -1,98 +0,0 @@ -/* Additional */ -"Additional" = "Zusätzlich"; - -/* Password reset message in PFLogInViewController */ -"An email with reset instructions has been sent to '%@'." = "Eine E-Mail mit Anweisungen zum Zurücksetzen wurde gesendet an '%@' gesendet."; - -/* Cancel */ -"Cancel" = "Abbrechen"; - -/* Download Error */ -"Download Error" = "Download-Fehler"; - -/* DOWNLOADING */ -"DOWNLOADING" = "DOWNLOADING"; - -/* Email */ -"Email" = "E-Mail"; - -/* Error */ -"Error" = "Fehler"; - -/* Error occurred during deletion */ -"Error occurred during deletion" = "Fehler beim Löschen"; - -/* Forgot Password? */ -"Forgot Password?" = "Passwort vergessen?"; - -/* INSTALLED */ -"INSTALLED" = "INSTALLED"; - -/* Load more... */ -"Load more..." = "Laden Sie mehr ..."; - -/* Loading message of PFQueryTableViewController */ -"Loading..." = "Laden..."; - -/* Log In */ -"Log In" = "Einloggen"; - -/* Login failed alert title in PFLogInViewController */ -"Login Failed" = "Anmeldung fehlgeschlagen"; - -/* OK */ -"OK" = "OK"; - -/* Password */ -"Password" = "Passwort"; - -/* Password too short error message in PFSignUpViewController */ -"Password must be at least %d characters." = "Das Passwort muss mindestens %d Zeichen lang sein."; - -/* Password reset success alert title in PFLogInViewController. */ -"Password Reset" = "Passwort zurücksetzen"; - -/* Password reset error alert title in PFLogInViewController. */ -"Password Reset Failed" = "Passwort rücksetzen gescheitert"; - -/* Password missing error message in PFSignUpViewController */ -"Please enter a password." = "Bitte ein Passwort eingeben."; - -/* Username missing error message in PFSignUpViewController */ -"Please enter a username." = "Bitte einen Benutzernamen eingeben."; - -/* Email missing error message in PFSignUpViewController */ -"Please enter an email." = "Bitte eine E-Mail Adresse eingeben."; - -/* Email request message in PFLogInViewController */ -"Please enter the email address for your account." = "Bitte geben Sie die E-Mail -Adresse für Ihr Konto ein."; - -/* Generic login failed alert message in PFLogInViewController */ -"Please try again" = "Bitte versuche es erneut"; - -/* Purchase Error */ -"Purchase Error" = "Kauf Fehler"; - -/* Forgot password request title in PFLogInViewController */ -"Reset Password" = "Passwort zurücksetzen"; - -/* Sign Up */ -"Sign Up" = "Anmelden"; - -/* Sign Up Error */ -"Sign Up Error" = "Fehler bei der Registrierung"; - -/* Email is taken error format in PFSignUpViewController. */ -"The email '%@' is taken. Please try using a different email." = "Die E-Mail-Adresse '%@' wird bereits benutzt. Bitte versuchen Sie eine andere E-Mail-Adresse."; - -/* Invalid email address error message in PFSignUpViewControllers */ -"The email address is invalid. Please enter a valid email." = "Die E-Mail Adresse ist ungültig. Bitte geben Sie eine gültige E-Mail-Adresse ein."; - -/* Username taken error format in PFSignUpViewController */ -"The username '%@' is taken. Please try choosing a different username." = "Der Benutzername '%@' wird bereits benutzt. Bitte versuchen Sie einen anderen Benutzernamen."; - -/* Invalid login credentials alert message in PFLogInViewController */ -"The username and password you entered don't match" = "Der Benutzername und das eingegebene Passwort stimmen nicht überein"; - -/* Username */ -"Username" = "Benutzername"; diff --git a/ParseUI/ParseUI/Resources/Localization/en.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/en.lproj/ParseUI.strings deleted file mode 100644 index d656c63c678f99ebb63d5102d1560e16e44267a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6068 zcmd5=+fExX5S?efVuge%@lZaXs#*jDp(02Nl;<>A0&3W_Nhspy+n!^~%-G&tmUg)) z3S{l^+~>@A|NP#PO(|qsCiq;*3g5X@GLjiqH)TuKWW9EG9sBR`ZQ6Z@lWRCn?nCff z;&Th$3&<((x5RS^d4*iN-%HR;@vDFal{+(#L(os<0MB2sTH^eU({6?Hb7(lj+5)ty zCr_5(I08K_xW)gKT;i9NNC``#8*?G7}qU_}{4%&w}Q@v7yr3)^nNXNLbH7ok0PhhDb+ZKF~t?NqVUV>y>2 z#Q9jZWfze?l6`nJ#B&$x`M#A@zi(yinQRDrbxnEMwfKDQ2lb6TAL!Pl>HHjV8YAaO zSvoII+!OP03cDvRimVD>h3W~FSRf{k<5H*Nzi_cu4P0hS@s|~x*7pY!!-ptUyN4;Q z2F#TcIhAc>&!Oxgd(>O`o=U0PvwVp;z5=eDjU_6bALZUep)#5&>Li8er#Lv53+LN` zd`6ZK>F!|f2-rm2>xPIy6EDMClIt1oraCe+50Ig;2f}L1O;>X+lv2PZkIg>+*=J}O zvxr&0a?k(M18DISoG5ExWTkr6QCOXi<&&|PPs+hRS?aU`)K}?_a>;kvIkNw-11-^| zh|BaDeHTzV%^z>!5MDTeKc?`=nf&OOH>qyy(l@SW`rcT;vy{*1vA6U0hC{Tm>!Ay* zva?dZWz;MC=iKf!+xM5Sf!N8}gWbNb?6c^Q+xNxEBdRyYz7R{*-69+R=eDM)zS=yH zo@uxA8hOh|F_Vcb*4lovJ>)UxPe1Qb7Bi$k&BW8Io&1LP70~shwfGFSQ4Z&A+QTY) z4HmP~tzO+Nt~+Th)+y_C*vc+Z-cN{K?aWU#*+}&H>AJVa$mXo|ed_?Z(5$$D=eI#&2DPzhs1X9k@@KX0BL zp31MhBi=y^-c32TR1t<-)TpDhb`71MeRpJa6_{DIcZZuv8Sg%oUXU=s*6H=-bSiPMoeSnS;Ql@bIu*f zcbDaHNAoqwn&mY0`033~A*VGM5Z+vncdQ3b#&{C4nRp($FMA>15nbTJ`V8+y>hbgC zG_c+$p8kSIXV9DPom5xWbc~6#slQp89u8Gq=ZjRjj|qLP`sQ&-XA`BhwpsLk3E4IR z`Hb^a`JekcoksNS-D7HiILn*Y!%1XTa}V(iC#yH_Uw(dJ?o&gLN~D}1UKQTb5=lLxGKz}c&mqft`3%`Z?R3%)*pTk1 Jj`@z~_!pRg+vxxR diff --git a/ParseUI/ParseUI/Resources/Localization/fr.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/fr.lproj/ParseUI.strings deleted file mode 100644 index cf2015c3e07f69bf478af9b70b81bd6c8f07f5c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6542 zcmd6r>uwuG6vyXtpJElMid2d80T3!tE>%TtkOn@xj^h}73AWo1-jKK8BjF){|L>ek zXLfcsw$&8SYVF;*oXh`QXaD}|Wq1*)up2IQjlxp*EKEZ$j5YcqybRC6R_pAR=D*V2 zHT$J@KGS}vpNZZ=*R5#J#i!EmK<@+btHQ*d7g{saQzZ$ew&yS$Y5g#~(fjur9ccfa zNw?JgnIs%*Y_7FQPIeANv8VNDaI61ixYkq75e^HD&%^uB|ETjqtFBGbD!dbwfysfC zQkZm&%@XH-I3-IfeTxi^X-KX+Sk_#WQ1}z&r7Xv`6gNgzbgE$``2)9dRCID z((_U`+D%1!7Vhkgb-6@2>U-KZl?($zB4U(}CJlDAaw;?&(XEiv*%!B4&5rfoGwU5l zE-a8^|JbU;$9E3IiM_5ldX07W4gI-!0X_lhr6i}}hj1dlI1RgDU!HLiUW-oDZC~Tf z`NaM0Bb*%BN>a>Bx<$eJAoHroFO4N0`B;u(8)j)N-w(EqP+j}9x{{22U7*NXBI?rK z@Ur0pve+`lbHeCTsI*IokK+q?xm$E>9=ni4H@ZCX7V>Q}OI@c!+d0%PnV`%QuQV31 zUbQmGcKkriWx0_o9*3 z`jNprW+r+9i5j0lhnE z-7{PUYv$P~v-5C`lDvB@aU9p=5djr^6$I;e#L-0aTv={p-bGdz86L>q)P1N~=v_%C zYJf)v)?qzf#{Q+fe@d-!>7CbM#w*GE+k?gW;(00gd%~Mq83CC+(%F0{$x)bhD*Dm?NLFG>3&+f7umr6;3j%dX^+C=m_Z@vdU|6 zJ#%mQw{@)Khbc28jStLYV$arA&(NT&L! zZH~ZHd0}E0ZCkdd0-+gMs=cR6XO;g02KDpP=K2#M9$lr)Q(x>kO2&-%lu14?hvmcWi>kSQWp{3;(8Xr~CBW z$vH087Pw4Q7x9x4yVn|<>Yi(FUwg+|ySmT$T&N=PouuHrj;*J)x>4qdxwQR4vZH-Z z`$Ugk2U-)miBz|+Nc*Zhi>K35+qr};%xRQo%li4E%!N&#eVQ&Z)!ydm zCuzm1r>H!!|EjD5OFcn-Jn^OL#`A~}{LR0aG%Z-)U+MJJv|sm{#LxG|uLF2_^HkZ_ z*uAV6yXIJr^7yIySDty$feyA8elpGKovX(``GKs2XZuMh%D$>^&HJpk*6G*tP5e>= z?YbQ7Jp0(iQW0a6QIld{z;__N(s3Td3SPl;9(jg3Dl$;wJ_x^<1mqeh-iIIc#R(aX zjc#7&+v1nlkKebv^848aiArhmx=$YepuN;Ydh~jJtmk6%i#eb>ldWqR(2kj;%`#;r zaQlFJlDBE2vV%%%bKP>A>`7;QE7v?$!8$jpK$|_<`mUT>lA&2gntj*jii9TGWp9gaj-V2Z$`QG6> zM;2*#etyR4j-^d|tr$lo((s#Fd^fA8cUJg6{gmf0|9Z){!EK8T&%a=pD#Q8~^Z23* q>^_fG;>A2Q!~2DWIxi%M*zt{x(@=?iGlF7PDQA-GC!)OGncyFmGC;-v diff --git a/ParseUI/ParseUI/Resources/Localization/he.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/he.lproj/ParseUI.strings deleted file mode 100644 index bea566232eb09eac3f920397d8c610b774d1202f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5670 zcmd5=U2j`O5S^F%(qFNPR3TNOeFvcuHF1TgngA_4o7iz892;yy)PHG%(*+s*9my|xpPqRO&;@7~?n`8acC_WtwtBY7ZB)}?{Zz6|i~N=NF_#^?iiB==;k z^646$e}?axOpBx9qWG&=lTR`G9@bFeHe~eiIfT3(WIOyeao@xqP7d_Ck2x(|Iqcfe zH8pvL`7QYZ_upc)iS*J{863UjFH%x-rxp;jSaoGWmD6y%2ZRi~_)`GPS zjT({ev&rnY9UY=@J1JE1JG&?h&*IjKU12mSH^hDOVC%Lrji!^H~1GWEq}QT;wb0p)NiS)nrfcNUza*fmd_nc#m&O z4Oy{|D0bwf{CGpely^S>`dG(&y>jp^uNgnqTVCH+M%vN3*25^P9rf!c^^3KOI3eS* zUd{1;gnM7R%p0FvOSBoRgE2bGTE>;P4~@xmtp2RGcZIf?0m>SDt^1LKEymRq`8Kx1 zasI#Ua6ph{?JBD*qgL5>08}zEf%#$^?-t7erR?~8hsC{!2#1VF`^C7|dMIPC!xSA< zTz68tUcv%OWA93>*<*ePb}?IHy<)q}s+s29IoNEDjGUncq}Exl^I_P<8e%^bR$@ z3++5+$!WafNuk;UL$y8j!&pxRc5dKF;P+CrpJLw*zC9p#2cB+YpO)t5vdaCwe8n@< zD`>&98u_OaG3p5My#ikSx#mLuS&>JjicGKhn#6o?=nJi4hK_z)eOo=t_|7_XcE49z z#ZFgrzd5`3vtf+1yXkwZ>XbWfvtWpG;W91@eS*_Y!Mc}p+~keX0nPMunX*PYzuM=E z=a~G|$!8O@js42)`=hw>zo^LGa9*eER1dC9nINE>JRK?^ z>k;3E?Bc^L3~vLf8E;vBnFXHze*IAMU=_yWO1Pt$$#*TR!26mB`T64RYGS~7 z?g{2vNAs^-V|=$j^io65B+S$XeBOa~$bOy$8Ht#0c?z>`&M#3#D4)OY**p{ diff --git a/ParseUI/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings deleted file mode 100644 index 97cb0edda..000000000 --- a/ParseUI/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings +++ /dev/null @@ -1,99 +0,0 @@ -/* Additional */ -"Additional" = "Adicional"; - -/* Password reset message in PFLogInViewController */ -"An email with reset instructions has been sent to '%@'." = "Um email com as instruções para redefinir a senha foi enviado para '%@'"; - -/* Cancel */ -"Cancel" = "Cancelar"; - -/* Downloading Error */ -"Downloading Error" = "Erro de Download"; - -/* DOWNLOADING */ -"DOWNLOADING" = "FAZENDO DOWNLOAD"; - -/* Email */ -"Email" = "Email"; - -/* Error */ -"Error" = "Erro"; - -/* Error occurred during deletion */ -"Error occurred during deletion" = "Ocorreu um erro ao apagar"; - -/* Forgot Password? */ -"Forgot Password?" = "Esqueceu a senha?"; - -/* INSTALLED */ -"INSTALLED" = "INSTALADO"; - -/* Load more... */ -"Load more..." = "Carregar mais..."; - -/* Loading message of PFQueryTableViewController */ -"Loading..." = "Carregando..."; - -/* Log In */ -"Log In" = "Inicial Sessão"; - -/* Login failed alert title in PFLogInViewController */ -"Login Failed" = "Falha ao Entrar"; - -/* OK */ -"OK" = "OK"; - -/* Password */ -"Password" = "Senha"; - -/* Password too short error message in PFSignUpViewController */ -"Password must be at least %d characters." = "A senha deve ter ao menos %d caracteres."; - -/* Password reset success alert title in PFLogInViewController. */ -"Password Reset" = "Senha Redefinida"; - -/* Password reset error alert title in PFLogInViewController. */ -"Password Reset Failed" = "Falha ao Redefinir a Senha"; - -/* Password missing error message in PFSignUpViewController */ -"Please enter a password." = "Por favor insira a senha."; - -/* Username missing error message in PFSignUpViewController */ -"Please enter a username." = "Por favor insira o nome de usuário."; - -/* Email missing error message in PFSignUpViewController */ -"Please enter an email." = "Por favor insira o email."; - -/* Email request message in PFLogInViewController */ -"Please enter the email address for your account." = "Por favor insira o endereço de email da sua conta."; - -/* Generic login failed alert message in PFLogInViewController */ -"Please try again" = "Por favor tente novamente"; - -/* Purchase Error */ -"Purchase Error" = "Erro na Compra"; - -/* Forgot password title in PFLogInViewController */ -"Reset Password" = "Redefinir Senha"; - -/* Sign Up */ -"Sign Up" = "Cadastre-se"; - -/* Sign Up Error */ -"Sign Up Error" = "Erro no Cadastro"; - -/* Email is taken error format in PFSignUpViewController. */ -"The email '%@' is taken. Please try using a different email." = "O email '%@' já estea cadastrado. Por favor tente com outro email"; - -/* Invalid email address error message in PGSighUpViewController */ -"The email address is invalid. Please enter a valid email." = "O endereço de email é inválido. Por favor coloque um endereço válido de email."; - -/* Username taken error format in PFSignUpViewController */ -"The username '%@' is taken. Please try choosing a different username." = "O nome de usuário '%@' já está cadastrado. Por favir tente utilizando um nome de usuário diferente."; - -/* Invalid login credentials alert message in PFLogInViewController */ -"The username and password you entered don't match" = "O nome de usuário e a senha fornecidas não batem"; - -/* Username */ -"Username" = "Nome de usuário"; - diff --git a/ParseUI/ParseUI/Resources/Localization/sv.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/sv.lproj/ParseUI.strings deleted file mode 100644 index ca1c83bd80d39042a905032d96e772e834d2669e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6226 zcmd6r*>2lL6o%(IPeB+63gn`BfTBo^ST>9rv1>aiddbMNtZH*b#fBcRZ<4%1F5CX! z98G5-<)v|ofY8F>nX~+79sd2-OZUQ6Zr5Gt8oQM~3paPQn`-rid+DCJo!+NAdj6w6 zJMK5_TDit8wP)-`+Pl=fZ z*Q{%g!+x_SQ`#W2kSqU<3AmO|EO|kJqA|Yfs~;0($9c zv~Abj2#uv%i*N4LJ>hXHK2!bH-qwNW@J#BHyQrd+{f#a+(jC<19=)mOd!ai}9ChR$ zyI>(*kNmDZeV-Pb2T244ZgDMgNY_$)`*4VBalcue zqZ;WdAvx6b!J}%?bm8v|jY>%2LE^z8INJUtT%vvFH$lE5iMLRmu>+HE!T7e!1X zpRJ{DtxP6f9#&0r8D>kLrrR|fNryv4LXJRKO?gr0=^a)tyS9#e1ppJP?3NAmDQv^@ zPnv}HtBWNZ!6(# zIo#-Y~lMI$TO=PCkql@3Emxs06v1ny+z${D^{k6HvKeaH8ivQcXO0!_h z`)KQ*9m|+&tSi;(OWl6(&`j-O5i*>Zp@OA&JZ+W`ImAD4YqKY^h^b1smQT`Y7QE9l z=x)@XsZr!7yU^Eo*_2xL$THI3df7|utCb_{{5EW-R)9p%>%Z6z8ivn>N6UD1vpr6B z--h*6-9~<}EO?yd`CcXz%WJElX^l&*hUO1HJ6I*&9^=+C>5C7WD^7fE?2B+tY8I)% zQsS4hY0#Jnz|I$I{W2LtLFMI+>GW~fUi)2UOw}ewa(7)X-q!N%y%lwu?{bnbwBFg?KR!*lA{+Uq{`1o zaeB+wql7bmhR5nO+V1Ar=Z~C!rBhDuS(H_tw_|kkKB4w~#yV*(Kdlf+Ajo*=SP5oKo+?|BJRCr>*k=Zjnx0d($NppI zmk{?QVrCcl*zH_4t$+X;TD^htLcW>nZ8At$t;A#ZBM+ze{=1y$InQ&}o9VKwA_I|| R*O6{~hukio+^>;w{s%~#7FqxR diff --git a/ParseUI/ParseUI/Source/PFCollectionViewCell.h b/ParseUI/ParseUI/Source/PFCollectionViewCell.h deleted file mode 100644 index 3c7104368..000000000 --- a/ParseUI/ParseUI/Source/PFCollectionViewCell.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -#import "ParseUIConstants.h" - -NS_ASSUME_NONNULL_BEGIN - -@class PFImageView; -@class PFObject; - -/** - The `PFCollectionViewCell` class represents a collection view cell which can - download and display remote images stored on Parse as well as has a default simple text label. - */ -@interface PFCollectionViewCell : UICollectionViewCell - -/** - A simple lazy-loaded label for the collection view cell. - */ -@property (nonatomic, strong, readonly) UILabel *textLabel; - -/** - The lazy-loaded imageView of the collection view cell. - - @see PFImageView - */ -@property (nonatomic, strong, readonly) PFImageView *imageView; - -/** - This method should update all the relevant information inside a subclass of `PFCollectionViewCell`. - - This method is automatically called by `PFQueryCollectionViewController` whenever the cell - should display new information. By default this method does nothing. - - @param object An instance of `PFObject` to update from. - */ -- (void)updateFromObject:(nullable PFObject *)object; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFCollectionViewCell.m b/ParseUI/ParseUI/Source/PFCollectionViewCell.m deleted file mode 100644 index 6fb1f466a..000000000 --- a/ParseUI/ParseUI/Source/PFCollectionViewCell.m +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFCollectionViewCell.h" - -#import "PFImageView.h" -#import "PFRect.h" - -@implementation PFCollectionViewCell - -@synthesize imageView = _imageView; -@synthesize textLabel = _textLabel; - -#pragma mark - -#pragma mark UIView - -- (void)layoutSubviews { - [super layoutSubviews]; - - const CGRect bounds = self.contentView.bounds; - - CGRect imageViewFrame = CGRectZero; - if (_imageView && _imageView.image){ - imageViewFrame = PFRectMakeWithSizeCenteredInRect(PFSizeMin(_imageView.image.size, bounds.size), - bounds); - } - CGRect textLabelFrame = CGRectZero; - if (_textLabel) { - CGSize maxImageViewSize = CGSizeMake(CGRectGetWidth(bounds), CGRectGetHeight(bounds) / 3.0f * 2.0f); - CGSize imageViewSize = PFSizeMin(imageViewFrame.size, maxImageViewSize); - - imageViewFrame = PFRectMakeWithSizeCenteredInRect(imageViewSize, PFRectMakeWithSize(maxImageViewSize)); - CGFloat textLabelTopInset = (CGRectIsEmpty(imageViewFrame) ? 0.0f : CGRectGetMaxY(imageViewFrame)); - - textLabelFrame = PFRectMakeWithOriginSize(CGPointMake(0.0f, textLabelTopInset), - CGSizeMake(CGRectGetWidth(bounds), CGRectGetHeight(bounds) - textLabelTopInset)); - } - - // Adapt content mode of _imageView to fit the image in bounds if the layout frame is smaller or center if it's bigger. - if (!CGRectIsEmpty(imageViewFrame)) { - if (CGRectContainsRect(PFRectMakeWithSize(_imageView.image.size), PFRectMakeWithSize(imageViewFrame.size))) { - _imageView.contentMode = UIViewContentModeScaleAspectFit; - } else { - _imageView.contentMode = UIViewContentModeCenter; - } - } - - _imageView.frame = CGRectIntegral(imageViewFrame); - _textLabel.frame = CGRectIntegral(textLabelFrame); -} - -#pragma mark - -#pragma mark Update - -- (void)updateFromObject:(PFObject *)object { - // Do nothing -} - -#pragma mark - -#pragma mark Accessors - -- (PFImageView *)imageView { - if (!_imageView) { - _imageView = [[PFImageView alloc] initWithFrame:CGRectZero]; - [self.contentView addSubview:_imageView]; - } - return _imageView; -} - -- (UILabel *)textLabel { - if (!_textLabel) { - _textLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - _textLabel.numberOfLines = 0; - [self.contentView addSubview:_textLabel]; - } - return _textLabel; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFImageView.h b/ParseUI/ParseUI/Source/PFImageView.h deleted file mode 100644 index 63a68466b..000000000 --- a/ParseUI/ParseUI/Source/PFImageView.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import -#import "ParseUIConstants.h" - -@import ParseCore; - -NS_ASSUME_NONNULL_BEGIN - -typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError *__nullable error); - -@class BFTask<__covariant BFGenericType>; -@class PFFileObject; - -/** - An image view that downloads and displays remote image stored on Parse's server. - */ -@interface PFImageView : UIImageView - -/** - The remote file on Parse's server that stores the image. - - @warning Note that the download does not start until `-loadInBackground:` is called. - */ -@property (nullable, nonatomic, strong) PFFileObject *file; - -/** - Initiate downloading of the remote image. - - Once the download completes, the remote image will be displayed. - - @return The task, that encapsulates the work being done. - */ -- (BFTask *)loadInBackground; - -/** - Initiate downloading of the remote image. - - Once the download completes, the remote image will be displayed. - - @param completion the completion block. - */ -- (void)loadInBackground:(nullable PFImageViewImageResultBlock)completion; - -/** - Initiate downloading of the remote image. - - Once the download completes, the remote image will be displayed. - - @param completion the completion block. - @param progressBlock called with the download progress as the image is being downloaded. - Will be called with a value of 100 before the completion block is called. - */ -- (void)loadInBackground:(nullable PFImageViewImageResultBlock)completion - progressBlock:(nullable void (^)(int percentDone))progressBlock; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFImageView.m b/ParseUI/ParseUI/Source/PFImageView.m deleted file mode 100644 index 387b1a4d0..000000000 --- a/ParseUI/ParseUI/Source/PFImageView.m +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFImageView.h" -#import "PFImageCache.h" - -#if __has_include() -#import -#else -#import "BFTaskCompletionSource.h" -#endif - -@import ParseCore; - -@implementation PFImageView - -#pragma mark - -#pragma mark Accessors - -- (void)setFile:(PFFileObject *)otherFile { - // Here we don't check (file != otherFile) - // because self.image needs to be updated regardless. - // setFile: could have altered self.image - _file = otherFile; - NSURL *url = [NSURL URLWithString:self.file.url]; - UIImage *cachedImage = [[PFImageCache sharedCache] imageForURL:url]; - if (cachedImage) { - self.image = cachedImage; - } -} - -#pragma mark - -#pragma mark Load - -- (BFTask *)loadInBackground { - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - [self loadInBackground:^(UIImage *image, NSError *error) { - if (error) { - [source trySetError:error]; - } else { - [source trySetResult:image]; - } - }]; - return source.task; -} - - -- (void)loadInBackground:(void (^)(UIImage *, NSError *))completion { - [self loadInBackground:completion progressBlock:nil]; -} - -- (void)loadInBackground:(void (^)(UIImage *, NSError *))completion progressBlock:(PFProgressBlock)progressBlock { - if (!self.file) { - // When there is nothing to load, the user just wants to display - // the placeholder image. I think the better design decision is - // to return with no error, to simplify caller logic. (arguable) - if (completion) { - completion(nil, nil); - } - return; - } - - if (!self.file.url) { - // The file has not been saved. - if (completion) { - NSError *error = [NSError errorWithDomain:PFParseErrorDomain code:kPFErrorUnsavedFile userInfo:nil]; - completion(nil, error); - } - return; - } - - NSURL *url = [NSURL URLWithString:self.file.url]; - if (url) { - UIImage *cachedImage = [[PFImageCache sharedCache] imageForURL:url]; - if (cachedImage) { - self.image = cachedImage; - - if (progressBlock) { - progressBlock(100); - } - if (completion) { - completion(cachedImage, nil); - } - return; - } - } - - - PFFileObject *file = _file; - [_file getDataInBackgroundWithBlock:^(NSData *data, NSError *error) { - if (error) { - if (completion) { - dispatch_async(dispatch_get_main_queue(), ^{ - completion(nil, error); - }); - } - return; - } - - // We dispatch to a background queue to offload the work to decode data into image - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ - UIImage *image = [UIImage imageWithData:data]; - if (!image) { - if (completion) { - NSError *invalidDataError = [NSError errorWithDomain:PFParseErrorDomain - code:kPFErrorInvalidImageData - userInfo:nil]; - dispatch_async(dispatch_get_main_queue(), ^{ - completion(nil, invalidDataError); - }); - } - return; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - // check if a latter issued loadInBackground has not replaced the file being loaded - if (file == self->_file) { - self.image = image; - } - - if (completion) { - completion(image, nil); - } - }); - - if (url) { - // We always want to store the image in the cache. - // In previous checks we've verified neither key nor value is nil. - [[PFImageCache sharedCache] setImage:image forURL:url]; - } - }); - } progressBlock:progressBlock]; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFLogInView.h b/ParseUI/ParseUI/Source/PFLogInView.h deleted file mode 100644 index 97b1b1e82..000000000 --- a/ParseUI/ParseUI/Source/PFLogInView.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -#import "ParseUIConstants.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - `PFLogInFields` bitmask specifies the log in elements which are enabled in the view. - - @see PFLogInViewController - @see PFLogInView - */ -typedef NS_OPTIONS(NSInteger, PFLogInFields) { - /** No fields. */ - PFLogInFieldsNone = 0, - /** Username and password fields. */ - PFLogInFieldsUsernameAndPassword = 1 << 0, - /** Forgot password button. */ - PFLogInFieldsPasswordForgotten = 1 << 1, - /** Login button. */ - PFLogInFieldsLogInButton = 1 << 2, - /** Signup Button. */ - PFLogInFieldsSignUpButton = 1 << 5, - /** Dismiss Button. */ - PFLogInFieldsDismissButton = 1 << 6, - /** Apple button*/ - PFLogInFieldsApple = 1 << 7, - /** Default value. Combines Username, Password, Login, Signup, Forgot Password and Dismiss buttons. */ - PFLogInFieldsDefault = (PFLogInFieldsUsernameAndPassword | - PFLogInFieldsLogInButton | - PFLogInFieldsSignUpButton | - PFLogInFieldsPasswordForgotten | - PFLogInFieldsDismissButton) -}; - -/** - `PFLoginFields`'s accessibility label identifiers - - @see PFLogInView - */ -extern NSString *const PFLogInViewUsernameFieldAccessibilityIdentifier; -extern NSString *const PFLogInViewPasswordFieldAccessibilityIdentifier; -extern NSString *const PFLogInViewLogInButtonAccessibilityIdentifier; -extern NSString *const PFLogInViewSignUpButtonAccessibilityIdentifier; -extern NSString *const PFLogInViewPasswordForgottenButtonAccessibilityIdentifier; -extern NSString *const PFLogInViewAppleButtonAccessibilityIdentifier; -extern NSString *const PFLogInViewDismissButtonAccessibilityIdentifier; - -@class PFTextField; - -/** - The `PFLogInView` class provides a standard log in interface for authenticating a `PFUser`. - */ -@interface PFLogInView : UIScrollView - -///-------------------------------------- -/// @name Creating Log In View -///-------------------------------------- - -/** - Initializes the view with the specified log in elements. - - @param fields A bitmask specifying the log in elements which are enabled in the view - - @return An initialized `PFLogInView` object or `nil` if the object couldn't be created. - - @see PFLogInFields - */ -- (instancetype)initWithFields:(PFLogInFields)fields; - -/** - The view controller that will present this view. - - Used to lay out elements correctly when the presenting view controller has translucent elements. - */ -@property (nullable, nonatomic, weak) UIViewController *presentingViewController; - -///-------------------------------------- -/// @name Customizing the Logo -///-------------------------------------- - -/// The logo. By default, it is the Parse logo. -@property (nullable, nonatomic, strong) UIView *logo; - -///-------------------------------------- -/// @name Configure Username Behaviour -///-------------------------------------- - -/** - If email should be used to log in, instead of username - - By default, this is set to `NO`. - */ -@property (nonatomic, assign) BOOL emailAsUsername; - -///-------------------------------------- -/// @name Log In Elements -///-------------------------------------- - -/** - The bitmask which specifies the enabled log in elements in the view. - */ -@property (nonatomic, assign, readonly) PFLogInFields fields; - -/** - The username text field. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) PFTextField *usernameField; - -/** - The password text field. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) PFTextField *passwordField; - -/** - The password forgotten button. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *passwordForgottenButton; - -/** - The log in button. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *logInButton; - -/** - The Apple button. It is 'nil if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *appleButton; - -/** - The sign up button. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *signUpButton; - -/** - It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *dismissButton; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFLogInView.m b/ParseUI/ParseUI/Source/PFLogInView.m deleted file mode 100644 index de3a9da81..000000000 --- a/ParseUI/ParseUI/Source/PFLogInView.m +++ /dev/null @@ -1,455 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFLogInView.h" - -#import "PFActionButton.h" -#import "PFColor.h" -#import "PFDismissButton.h" -#import "PFImage.h" -#import "PFLocalization.h" -#import "PFPrimaryButton.h" -#import "PFRect.h" -#import "PFTextButton.h" -#import "PFTextField.h" - -static NSString *const PFLogInViewDefaultLogoImageName = @"parse_logo.png"; -static NSString *const PFLogInViewDefaultAppleButtonImageName = @"apple_icon.png"; - -///-------------------------------------- -#pragma mark - Accessibility Identifiers -///-------------------------------------- - -NSString *const PFLogInViewUsernameFieldAccessibilityIdentifier = @"PFLogInViewUsernameFieldAccessibilityIdentifier"; -NSString *const PFLogInViewPasswordFieldAccessibilityIdentifier = @"PFLogInViewPasswordFieldAccessibilityIdentifier"; -NSString *const PFLogInViewLogInButtonAccessibilityIdentifier = @"PFLogInViewLogInButtonAccessibilityIdentifier"; -NSString *const PFLogInViewSignUpButtonAccessibilityIdentifier = @"PFLogInViewSignUpButtonAccessibilityIdentifier"; -NSString *const PFLogInViewPasswordForgottenButtonAccessibilityIdentifier = @"PFLogInViewPasswordForgottenButtonAccessibilityIdentifier"; -NSString *const PFLogInViewAppleButtonAccessibilityIdentifier = @"PFLogInViewAppleButtonAccessibilityIdentifier"; -NSString *const PFLogInViewDismissButtonAccessibilityIdentifier = @"PFLogInViewDismissButtonAccessibilityIdentifier"; - -@implementation PFLogInView - -///-------------------------------------- -#pragma mark - Class -///-------------------------------------- - -+ (PFActionButtonConfiguration *)_defaultSignUpButtonConfiguration { - PFActionButtonConfiguration *configuration = [[PFActionButtonConfiguration alloc] initWithBackgroundImageColor:[PFColor signupButtonBackgroundColor] - image:nil]; - NSString *title = PFLocalizedString(@"Sign Up", @"Sign Up"); - [configuration setTitle:title forButtonStyle:PFActionButtonStyleNormal]; - [configuration setTitle:title forButtonStyle:PFActionButtonStyleWide]; - - return configuration; -} - -+ (PFActionButtonConfiguration *)_defaultAppleButtonConfiguration { - PFActionButtonConfiguration *configuration = [[PFActionButtonConfiguration alloc] initWithBackgroundImageColor:[PFColor appleButtonBackgroundColor] - image:[PFImage imageNamed:PFLogInViewDefaultAppleButtonImageName]]; - - [configuration setTitle:PFLocalizedString(@"Apple", @"Apple") - forButtonStyle:PFActionButtonStyleNormal]; - [configuration setTitle:PFLocalizedString(@"Sign in with Apple", @"Sign in with Apple") - - forButtonStyle:PFActionButtonStyleWide]; - - return configuration; -} - -///-------------------------------------- -#pragma mark - Init -///-------------------------------------- - -- (instancetype)initWithFields:(PFLogInFields)otherFields { - self = [super initWithFrame:CGRectZero]; - if (!self) return nil; - - [PFLogInView _validateFields:otherFields]; - - self.opaque = YES; - self.backgroundColor = [PFColor commonBackgroundColor]; - - _fields = otherFields; - - _logo = [[UIImageView alloc] initWithImage:[PFImage imageNamed:PFLogInViewDefaultLogoImageName]]; - _logo.contentMode = UIViewContentModeScaleAspectFit; - [self addSubview:_logo]; - - [self _updateAllFields]; - - return self; -} - -///-------------------------------------- -#pragma mark - Fields -///-------------------------------------- - -- (void)_updateAllFields { - if (_fields & PFLogInFieldsDismissButton) { - if (!_dismissButton) { - _dismissButton = [[PFDismissButton alloc] initWithFrame:CGRectZero]; - _dismissButton.accessibilityIdentifier = PFLogInViewDismissButtonAccessibilityIdentifier; - [self addSubview:_dismissButton]; - } - } else { - [_dismissButton removeFromSuperview]; - _dismissButton = nil; - } - - if (_fields & PFLogInFieldsUsernameAndPassword) { - if (!_usernameField) { - _usernameField = [[PFTextField alloc] initWithFrame:CGRectZero - separatorStyle:(PFTextFieldSeparatorStyleTop | - PFTextFieldSeparatorStyleBottom)]; - _usernameField.accessibilityIdentifier = PFLogInViewUsernameFieldAccessibilityIdentifier; - _usernameField.autocorrectionType = UITextAutocorrectionTypeNo; - _usernameField.autocapitalizationType = UITextAutocapitalizationTypeNone; - _usernameField.returnKeyType = UIReturnKeyNext; - [self addSubview:_usernameField]; - [self _updateUsernameFieldStyle]; - } - - if (!_passwordField) { - _passwordField = [[PFTextField alloc] initWithFrame:CGRectZero - separatorStyle:PFTextFieldSeparatorStyleBottom]; - _passwordField.accessibilityIdentifier = PFLogInViewPasswordFieldAccessibilityIdentifier; - _passwordField.placeholder = PFLocalizedString(@"Password", @"Password"); - _passwordField.secureTextEntry = YES; - _passwordField.autocorrectionType = UITextAutocorrectionTypeNo; - _passwordField.autocapitalizationType = UITextAutocapitalizationTypeNone; - _passwordField.returnKeyType = UIReturnKeyDone; - [self addSubview:_passwordField]; - } - } else { - [_usernameField removeFromSuperview]; - _usernameField = nil; - - [_passwordField removeFromSuperview]; - _passwordField = nil; - } - - if (_fields & PFLogInFieldsSignUpButton) { - if (!_signUpButton) { - _signUpButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultSignUpButtonConfiguration] - buttonStyle:PFActionButtonStyleNormal]; - _signUpButton.accessibilityIdentifier = PFLogInViewSignUpButtonAccessibilityIdentifier; - [self addSubview:_signUpButton]; - } - } else { - [_signUpButton removeFromSuperview]; - _signUpButton = nil; - } - - if (_fields & PFLogInFieldsPasswordForgotten) { - if (!_passwordForgottenButton) { - _passwordForgottenButton = [[PFTextButton alloc] initWithFrame:CGRectZero]; - _passwordForgottenButton.accessibilityIdentifier = PFLogInViewPasswordForgottenButtonAccessibilityIdentifier; - [_passwordForgottenButton setTitle:PFLocalizedString(@"Forgot Password?", "Forgot Password?") - forState:UIControlStateNormal]; - [self addSubview:_passwordForgottenButton]; - } - } else { - [_passwordForgottenButton removeFromSuperview]; - _passwordForgottenButton = nil; - } - - if (_fields & PFLogInFieldsLogInButton) { - if (!_logInButton) { - _logInButton = [[PFPrimaryButton alloc] initWithBackgroundImageColor:[PFColor loginButtonBackgroundColor]]; - _logInButton.accessibilityIdentifier = PFLogInViewLogInButtonAccessibilityIdentifier; - [_logInButton setTitle:PFLocalizedString(@"Log In", @"Log In") forState:UIControlStateNormal]; - [self addSubview:_logInButton]; - } - } else { - [_logInButton removeFromSuperview]; - _logInButton = nil; - } - - if (_fields & PFLogInFieldsApple) { - if (!_appleButton) { - _appleButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultAppleButtonConfiguration] - buttonStyle:PFActionButtonStyleNormal]; - _appleButton.accessibilityIdentifier = PFLogInViewAppleButtonAccessibilityIdentifier; - [self addSubview:_appleButton]; - } - } else { - [_appleButton removeFromSuperview]; - _appleButton = nil; - } -} - -///-------------------------------------- -#pragma mark - UIView -///-------------------------------------- - -- (void)layoutSubviews { - [super layoutSubviews]; - - const CGRect bounds = PFRectMakeWithOriginSize(CGPointZero, self.bounds.size); - - if (_dismissButton) { - CGPoint origin = CGPointMake(16.0f, 16.0f); - UIViewController *presentingViewController = self.presentingViewController; - // In iOS 7+, if this view is presented fullscreen, it's top edge will be behind the status bar. - // This lets us move down the dismiss button a bit so that it's not covered by the status bar. - if ([presentingViewController respondsToSelector:@selector(topLayoutGuide)]) { - origin.y += presentingViewController.topLayoutGuide.length; - } - - CGRect frame = PFRectMakeWithOriginSize(origin, [_dismissButton sizeThatFits:bounds.size]); - _dismissButton.frame = frame; - } - - CGRect contentRect = PFRectMakeWithSizeCenteredInRect(PFSizeMin(bounds.size, [self _maxContentSize]), - bounds); - const CGSize contentSizeScale = [self _contentSizeScaleForContentSize:contentRect.size]; - - CGFloat socialButtonsDefaultInset = 16.0f; - UIEdgeInsets socialButtonsRectInsets = UIEdgeInsetsZero; - if (CGRectGetMinX(contentRect) <= CGRectGetMinX(bounds)) { - socialButtonsRectInsets = UIEdgeInsetsMake(0.0f, - socialButtonsDefaultInset, - 0.0f, - socialButtonsDefaultInset); - } - CGRect socialButtonsRect = UIEdgeInsetsInsetRect(contentRect, socialButtonsRectInsets); - - if (_signUpButton) { - CGSize buttonSize = [_signUpButton sizeThatFits:socialButtonsRect.size]; - [(PFActionButton *)_signUpButton setButtonStyle:PFActionButtonStyleWide]; - - CGRect frame = PFRectMakeWithSizeCenteredInRect(buttonSize, socialButtonsRect); - frame.origin.y = CGRectGetMaxY(socialButtonsRect) - CGRectGetHeight(frame) - socialButtonsRectInsets.left; - _signUpButton.frame = frame; - - contentRect.size.height = CGRectGetMinY(frame) - CGRectGetMinY(contentRect); - socialButtonsRect = UIEdgeInsetsInsetRect(contentRect, socialButtonsRectInsets); - } - - if (_appleButton) { - CGSize buttonSize = [_appleButton sizeThatFits:socialButtonsRect.size]; - CGRect frame = PFRectMakeWithOriginSize(socialButtonsRect.origin, buttonSize); - frame.origin.y = CGRectGetMaxY(socialButtonsRect) - buttonSize.height * 2 - socialButtonsDefaultInset * 2; - _appleButton.frame = frame; - - [(PFActionButton *)_appleButton setButtonStyle:PFActionButtonStyleWide]; - contentRect.size.height = CGRectGetMinY(frame) - CGRectGetMinY(contentRect); - } - - if (_signUpButton || _appleButton) { - contentRect.size.height -= socialButtonsDefaultInset; - } - - const CGRect loginContentRect = PFRectMakeWithSizeCenteredInRect([self _loginContentSizeThatFits:contentRect.size - withContentSizeScale:contentSizeScale], - contentRect); - const CGSize loginContentSize = loginContentRect.size; - CGFloat currentY = CGRectGetMinY(loginContentRect); - - if (_logo) { - CGFloat logoTopInset = (CGRectGetMinX(contentRect) > 0.0f ? 36.0f : 88.0f) * contentSizeScale.height; - CGFloat logoBottomInset = floor(36.0f * contentSizeScale.height); - - CGFloat logoAvailableHeight = floor(68.0f * contentSizeScale.height); - - CGSize logoSize = [_logo sizeThatFits:CGSizeMake(loginContentSize.width, logoAvailableHeight)]; - logoSize.width = MIN(loginContentSize.width, logoSize.width); - logoSize.height = MIN(logoAvailableHeight, logoSize.height); - - CGRect frame = PFRectMakeWithSizeCenteredInRect(logoSize, loginContentRect); - frame.origin.y = CGRectGetMinY(loginContentRect) + logoTopInset; - _logo.frame = CGRectIntegral(frame); - - currentY = floor(CGRectGetMaxY(frame) + logoBottomInset); - } - - if (_usernameField) { - CGRect frame = PFRectMakeWithSizeCenteredInRect([_usernameField sizeThatFits:loginContentSize], - loginContentRect); - frame.origin.y = currentY; - _usernameField.frame = frame; - - currentY = CGRectGetMaxY(frame); - } - - if (_passwordField) { - CGRect frame = PFRectMakeWithSizeCenteredInRect([_passwordField sizeThatFits:loginContentSize], - loginContentRect); - frame.origin.y = currentY; - _passwordField.frame = frame; - - currentY = CGRectGetMaxY(frame); - } - - if (_logInButton) { - CGFloat loginButtonTopInset = floor(24.0f * contentSizeScale.height); - - CGRect frame = PFRectMakeWithSizeCenteredInRect([_logInButton sizeThatFits:loginContentSize], loginContentRect); - frame.origin.y = currentY + loginButtonTopInset; - _logInButton.frame = frame; - - currentY = CGRectGetMaxY(frame); - } - - if (_passwordForgottenButton) { - CGFloat forgotPasswordInset = floor(12.0f * contentSizeScale.height); - - CGSize buttonSize = [_passwordForgottenButton sizeThatFits:loginContentSize]; - CGRect frame = PFRectMakeWithSizeCenteredInRect(buttonSize, loginContentRect); - frame.origin.y = currentY + forgotPasswordInset; - _passwordForgottenButton.frame = frame; - } -} - -- (CGSize)_loginContentSizeThatFits:(CGSize)boundingSize withContentSizeScale:(CGSize)contentSizeScale { - CGSize size = boundingSize; - size.height = 0.0f; - if (_logo) { - CGFloat logoTopInset = floor(36.0f * contentSizeScale.height); - CGFloat logoBottomInset = floor(36.0f * contentSizeScale.height); - - CGFloat logoAvailableHeight = floor(68.0f * contentSizeScale.height); - - CGFloat scale = MAX(contentSizeScale.width, contentSizeScale.height); - - CGSize logoSize = [_logo sizeThatFits:CGSizeMake(boundingSize.width, logoAvailableHeight)]; - logoSize.height *= scale; - logoSize.width *= scale; - - size.height += logoSize.height + logoTopInset + logoBottomInset; - } - if (_usernameField) { - CGSize fieldSize = [_usernameField sizeThatFits:boundingSize]; - size.height += fieldSize.height; - } - if (_passwordField) { - CGSize fieldSize = [_passwordField sizeThatFits:boundingSize]; - size.height += fieldSize.height; - } - if (_logInButton) { - CGFloat loginButtonTopInset = 24.0f * contentSizeScale.height; - - CGSize buttonSize = [_logInButton sizeThatFits:boundingSize]; - - size.height += buttonSize.height + loginButtonTopInset; - } - if (_passwordForgottenButton) { - CGFloat forgotPasswordInset = 12.0f * contentSizeScale.height; - - UIView *button = _signUpButton ?: _passwordForgottenButton; - CGSize buttonSize = [button sizeThatFits:boundingSize]; - - size.height += buttonSize.height + forgotPasswordInset * 2.0f; - } - size.width = floor(size.width); - size.height = floor(size.height); - - return size; -} - -- (CGSize)_maxContentSize { - return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? CGSizeMake(420.0f, 550.0f) : CGSizeMake(500.0f, 800.0f)); -} - -- (CGSize)_contentSizeScaleForContentSize:(CGSize)contentSize { - CGSize maxContentSize = [self _maxContentSize]; - if (maxContentSize.width < contentSize.width && - maxContentSize.height < contentSize.height) { - return CGSizeMake(1.0f, 1.0f); - } - - CGSize contentSizeScale = CGSizeMake(contentSize.width / maxContentSize.width, - contentSize.height / maxContentSize.height); - return contentSizeScale; -} - -///-------------------------------------- -#pragma mark - Accessors -///-------------------------------------- - -- (void)setFields:(PFLogInFields)fields { - if (_fields != fields) { - _fields = fields; - [self _updateAllFields]; - [self setNeedsLayout]; - } -} - -- (void)setLogo:(UIView *)logo { - if (self.logo != logo) { - [_logo removeFromSuperview]; - _logo = logo; - [self addSubview:_logo]; - - [self setNeedsLayout]; - } -} - -- (void)setEmailAsUsername:(BOOL)otherEmailAsUsername { - if (_emailAsUsername != otherEmailAsUsername) { - _emailAsUsername = otherEmailAsUsername; - - [self _updateUsernameFieldStyle]; - } -} - -///-------------------------------------- -#pragma mark - Private -///-------------------------------------- - -+ (void)_validateFields:(PFLogInFields)fields { - if (fields == PFLogInFieldsNone) { - [NSException raise:NSInvalidArgumentException - format:@"Fields must be set before initializing PFLogInView."]; - } - - if (fields & PFLogInFieldsLogInButton) { - if (!(fields & PFLogInFieldsUsernameAndPassword)) { - [NSException raise:NSInvalidArgumentException - format:@"Username and password must be enabled if done button is enabled."]; - } - } - - if (fields & PFLogInFieldsPasswordForgotten) { - if (!(fields & PFLogInFieldsUsernameAndPassword)) { - [NSException raise:NSInvalidArgumentException - format:@"Username and password must be enabled if password forgotten button is enabled."]; - } - } -} - -- (void)_updateUsernameFieldStyle { - UIKeyboardType keyboardType = UIKeyboardTypeDefault; - NSString *usernamePlaceholder = nil; - if (!_emailAsUsername) { - keyboardType = UIKeyboardTypeDefault; - usernamePlaceholder = PFLocalizedString(@"Username", @"Username"); - } else { - keyboardType = UIKeyboardTypeEmailAddress; - usernamePlaceholder = PFLocalizedString(@"Email", @"Email"); - } - - _usernameField.placeholder = usernamePlaceholder; - _usernameField.keyboardType = keyboardType; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFLogInViewController.h b/ParseUI/ParseUI/Source/PFLogInViewController.h deleted file mode 100644 index d38ce165d..000000000 --- a/ParseUI/ParseUI/Source/PFLogInViewController.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import -#import "ParseUIConstants.h" -#import "PFLogInView.h" - -@import ParseCore; - -NS_ASSUME_NONNULL_BEGIN - -@import AuthenticationServices; - -@class PFSignUpViewController; -@class PFUser; -@protocol PFLogInViewControllerDelegate; - -/** - The `PFLogInViewController` class presents and manages a standard authentication interface for logging in a `PFUser`. - */ -@interface PFLogInViewController : UIViewController - -///-------------------------------------- -/// @name Configuring Log In Elements -///-------------------------------------- - -/** - A bitmask specifying the log in elements which are enabled in the view. - - @see PFLogInFields - */ -@property (nonatomic, assign) PFLogInFields fields; - - -/** - The log in view. It contains all the enabled log in elements. - - @see PFLogInView - */ -@property (nullable, nonatomic, strong, readonly) PFLogInView *logInView; - -///-------------------------------------- -/// @name Configuring Log In Behaviors -///-------------------------------------- - -/** - The delegate that responds to the control events of `PFLogInViewController`. - - @see PFLogInViewControllerDelegate - */ -@property (nullable, nonatomic, weak) id delegate; - -/** - The sign up controller if sign up is enabled. - - Use this to configure the sign up view, and the transition animation to the sign up view. - The default is a sign up view with a username, a password, a dismiss button and a sign up button. - */ -@property (nullable, nonatomic, strong) PFSignUpViewController *signUpController; - -/** - Whether to prompt for the email as username on the login view. - - If set to `YES`, we'll prompt for the email in the username field. - This property value propagates to the attached `signUpController`. - By default, this is set to `NO`. - */ -@property (nonatomic, assign) BOOL emailAsUsername; - -@end - -///-------------------------------------- -/// @name Notifications -///-------------------------------------- - -/** - The notification is posted immediately after the log in succeeds. - */ -extern NSString *const PFLogInSuccessNotification; - -/** - The notification is posted immediately after the log in fails. - If the delegate prevents the log in from starting, the notification is not sent. - */ -extern NSString *const PFLogInFailureNotification; - -/** - The notification is posted immediately after the log in is cancelled. - */ -extern NSString *const PFLogInCancelNotification; - -///-------------------------------------- -/// @name PFLogInViewControllerDelegate -///-------------------------------------- - -/** - The `PFLogInViewControllerDelegate` protocol defines methods a delegate of a `PFLogInViewController` should implement. - All methods of this protocol are optional. - */ -@protocol PFLogInViewControllerDelegate - -@optional - -///-------------------------------------- -/// @name Customizing Behavior -///-------------------------------------- - -/** - Sent to the delegate to determine whether the log in request should be submitted to the server. - - @param logInController The login view controller that is requesting the data. - @param username the username the user tries to log in with. - @param password the password the user tries to log in with. - - @return A `BOOL` indicating whether the log in should proceed. - */ -- (BOOL)logInViewController:(PFLogInViewController *)logInController -shouldBeginLogInWithUsername:(NSString *)username - password:(NSString *)password; - -///-------------------------------------- -/// @name Responding to Actions -///-------------------------------------- - -/** - Sent to the delegate when a `PFUser` is logged in. - - @param logInController The login view controller where login finished. - @param user `PFUser` object that is a result of the login. - */ -- (void)logInViewController:(PFLogInViewController *)logInController didLogInUser:(PFUser *)user; - -/** - Sent to the delegate when the log in attempt fails. - - If you implement this method, PFLoginViewController will not automatically show its default - login failure alert view. Instead, you should show your custom alert view in your implementation. - - @param logInController The login view controller where login failed. - @param error `NSError` object representing the error that occured. - */ -- (void)logInViewController:(PFLogInViewController *)logInController didFailToLogInWithError:(nullable NSError *)error; - -/** - Sent to the delegate when the log in screen is cancelled. - - @param logInController The login view controller where login was cancelled. - */ -- (void)logInViewControllerDidCancelLogIn:(PFLogInViewController *)logInController; - -/** - Sent to the delegate when user data is received following successful login using Sign In With Apple. - - @param logInController The login view controller that received the credentials - @param credential The ASAuthorizationAppleIDCredential object received - */ - --(void)logInViewController:(PFLogInViewController *)logInController didReceiveAppleCredential:(ASAuthorizationAppleIDCredential *)credential forUser:(PFUser *)user API_AVAILABLE(ios(13.0)); - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFLogInViewController.m b/ParseUI/ParseUI/Source/PFLogInViewController.m deleted file mode 100644 index cb3cac51f..000000000 --- a/ParseUI/ParseUI/Source/PFLogInViewController.m +++ /dev/null @@ -1,521 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFLogInViewController.h" -#import "PFActionButton.h" -#import "PFUIAlertView.h" -#import "PFLocalization.h" -#import "PFPrimaryButton.h" -#import "PFSignUpViewController.h" -#import "PFTextField.h" -#import "PFLogInView_Private.h" -#import "PFAppleUtils.h" - -@import ParseCore; - -NSString *const PFLogInSuccessNotification = @"com.parse.ui.login.success"; -NSString *const PFLogInFailureNotification = @"com.parse.ui.login.failure"; -NSString *const PFLogInCancelNotification = @"com.parse.ui.login.cancel"; - -@protocol WeaklyReferencedAppleUtils - -+ (BFTask *)logInInBackground; - -@end - -@interface PFLogInViewController () { - struct { - BOOL shouldBeginLogIn : YES; - BOOL didLogInUser : YES; - BOOL didFailToLogIn : YES; - BOOL didCancelLogIn : YES; - } _delegateExistingMethods; -} - -@property (nonatomic, strong, readwrite) PFLogInView *logInView; -@property (nonatomic, assign) BOOL loading; - -@property (nonatomic, assign) CGFloat visibleKeyboardHeight; - -@end - -@implementation PFLogInViewController - -///-------------------------------------- -#pragma mark - Init -///-------------------------------------- - -- (instancetype)init { - self = [super init]; - if (self) { - [self _commonInit]; - } - return self; -} - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - [self _commonInit]; - } - return self; -} - -- (instancetype)initWithCoder:(NSCoder *)decoder { - self = [super initWithCoder:decoder]; - if (self) { - [self _commonInit]; - } - return self; -} - -- (void)_commonInit { - self.modalTransitionStyle = UIModalTransitionStyleCoverVertical; - self.modalPresentationStyle = UIModalPresentationFormSheet; - _fields = PFLogInFieldsDefault; - - if ([self respondsToSelector:@selector(automaticallyAdjustsScrollViewInsets)]) { - self.automaticallyAdjustsScrollViewInsets = NO; - } -} - -///-------------------------------------- -#pragma mark - Dealloc -///-------------------------------------- - -- (void)dealloc { - // Unregister from all notifications - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -///-------------------------------------- -#pragma mark - UIViewController -///-------------------------------------- - -- (void)loadView { - _logInView = [[PFLogInView alloc] initWithFields:_fields]; - [_logInView setPresentingViewController:self]; - - UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_dismissKeyboard)]; - [_logInView addGestureRecognizer:gestureRecognizer]; - gestureRecognizer.cancelsTouchesInView = NO; - - self.view = _logInView; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - [self _setupLogInViewActions]; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - - [self _registerForKeyboardNotifications]; - - if (self.navigationController && - self.fields & PFLogInFieldsDismissButton) { - self.fields = self.fields & ~PFLogInFieldsDismissButton; - - [_logInView.dismissButton removeFromSuperview]; - } -} - -- (UIInterfaceOrientationMask)supportedInterfaceOrientations { - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { - return UIInterfaceOrientationMaskAll; - } - - return UIInterfaceOrientationMaskPortrait; -} - -///-------------------------------------- -#pragma mark - PFLogInViewController -///-------------------------------------- - -- (PFLogInView *)logInView { - return (PFLogInView *)self.view; // self.view will call loadView if the view is nil -} - -- (void)setEmailAsUsername:(BOOL)otherEmailAsUsername { - self.logInView.emailAsUsername = otherEmailAsUsername; -} - -- (BOOL)emailAsUsername { - return self.logInView.emailAsUsername; -} - -- (void)setFields:(PFLogInFields)fields { - if (_fields != fields) { - _fields = fields; - - // Avoid force loading logInView - if (_logInView) { - _logInView.fields = fields; - [self _setupLogInViewActions]; - } - } -} - -- (void)setDelegate:(id)delegate { - if (self.delegate != delegate) { - _delegate = delegate; - - _delegateExistingMethods.shouldBeginLogIn = [delegate respondsToSelector:@selector(logInViewController: - shouldBeginLogInWithUsername: - password:)]; - _delegateExistingMethods.didLogInUser = [delegate respondsToSelector:@selector(logInViewController: - didLogInUser:)]; - _delegateExistingMethods.didFailToLogIn = [delegate respondsToSelector:@selector(logInViewController: - didFailToLogInWithError:)]; - _delegateExistingMethods.didCancelLogIn = [delegate - respondsToSelector:@selector(logInViewControllerDidCancelLogIn:)]; - } -} - -- (PFSignUpViewController *)signUpController { - if (!_signUpController) { - _signUpController = [[PFSignUpViewController alloc] init]; - _signUpController.modalTransitionStyle = UIModalTransitionStyleCoverVertical; - _signUpController.emailAsUsername = self.emailAsUsername; - } - return _signUpController; -} - -- (void)setLoading:(BOOL)loading { - if (self.loading != loading) { - _loading = loading; - - _logInView.usernameField.enabled = !self.loading; - _logInView.passwordField.enabled = !self.loading; - _logInView.passwordForgottenButton.enabled = !self.loading; - _logInView.dismissButton.enabled = !self.loading; - } -} - -///-------------------------------------- -#pragma mark - UITextFieldDelegate -///-------------------------------------- - -- (BOOL)textFieldShouldReturn:(UITextField *)textField { - if (textField == _logInView.usernameField) { - [_logInView.passwordField becomeFirstResponder]; - } - if (textField == _logInView.passwordField) { - [self _dismissKeyboard]; - [self _loginAction]; - } - - return YES; -} - -///-------------------------------------- -#pragma mark - Private -///-------------------------------------- - -- (void)_setupLogInViewActions { - [_logInView.dismissButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; - [_logInView.dismissButton addTarget:self action:@selector(_dismissAction) forControlEvents:UIControlEventTouchUpInside]; - - _logInView.usernameField.delegate = self; - _logInView.passwordField.delegate = self; - - [_logInView.logInButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; - [_logInView.logInButton addTarget:self action:@selector(_loginAction) forControlEvents:UIControlEventTouchUpInside]; - - [_logInView.passwordForgottenButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; - [_logInView.passwordForgottenButton addTarget:self action:@selector(_forgotPasswordAction) forControlEvents:UIControlEventTouchUpInside]; - - [_logInView.appleButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; - [_logInView.appleButton addTarget:self action:@selector(_loginWithApple) forControlEvents:UIControlEventTouchUpInside]; - - [_logInView.signUpButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; - [_logInView.signUpButton addTarget:self action:@selector(_signupAction) forControlEvents:UIControlEventTouchUpInside]; -} - -- (void)_dismissAction { - [self cancelLogIn]; - - // Normally the role of dismissing a modal controller lies on the presenting controller. - // Here we violate the principle so that the presenting modal log in controller is especially easy. - // Cons of this design is that it makes working with non-modally presented log in controller hard; - // but this concern is mitigated by the fact that navigationally presented controller should not have - // dismiss button. - [self dismissViewControllerAnimated:YES completion:nil]; -} - -- (void)_forgotPasswordAction PF_EXTENSION_UNAVAILABLE("") { - NSString *title = PFLocalizedString(@"Reset Password", @"Forgot password request title in PFLogInViewController"); - NSString *message = PFLocalizedString(@"Please enter the email address for your account.", - @"Email request message in PFLogInViewController"); - [PFUIAlertView presentAlertInViewController:self - withTitle:title - message:message - textFieldCustomizationHandler:^(UITextField * _Nonnull textField) { - textField.placeholder = PFLocalizedString(@"Email", @"Email"); - textField.keyboardType = UIKeyboardTypeEmailAddress; - textField.returnKeyType = UIReturnKeyDone; - } - cancelButtonTitle:PFLocalizedString(@"Cancel", @"Cancel") - otherButtonTitles:@[ PFLocalizedString(@"OK", @"OK")] - completion:^(UITextField * _Nonnull textField, NSUInteger selectedOtherButtonIndex) { - if (selectedOtherButtonIndex != NSNotFound) { - NSString *email = textField.text; - [self _requestPasswordResetWithEmail:email]; - } - }]; -} - -- (void)_requestPasswordResetWithEmail:(NSString *)email { - [PFUser requestPasswordResetForEmailInBackground:email block:^(BOOL success, NSError *error) { - if (success) { - NSString *title = PFLocalizedString(@"Password Reset", - @"Password reset success alert title in PFLogInViewController."); - NSString *message = [NSString stringWithFormat:PFLocalizedString(@"An email with reset instructions has been sent to '%@'.", - @"Password reset message in PFLogInViewController"), email]; - [PFUIAlertView presentAlertInViewController:self withTitle:title message:message]; - } else { - NSString *title = PFLocalizedString(@"Password Reset Failed", - @"Password reset error alert title in PFLogInViewController."); - [PFUIAlertView presentAlertInViewController:self withTitle:title error:error]; - } - }]; -} - - -#pragma mark Sign in with Apple --(void)_loginWithApple API_AVAILABLE(ios(13.0)){ - - if (self.loading) { - return; - } - - self.loading = YES; - if ([_logInView.appleButton isKindOfClass:[PFActionButton class]]) { - [(PFActionButton *)_logInView.appleButton setLoading:YES]; - } - - __weak typeof(self) wself = self; - - [[PFAppleUtils logInInBackground] continueWithBlock:^id _Nullable(BFTask * _Nonnull t) { - __strong typeof(wself) sself = wself; - dispatch_async(dispatch_get_main_queue(), ^{ - sself.loading = NO; - if ([sself.logInView.appleButton isKindOfClass:[PFActionButton class]]) { - [(PFActionButton *)sself.logInView.appleButton setLoading:NO]; - } - if (t.error) { - [sself _loginDidFailWithError:t.error]; - } - else - { - PFUser *user = t.result[PFAppleAuthUserKey]; - ASAuthorizationAppleIDCredential *cred = t.result[PFAppleAuthCredentialKey]; - [sself _loginDidSucceedWithUser:user]; - [sself.delegate logInViewController:sself didReceiveAppleCredential:cred forUser:user]; - } - }); - return nil; - }]; -} - -#pragma mark Log In - -- (void)_loginAction { - if (self.loading) { - return; - } - - NSString *username = _logInView.usernameField.text ?: @""; - NSString *password = _logInView.passwordField.text ?: @""; - - if (_delegateExistingMethods.shouldBeginLogIn) { - if (![_delegate logInViewController:self shouldBeginLogInWithUsername:username password:password]) { - return; - } - } - - self.loading = YES; - if ([_logInView.logInButton isKindOfClass:[PFPrimaryButton class]]) { - [(PFActionButton *)_logInView.logInButton setLoading:YES]; - } - - [PFUser logInWithUsernameInBackground:username password:password block:^(PFUser *user, NSError *error) { - self.loading = NO; - if ([self->_logInView.logInButton isKindOfClass:[PFPrimaryButton class]]) { - [(PFPrimaryButton *)self->_logInView.logInButton setLoading:NO]; - } - - if (user) { - [self _loginDidSucceedWithUser:user]; - } else { - [self _loginDidFailWithError:error]; - } - }]; -} - -- (void)_signupAction { - if (self.loading) { - return; - } - [self presentViewController:self.signUpController animated:YES completion:nil]; -} - -- (void)_loginDidSucceedWithUser:(PFUser *)user { - if (_delegateExistingMethods.didLogInUser) { - [_delegate logInViewController:self didLogInUser:user]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:PFLogInSuccessNotification object:self]; -} - -- (void)_loginDidFailWithError:(NSError *)error { - if (_delegateExistingMethods.didFailToLogIn) { - [_delegate logInViewController:self didFailToLogInWithError:error]; - } else { - NSString *title = PFLocalizedString(@"Login Failed", @"Login failed alert title in PFLogInViewController"); - NSString *message = nil; - if (error.code == kPFErrorObjectNotFound) { - message = PFLocalizedString(@"The username and password you entered don't match", @"Invalid login credentials alert message in PFLogInViewController"); - } else { - message = PFLocalizedString(@"Please try again", @"Generic login failed alert message in PFLogInViewController"); - } - [PFUIAlertView presentAlertInViewController:self withTitle:title message:message]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:PFLogInFailureNotification object:self]; -} - -- (void)cancelLogIn { - if (_delegateExistingMethods.didCancelLogIn) { - [_delegate logInViewControllerDidCancelLogIn:self]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:PFLogInCancelNotification object:self]; -} - -///-------------------------------------- -#pragma mark - Keyboard -///-------------------------------------- - -- (UIView *)currentFirstResponder { - if ([_logInView.usernameField isFirstResponder]) { - return _logInView.usernameField; - } - if ([_logInView.passwordField isFirstResponder]) { - return _logInView.passwordField; - } - return nil; -} - -- (void)_dismissKeyboard { - [self.view endEditing:YES]; -} - -- (void)_registerForKeyboardNotifications { - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_keyboardWillShow:) - name:UIKeyboardWillShowNotification - object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_keyboardWillHide:) - name:UIKeyboardWillHideNotification - object:nil]; -} - -- (void)_keyboardWillShow:(NSNotification *)notification { - NSDictionary *userInfo = [notification userInfo]; - CGRect endFrame = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; - CGFloat duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; - UIViewAnimationCurve curve = [userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]; - - CGRect keyboardFrame = [self.view convertRect:endFrame fromView:self.view.window]; - CGFloat visibleKeyboardHeight = CGRectGetMaxY(self.view.bounds) - CGRectGetMinY(keyboardFrame); - - [self setVisibleKeyboardHeight:visibleKeyboardHeight - animationDuration:duration - animationOptions:curve << 16]; -} - -- (void)_keyboardWillHide:(NSNotification *)notification { - NSDictionary *userInfo = [notification userInfo]; - CGFloat duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; - UIViewAnimationCurve curve = [userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]; - [self setVisibleKeyboardHeight:0.0 - animationDuration:duration - animationOptions:curve << 16]; -} - -- (void)setVisibleKeyboardHeight:(CGFloat)visibleKeyboardHeight - animationDuration:(NSTimeInterval)animationDuration - animationOptions:(UIViewAnimationOptions)animationOptions { - - dispatch_block_t animationsBlock = ^{ - self.visibleKeyboardHeight = visibleKeyboardHeight; - }; - - if (animationDuration == 0.0) { - animationsBlock(); - } else { - [UIView animateWithDuration:animationDuration - delay:0.0 - options:animationOptions | UIViewAnimationOptionBeginFromCurrentState - animations:animationsBlock - completion:nil]; - } -} - -- (void)setVisibleKeyboardHeight:(CGFloat)visibleKeyboardHeight { - if (self.visibleKeyboardHeight != visibleKeyboardHeight) { - _visibleKeyboardHeight = visibleKeyboardHeight; - [self _updateViewContentOffsetAnimated:NO]; - } -} - -- (void)_updateViewContentOffsetAnimated:(BOOL)animated { - CGPoint contentOffset = CGPointZero; - if (self.visibleKeyboardHeight > 0.0f) { - // Scroll the view to keep fields visible - CGFloat offsetForScrollingTextFieldToTop = CGRectGetMinY([self currentFirstResponder].frame); - - UIView *lowestView; - if (_logInView.passwordForgottenButton) { - lowestView = _logInView.passwordForgottenButton; - } else if (_logInView.logInButton) { - lowestView = _logInView.logInButton; - } else { - lowestView = _logInView.passwordField; - } - - CGFloat offsetForScrollingLowestViewToBottom = 0.0f; - offsetForScrollingLowestViewToBottom += self.visibleKeyboardHeight; - offsetForScrollingLowestViewToBottom += CGRectGetMaxY(lowestView.frame); - offsetForScrollingLowestViewToBottom -= CGRectGetHeight(_logInView.bounds); - - if (offsetForScrollingLowestViewToBottom < 0) { - return; // No scrolling required - } - - contentOffset = CGPointMake(0.0f, MIN(offsetForScrollingTextFieldToTop, offsetForScrollingLowestViewToBottom)); - } - - [_logInView setContentOffset:contentOffset animated:animated]; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFLogInView_Private.h b/ParseUI/ParseUI/Source/PFLogInView_Private.h deleted file mode 100644 index 1ecb959d6..000000000 --- a/ParseUI/ParseUI/Source/PFLogInView_Private.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFLogInView.h" - -@interface PFLogInView (Private) - -@property (nonatomic, assign, readwrite) PFLogInFields fields; - -@end diff --git a/ParseUI/ParseUI/Source/PFProductTableViewController.h b/ParseUI/ParseUI/Source/PFProductTableViewController.h deleted file mode 100644 index 2e2e5a805..000000000 --- a/ParseUI/ParseUI/Source/PFProductTableViewController.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -#import "ParseUIConstants.h" -#import "PFQueryTableViewController.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - `PFProductTableViewController` displays in-app purchase products stored on Parse. - In addition to setting up in-app purchases in iTunes Connect, the app developer needs - to register product information on Parse, in the Product class. - */ -@interface PFProductTableViewController : PFQueryTableViewController - -/** - Initializes a product table view controller. - - @param style The UITableViewStyle for the table - - @return An initialized `PFProductTableViewController` object or `nil` if the object couldn't be created. - */ -- (instancetype)initWithStyle:(UITableViewStyle)style NS_DESIGNATED_INITIALIZER; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFProductTableViewController.m b/ParseUI/ParseUI/Source/PFProductTableViewController.m deleted file mode 100644 index 47271de22..000000000 --- a/ParseUI/ParseUI/Source/PFProductTableViewController.m +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFProductTableViewController.h" -#import "PFUIAlertView.h" -#import "PFLocalization.h" -#import "PFPurchaseTableViewCell.h" - -@import ParseCore; - -static NSString *const PFProductMetadataPriceKey = @"price"; -static NSString *const PFProductMetadataPriceLocaleKey = @"priceLocale"; - -@interface PFProductTableViewController () { - NSMutableDictionary *_productMetadataDictionary; - NSMutableDictionary *_productProgressDictionary; - - SKProductsRequest *_storeProductsRequest; -} - -@end - -@implementation PFProductTableViewController - -#pragma mark - -#pragma mark NSObject - -- (instancetype)initWithStyle:(UITableViewStyle)style { - self = [super initWithStyle:UITableViewStylePlain className:[PFProduct parseClassName]]; - if (self) { - self.pullToRefreshEnabled = NO; - self.paginationEnabled = NO; - - _productMetadataDictionary = [NSMutableDictionary dictionary]; - _productProgressDictionary = [NSMutableDictionary dictionary]; - } - return self; -} - -- (instancetype)initWithStyle:(UITableViewStyle)style className:(NSString *)className { - return [self initWithStyle:style]; -} - -#pragma mark - -#pragma mark UIViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.tableView.rowHeight = 84.0f; -} - -- (void)objectsDidLoad:(NSError *)error { - [super objectsDidLoad:error]; - if (error) { - return; - } - - [self.objects enumerateObjectsUsingBlock:^(PFProduct *product, NSUInteger idx, BOOL *stop) { - // No download for this product - just continue - if (!product.downloadName) { - return; - } - - [PFPurchase addObserverForProduct:product.productIdentifier block:^(SKPaymentTransaction *transaction) { - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection:0]; - PFPurchaseTableViewCell *cell = (PFPurchaseTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath]; - - cell.state = PFPurchaseTableViewCellStateDownloading; - [PFPurchase downloadAssetForTransaction:transaction - completion:^(NSString *filePath, NSError *downloadError) { - if (!downloadError) { - cell.state = PFPurchaseTableViewCellStateDownloaded; - } else { - cell.state = PFPurchaseTableViewCellStateNormal; - - NSString *title = PFLocalizedString(@"Download Error", - @"Download Error"); - [PFUIAlertView presentAlertInViewController:self withTitle:title error:error]; - } - } - progress:^(int percentDone) { - self->_productProgressDictionary[product.productIdentifier] = @(percentDone); - [cell.progressView setProgress:percentDone/100.0f animated:YES]; - }]; - }]; - }]; -} - -#pragma mark - -#pragma mark UITableViewDataSource - -- (PFTableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - PFProduct *product = (PFProduct *)object; - static NSString *cellIdentifier = @"PFPurchaseTableViewCell"; - - PFPurchaseTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if (!cell) { - cell = [[PFPurchaseTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle - reuseIdentifier:cellIdentifier]; - } - - if (indexPath.row % 2 == 0) { - cell.backgroundView.backgroundColor = [UIColor colorWithWhite:242.0f/255.0f alpha:1.0f]; - cell.textLabel.shadowOffset = CGSizeZero; - cell.textLabel.shadowColor = [UIColor whiteColor]; - cell.priceLabel.shadowOffset = CGSizeZero; - cell.priceLabel.shadowColor = [UIColor whiteColor]; - - } else { - cell.backgroundView.backgroundColor = [UIColor colorWithWhite:232.0f/255.0f alpha:1.0f]; - cell.textLabel.shadowOffset = CGSizeMake(0.0f, 1.0f); - cell.textLabel.shadowColor = [UIColor whiteColor]; - cell.priceLabel.shadowOffset = CGSizeMake(0.0f, 1.0f); - cell.priceLabel.shadowColor = [UIColor whiteColor]; - } - - cell.imageView.file = product.icon; - cell.textLabel.text = product.title; - cell.detailTextLabel.text = product.subtitle; - - NSString *price = [self _priceForProduct:product]; - if (price) { - cell.priceLabel.text = [NSString stringWithFormat:@" $%@ ", price]; - } - - if (product.downloadName) { - NSString *contentPath = [PFPurchase assetContentPathForProduct:product]; - if (contentPath) { - cell.state = PFPurchaseTableViewCellStateDownloaded; - } - } else { - int progress = [self _downloadProgressForProduct:product]; - if (progress == 0) { - cell.state = PFPurchaseTableViewCellStateNormal; - } else if (progress == 100) { - cell.state = PFPurchaseTableViewCellStateDownloaded; - } else { - cell.state = PFPurchaseTableViewCellStateDownloading; - } - } - - return cell; -} - -#pragma mark - -#pragma mark UITableViewDelegate - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - if (indexPath.row < self.objects.count) { - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - - PFProduct *product = self.objects[indexPath.row]; - [PFPurchase buyProduct:product.productIdentifier block:^(NSError *error) { - if (error) { - NSString *title = PFLocalizedString(@"Purchase Error", @"Purchase Error"); - [PFUIAlertView presentAlertInViewController:self withTitle:title error:error]; - } - }]; - } -} - -#pragma mark - -#pragma mark Data - -- (NSString *)_priceForProduct:(PFProduct *)product { - return _productMetadataDictionary[product.productIdentifier][PFProductMetadataPriceKey]; -} - -- (int)_downloadProgressForProduct:(PFProduct *)product { - return [_productProgressDictionary[product.productIdentifier] intValue]; -} - -#pragma mark - -#pragma mark PFQueryTableViewController - -- (PFQuery *)queryForTable { - PFQuery *query = [super queryForTable]; - [query orderByAscending:@"order"]; - return query; -} - -#pragma mark - -#pragma mark Querying Store - -- (void)_queryStoreForProductsWithIdentifiers:(NSSet *)identifiers { - _storeProductsRequest.delegate = nil; - _storeProductsRequest = nil; - - _storeProductsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:identifiers]; - _storeProductsRequest.delegate = self; - [_storeProductsRequest start]; -} - -#pragma mark - -#pragma mark SKProductsRequestDelegate - -- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { - if (request != _storeProductsRequest) { - return; - } - - NSArray *validProducts = response.products; - if ([validProducts count] == 0) { - return; - } - - [validProducts enumerateObjectsUsingBlock:^(SKProduct *product, NSUInteger idx, BOOL *stop) { - NSDictionary *metadata = @{ PFProductMetadataPriceKey : product.price, - PFProductMetadataPriceLocaleKey : product.priceLocale }; - self->_productMetadataDictionary[product.productIdentifier] = metadata; - }]; - [self.tableView reloadData]; - - _storeProductsRequest.delegate = nil; -} - -- (void)requestDidFinish:(SKRequest *)request { - _storeProductsRequest.delegate = nil; - _storeProductsRequest = nil; -} - -- (void)request:(SKRequest *)request didFailWithError:(NSError *)error { - _storeProductsRequest.delegate = nil; - _storeProductsRequest = nil; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFPurchaseTableViewCell.h b/ParseUI/ParseUI/Source/PFPurchaseTableViewCell.h deleted file mode 100644 index e7ddcc3cd..000000000 --- a/ParseUI/ParseUI/Source/PFPurchaseTableViewCell.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -#import "ParseUIConstants.h" -#import "PFTableViewCell.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - An enum that represents states of the `PFPurchaseTableViewCell`. - @see `PFPurchaseTableViewCell` - */ -typedef NS_ENUM(uint8_t, PFPurchaseTableViewCellState) { - /** Normal state of the cell. */ - PFPurchaseTableViewCellStateNormal = 0, - /** Downloading state of the cell. */ - PFPurchaseTableViewCellStateDownloading, - /** State of the cell, when the product was downloaded. */ - PFPurchaseTableViewCellStateDownloaded -}; - -/** - `PFPurchaseTableViewCell` is a subclass `PFTableViewCell` that is used to show - products in a `PFProductTableViewController`. - - @see `PFProductTableViewController` - */ -@interface PFPurchaseTableViewCell : PFTableViewCell - -/** - State of the cell. - @see `PFPurchaseTableViewCellState` - */ -@property (nonatomic, assign) PFPurchaseTableViewCellState state; - -/** - Label where price of the product is displayed. - */ -@property (nullable, nonatomic, strong, readonly) UILabel *priceLabel; - -/** - Progress view that is shown, when the product is downloading. - */ -@property (nullable, nonatomic, strong, readonly) UIProgressView *progressView; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFPurchaseTableViewCell.m b/ParseUI/ParseUI/Source/PFPurchaseTableViewCell.m deleted file mode 100644 index 409a418a6..000000000 --- a/ParseUI/ParseUI/Source/PFPurchaseTableViewCell.m +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFPurchaseTableViewCell.h" - -#import "PFLocalization.h" -#import "PFRect.h" - -@interface PFPurchaseTableViewCell () - -@property (nonatomic, strong) UILabel *priceLabel; -@property (nonatomic, strong) UIProgressView *progressView; - -@end - -@implementation PFPurchaseTableViewCell - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { - self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; - if (self) { - self.backgroundView = [[UIView alloc] initWithFrame:CGRectZero]; - - self.imageView.layer.shadowColor = [UIColor blackColor].CGColor; - self.imageView.layer.shadowOffset = CGSizeMake(0.0f, 1.0f); - self.imageView.layer.shadowRadius = 1.0f; - self.imageView.layer.shadowOpacity = 1.0f; - - self.textLabel.backgroundColor = [UIColor clearColor]; - self.detailTextLabel.backgroundColor = [UIColor clearColor]; - self.detailTextLabel.numberOfLines = 2; - self.detailTextLabel.font = [UIFont systemFontOfSize:12.0f]; - - self.priceLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - self.priceLabel.backgroundColor = [UIColor colorWithWhite:242.0f/255.0f alpha:1.0f]; - self.priceLabel.textColor = [UIColor grayColor]; - self.priceLabel.shadowColor = [UIColor whiteColor]; - self.priceLabel.shadowOffset = CGSizeMake(0.0f, -1.0f); - self.priceLabel.font = [UIFont boldSystemFontOfSize:12.0f]; - self.priceLabel.layer.borderColor = [UIColor grayColor].CGColor; - self.priceLabel.layer.borderWidth = 1.0f; - self.priceLabel.layer.cornerRadius = 3.0f; - self.priceLabel.lineBreakMode = NSLineBreakByWordWrapping; - self.priceLabel.numberOfLines = 0; - [self.contentView addSubview:self.priceLabel]; - - self.progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault]; - self.state = PFPurchaseTableViewCellStateNormal; - } - return self; -} -#pragma mark - -#pragma mark UIView - -- (void)layoutSubviews { - [super layoutSubviews]; - - const CGRect bounds = self.contentView.bounds; - - CGFloat iconWidth = floor(0.8f * CGRectGetHeight(bounds)); - CGFloat iconMarginY = floor((CGRectGetHeight(bounds) - iconWidth)/2.0f); - CGFloat iconMarginX = iconMarginY; - CGFloat x = iconMarginX; - CGFloat y = iconMarginY; - self.imageView.frame = CGRectMake(x, y, iconWidth, iconWidth); - x += self.imageView.frame.size.width + iconMarginX; - - self.priceLabel.frame = CGRectZero; // this is necessary for sizeToFit to work correctly - [self.priceLabel sizeToFit]; - CGFloat priceLabelRightInset = 10.0f; - CGFloat priceLabelX = CGRectGetWidth(bounds) - CGRectGetWidth(self.priceLabel.frame) - priceLabelRightInset; - CGFloat priceLabelY = floor((CGRectGetHeight(self.textLabel.frame) - CGRectGetHeight(self.priceLabel.frame))/2.0f) + iconMarginY; - - self.priceLabel.frame = PFRectMakeWithOriginSize(CGPointMake(priceLabelX, priceLabelY), self.priceLabel.frame.size); - - CGFloat titleWidth = self.contentView.frame.size.width - self.imageView.frame.size.width - iconMarginX - 100.0f; - CGFloat titleHeight = self.textLabel.frame.size.height; - self.textLabel.frame = CGRectMake(x, y, titleWidth, titleHeight); - - CGFloat textMarginBottom = 5.0f; - y += self.textLabel.frame.size.height + textMarginBottom; - - CGFloat detailTextLabelWidth = CGRectGetWidth(bounds) - x - 50.0f; - self.detailTextLabel.frame = CGRectMake(x, y, detailTextLabelWidth, CGRectGetWidth(self.detailTextLabel.frame)); - self.progressView.frame = CGRectMake(x, CGRectGetHeight(bounds) - CGRectGetHeight(self.progressView.frame) - iconMarginY - 2.0f, - detailTextLabelWidth, CGRectGetHeight(self.progressView.frame)); -} - -#pragma mark - -#pragma mark PFPurchaseTableViewCell - -- (void)setState:(PFPurchaseTableViewCellState)state { - if (self.state == state) { - return; - } - - _state = state; - - switch (state) { - case PFPurchaseTableViewCellStateNormal: - { - self.detailTextLabel.numberOfLines = 2; - } - break; - case PFPurchaseTableViewCellStateDownloading: - { - self.detailTextLabel.numberOfLines = 1; - self.priceLabel.backgroundColor = [UIColor colorWithRed:132.0f/255.0f green:175.0f/255.0f blue:230.0f/255.0f alpha:1.0f]; - NSString *downloadingText = PFLocalizedString(@"DOWNLOADING", @"DOWNLOADING"); - self.priceLabel.text = [NSString stringWithFormat:@" %@ ", downloadingText]; - self.priceLabel.textColor = [UIColor whiteColor]; - self.priceLabel.shadowColor = [UIColor blackColor]; - self.priceLabel.shadowOffset = CGSizeMake(0.0f, -1.0f); - [self.contentView addSubview:self.progressView]; - } - break; - case PFPurchaseTableViewCellStateDownloaded: - { - self.detailTextLabel.numberOfLines = 2; - NSString *installedText = PFLocalizedString(@"INSTALLED", @"INSTALLED"); - self.priceLabel.text = [NSString stringWithFormat:@" %@ ", installedText]; - self.priceLabel.textColor = [UIColor whiteColor]; - self.priceLabel.shadowColor = [UIColor blackColor]; - self.priceLabel.shadowOffset = CGSizeMake(0.0f, -1.0f); - self.priceLabel.backgroundColor = [UIColor colorWithRed:160.0f/255.0f green:200.0f/255.0f blue:120.0f/255.0f alpha:1.0f]; - [self.progressView removeFromSuperview]; - } - break; - default: - break; - } - [self setNeedsLayout]; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFQueryCollectionViewController.h b/ParseUI/ParseUI/Source/PFQueryCollectionViewController.h deleted file mode 100644 index 48a97550a..000000000 --- a/ParseUI/ParseUI/Source/PFQueryCollectionViewController.h +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import -#import "ParseUIConstants.h" - -@import ParseCore; - -NS_ASSUME_NONNULL_BEGIN - -@class BFTask<__covariant BFGenericType>; -@class PFCollectionViewCell; -@class PFObject; -@class PFQuery; - -/** - This class allows you to think about a one-to-one mapping between a `PFObject` and a `UICollectionViewCell`, - rather than having to juggle index paths. - - You also get the following features out of the box: - - - Pagination with a cell that can be tapped to load the next page. - - Pull-to-refresh collection view header. - - Automatic downloading and displaying of remote images in cells. - - Loading screen, shown before any data is loaded. - - Automatic loading and management of the objects array. - - Various methods that can be overridden to customize behavior at major events in the data cycle. - - @see `PFCollectionViewCell` - */ -@interface PFQueryCollectionViewController : UICollectionViewController - -/** - The class name of the `PFObject` this collection will use as a datasource. - */ -@property (nullable, nonatomic, copy) IBInspectable NSString *parseClassName; - -/** - Whether the collection should use the default loading view. Default - `YES`. - */ -@property (nonatomic, assign) IBInspectable BOOL loadingViewEnabled; - -/** - Whether the collection should use the built-in pull-to-refresh feature. Default - `YES`. - */ -@property (nonatomic, assign) IBInspectable BOOL pullToRefreshEnabled NS_AVAILABLE_IOS(10.0); - -/** - Whether the collection should use the built-in pagination feature. Default - `YES`. - */ -@property (nonatomic, assign) IBInspectable BOOL paginationEnabled; - -/** - The number of objects to show per page. Default - `25`. - */ -@property (nonatomic, assign) IBInspectable NSUInteger objectsPerPage; - -/** - Whether the collection is actively loading new data from the server. - */ -@property (nonatomic, assign, getter=isLoading) BOOL loading; - -///-------------------------------------- -/// @name Creating a PFQueryCollectionViewController -///-------------------------------------- - -/** - Initializes a view controller with a `UICollectionViewFlowLayout` and a class name - of `PFObject` that will be associated with this collection. - - @param className The class name of the instances of `PFObject` that this table will display. - - @return An initialized `PFQueryCollectionViewController` object or `nil` if the object couldn't be created. - */ -- (instancetype)initWithClassName:(nullable NSString *)className; - -/** - Initializes a view controller with a class name of `PFObject` that will be associated with this collection. - - @param layout Layout for collection view to use. - @param className The class name of the instances of `PFObject` that this table will display. - - @return An initialized `PFQueryCollectionViewController` object or `nil` if the object couldn't be created. - */ -- (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout - className:(nullable NSString *)className NS_DESIGNATED_INITIALIZER; - -///-------------------------------------- -/// @name Responding to Events -///-------------------------------------- - -/** - Called when objects will be loaded from Parse. If you override this method, you must - call [super objectsWillLoad] in your implementation. - */ -- (void)objectsWillLoad NS_REQUIRES_SUPER; - -/** - Called when objects have loaded from Parse. If you override this method, you must - call [super objectsDidLoad:] in your implementation. - @param error The Parse error from running the PFQuery, if there was any. - */ -- (void)objectsDidLoad:(nullable NSError *)error NS_REQUIRES_SUPER; - -///-------------------------------------- -/// @name Accessing Results -///-------------------------------------- - -/** - The array of instances of `PFObject` that is used as a data source. - */ -@property (nonatomic, copy, readonly) NSArray<__kindof PFObject *> *objects; - -/** - Returns an object at a particular indexPath. - - The default impementation returns the object at `indexPath.item`. - If you want to return objects in a different indexPath order, like for sections, override this method. - - @param indexPath An instance of `NSIndexPath`. - - @return The object at the specified indexPath. - */ -- (nullable PFObject *)objectAtIndexPath:(nullable NSIndexPath *)indexPath; - -/** - Removes an object at the specified index path, animated. - */ -- (void)removeObjectAtIndexPath:(nullable NSIndexPath *)indexPath; - -/** - Removes all objects at the specified index paths, animated. - */ -- (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexes; - -///-------------------------------------- -/// @name Loading Data -///-------------------------------------- - -/** - Clears the collection view and loads the first page of objects. - - @return An awaitable task that completes when the reload succeeds - */ -- (BFTask *> *)loadObjects; - -/** - Loads the objects of the `PFObject.parseClassName` at the specified page and appends it to the - objects already loaded and refreshes the collection. - - @param page The page of objects to load. - @param clear Whether to clear the collection view after receiving the objects. - - @return An awaitable task that completes when the reload succeeds - */ -- (BFTask *> *)loadObjects:(NSInteger)page clear:(BOOL)clear; - -/** - Loads the next page of objects, appends to table, and refreshes. - */ -- (void)loadNextPage; - -/** - Clears the collection view of all objects. - */ -- (void)clear; - -///-------------------------------------- -/// @name Querying -///-------------------------------------- - -/** - Override to construct your own custom `PFQuery` to get the objects. - - @return An instance of `PFQuery` that `-loadObjects` method will use to the objects for this collection. - */ -- (PFQuery *)queryForCollection; - -///-------------------------------------- -/// @name Data Source Methods -///-------------------------------------- - -/** - Override this method to customize each cell given a `PFObject` that is loaded. - - @warning The cell should inherit from `PFCollectionViewCell` which is a subclass of `UICollectionViewCell`. - - @param collectionView The collection view object associated with this controller. - @param indexPath The indexPath of the cell. - @param object The `PFObject` that is associated with the cell. - - @return The cell that represents this object. - */ -- (nullable PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(nullable PFObject *)object; - -/** - Override this method to customize the view that allows the user to load the - next page when pagination is turned on. - - @param collectionView The collection view object associated with this controller. - - @return The view that allows the user to paginate. - */ -- (nullable UICollectionReusableView *)collectionViewReusableViewForNextPageAction:(UICollectionView *)collectionView; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFQueryCollectionViewController.m b/ParseUI/ParseUI/Source/PFQueryCollectionViewController.m deleted file mode 100644 index 0f3ded0fd..000000000 --- a/ParseUI/ParseUI/Source/PFQueryCollectionViewController.m +++ /dev/null @@ -1,445 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFQueryCollectionViewController.h" - -#if __has_include() -#import -#import -#else -#import "BFTask.h" -#import "BFTaskCompletionSource.h" -#endif - -@import ParseCore; - -#import "PFActivityIndicatorCollectionReusableView.h" -#import "PFCollectionViewCell.h" -#import "PFImageView.h" -#import "PFLoadingView.h" -#import "PFLocalization.h" -#import "PFUIAlertView.h" - -static NSString *const PFQueryCollectionViewCellIdentifier = @"cell"; -static NSString *const PFQueryCollectionViewNextPageReusableViewIdentifier = @"nextPageView"; - -@interface PFQueryCollectionViewController () { - NSMutableArray *_mutableObjects; - - BOOL _firstLoad; // Whether we have loaded the first set of objects - NSInteger _currentPage; // The last page that was loaded - NSInteger _lastLoadCount; // The count of objects from the last load. -} - -@property (nonatomic, strong) PFLoadingView *loadingView; - -@property (nonatomic, strong) PFActivityIndicatorCollectionReusableView *currentNextPageView; - -- (instancetype)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER; - -@end - -@implementation PFQueryCollectionViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithCoder:(NSCoder *)decoder { - // initWithCoder is usually a parallel designated initializer, as is the case here - // It's used by storyboard - self = [super initWithCoder:decoder]; - if (!self) return nil; - - [self _setupWithClassName:nil]; - - return self; -} - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - // This is used by interface builder - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (!self) return nil; - - [self _setupWithClassName:nil]; - - return self; -} - -- (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout { - return[self initWithCollectionViewLayout:layout className:nil]; -} - -- (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout className:(NSString *)className { - self = [super initWithCollectionViewLayout:layout]; - if (!self) return nil; - - [self _setupWithClassName:className]; - - return self; -} - -- (instancetype)initWithClassName:(NSString *)className { - UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; - return [self initWithCollectionViewLayout:layout className:className]; -} - -- (void)_setupWithClassName:(NSString *)otherClassName { - _mutableObjects = [NSMutableArray array]; - _firstLoad = YES; - - // Set some reasonable defaults - _objectsPerPage = 25; - _loadingViewEnabled = YES; - _paginationEnabled = YES; - _pullToRefreshEnabled = YES; - _lastLoadCount = -1; - - _parseClassName = [otherClassName copy]; -} - -#pragma mark - -#pragma mark UIViewController - -- (void)loadView { - [super loadView]; - - self.collectionView.backgroundColor = [UIColor whiteColor]; - - [self.collectionView registerClass:[PFCollectionViewCell class] - forCellWithReuseIdentifier:PFQueryCollectionViewCellIdentifier]; - [self.collectionView registerClass:[PFActivityIndicatorCollectionReusableView class] - forSupplementaryViewOfKind:UICollectionElementKindSectionFooter - withReuseIdentifier:PFQueryCollectionViewNextPageReusableViewIdentifier]; - - if (@available(iOS 10.0, *)) { - if (self.pullToRefreshEnabled) { - self.collectionView.refreshControl = [[UIRefreshControl alloc] init]; - [self.collectionView.refreshControl addTarget:self - action:@selector(_refreshControlValueChanged:) - forControlEvents:UIControlEventValueChanged]; - self.collectionView.alwaysBounceVertical = YES; - } - } -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - [self loadObjects]; -} - -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - - self.loadingView.frame = self.collectionView.bounds; -} - -#pragma mark - -#pragma mark Responding to Events - -- (void)objectsWillLoad { - [self _refreshLoadingView]; -} - -- (void)objectsDidLoad:(NSError *)error { - [self _refreshLoadingView]; - _firstLoad = NO; -} - -#pragma mark - -#pragma mark Accessing Results - -- (NSArray *)objects { - return _mutableObjects; -} - -- (PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath { - return self.objects[indexPath.row]; -} - -#pragma mark - -#pragma mark Removing Objects - -- (void)removeObjectAtIndexPath:(NSIndexPath *)indexPath { - [self removeObjectsAtIndexPaths:@[ indexPath ]]; -} - -- (void)removeObjectsAtIndexPaths:(NSArray *)indexPaths { - if (indexPaths.count == 0) { - return; - } - - // We need the contents as both an index set and a list of index paths. - NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet]; - - for (NSIndexPath *indexPath in indexPaths) { - if (indexPath.section != 0) { - [NSException raise:NSRangeException format:@"Index Path section %lu out of range!", (long)indexPath.section]; - } - - if (indexPath.row >= self.objects.count) { - [NSException raise:NSRangeException format:@"Index Path row %lu out of range!", (long)indexPath.row]; - } - - [indexes addIndex:indexPath.row]; - } - - BFContinuationBlock deletionHandlerBlock = ^id (BFTask *task) { - if (@available(iOS 10.0, *)) { - self.collectionView.refreshControl.enabled = YES; - } - - if (task.error) { - [self _handleDeletionError:task.error]; - } - - return nil; - }; - - NSMutableArray *allDeletionTasks = [NSMutableArray arrayWithCapacity:indexes.count]; - NSArray *objectsToRemove = [self.objects objectsAtIndexes:indexes]; - - // Remove the contents from our local cache so we can give the user immediate feedback. - [_mutableObjects removeObjectsInArray:objectsToRemove]; - [self.collectionView deleteItemsAtIndexPaths:indexPaths]; - - for (id obj in objectsToRemove) { - [allDeletionTasks addObject:[obj deleteInBackground]]; - } - - [[BFTask taskForCompletionOfAllTasks:allDeletionTasks] - continueWithBlock:deletionHandlerBlock]; -} - -#pragma mark - -#pragma mark Loading Data - -- (BFTask *> *)loadObjects { - return [self loadObjects:0 clear:YES]; -} - -- (BFTask *> *)loadObjects:(NSInteger)page clear:(BOOL)clear { - self.loading = YES; - [self objectsWillLoad]; - - PFQuery *query = [self queryForCollection]; - [self _alterQuery:query forLoadingPage:page]; - - BFTaskCompletionSource *> *source = [BFTaskCompletionSource taskCompletionSource]; - [query findObjectsInBackgroundWithBlock:^(NSArray *foundObjects, NSError *error) { - dispatch_async(dispatch_get_main_queue(), ^{ - if (![Parse isLocalDatastoreEnabled] && - query.cachePolicy != kPFCachePolicyCacheOnly && - error.code == kPFErrorCacheMiss) { - // no-op on cache miss - return; - } - - self.loading = NO; - - if (error) { - self->_lastLoadCount = -1; - self->_currentNextPageView.animating = NO; - } else { - self->_currentPage = page; - self->_lastLoadCount = [foundObjects count]; - - if (clear) { - [self->_mutableObjects removeAllObjects]; - } - - [self->_mutableObjects addObjectsFromArray:foundObjects]; - [self.collectionView reloadData]; - } - - [self objectsDidLoad:error]; - if (@available(iOS 10.0, *)) { - [self.collectionView.refreshControl endRefreshing]; - } - - if (error) { - [source trySetError:error]; - } else { - [source trySetResult:foundObjects]; - } - }); - }]; - return source.task; -} - -- (void)loadNextPage { - if (!self.loading) { - [self loadObjects:(_currentPage + 1) clear:NO]; - _currentNextPageView.animating = YES; - } -} - -- (void)clear { - [_mutableObjects removeAllObjects]; - [self.collectionView reloadData]; - _currentPage = 0; -} - -#pragma mark - -#pragma mark Querying - -- (PFQuery *)queryForCollection { - if (!self.parseClassName) { - [NSException raise:NSInternalInconsistencyException - format:@"You need to specify a parseClassName for the PFQueryTableViewController.", nil]; - } - - PFQuery *query = [PFQuery queryWithClassName:self.parseClassName]; - - // If no objects are loaded in memory, we look to the cache first to fill the table - // and then subsequently do a query against the network. - if ([self.objects count] == 0 && ![Parse isLocalDatastoreEnabled]) { - query.cachePolicy = kPFCachePolicyCacheThenNetwork; - } - - [query orderByDescending:@"createdAt"]; - - return query; -} - -- (void)_alterQuery:(PFQuery *)query forLoadingPage:(NSInteger)page { - if (self.paginationEnabled && self.objectsPerPage) { - query.limit = self.objectsPerPage; - query.skip = page * self.objectsPerPage; - } -} - -#pragma mark - -#pragma mark Data Source Methods - -- (PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - PFCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:PFQueryCollectionViewCellIdentifier - forIndexPath:indexPath]; - [cell updateFromObject:object]; - return cell; -} - -- (UICollectionReusableView *)collectionViewReusableViewForNextPageAction:(UICollectionView *)collectionView { - _currentNextPageView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter - withReuseIdentifier:PFQueryCollectionViewNextPageReusableViewIdentifier - forIndexPath:[self _indexPathForPaginationReusableView]]; - _currentNextPageView.textLabel.text = PFLocalizedString(@"Load more...", @"Load more..."); - [_currentNextPageView addTarget:self action:@selector(loadNextPage) forControlEvents:UIControlEventTouchUpInside]; - _currentNextPageView.animating = self.loading; - return _currentNextPageView; -} - -#pragma mark - -#pragma mark UICollectionViewDataSource - -- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { - return 1; -} - -- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { - return [self.objects count]; -} - -- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath { - return [self collectionView:collectionView cellForItemAtIndexPath:indexPath object:[self objectAtIndexPath:indexPath]]; -} - -- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView - viewForSupplementaryElementOfKind:(NSString *)kind - atIndexPath:(NSIndexPath *)indexPath { - return [self collectionViewReusableViewForNextPageAction:collectionView]; -} - -#pragma mark - -#pragma mark UICollectionViewDelegateFlowLayout - -- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section { - if ([self _shouldShowPaginationView]) { - return CGSizeMake(CGRectGetWidth(collectionView.bounds), 50.0f); - } - return CGSizeZero; -} - -#pragma mark - -#pragma mark Pagination - -- (BOOL)_shouldShowPaginationView { - return (self.paginationEnabled && - [self.objects count] != 0 && - (_lastLoadCount == -1 || _lastLoadCount >= (NSInteger)self.objectsPerPage)); -} - -- (NSIndexPath *)_indexPathForPaginationReusableView { - return [NSIndexPath indexPathForItem:0 inSection:[self numberOfSectionsInCollectionView:self.collectionView] - 1]; -} - -#pragma mark - -#pragma mark Error handling - -- (void)_handleDeletionError:(NSError *)error { - // Fully reload on error. - [self loadObjects]; - - NSString *message = [NSString stringWithFormat:@"%@: \"%@\"", - PFLocalizedString(@"Error occurred during deletion", @"Error occurred during deletion"), - error.localizedDescription]; - [PFUIAlertView presentAlertInViewController:self withTitle:PFLocalizedString(@"Delete Error", @"Delete Error") message:message]; -} - -#pragma mark - -#pragma mark Actions - -- (void)_refreshControlValueChanged:(UIRefreshControl *)refreshControl { - if (!self.loading) { - [self loadObjects]; - } -} - -#pragma mark - -#pragma mark Loading View - -- (void)_refreshLoadingView { - BOOL showLoadingView = self.loadingViewEnabled && self.loading && _firstLoad; - - if (showLoadingView) { - [self.collectionView addSubview:self.loadingView]; - [self.view setNeedsLayout]; - } else { - // Avoid loading `loadingView` - just use an ivar. - if (_loadingView) { - [self.loadingView removeFromSuperview]; - self.loadingView = nil; - } - } -} - -- (PFLoadingView *)loadingView { - if (!_loadingView) { - _loadingView = [[PFLoadingView alloc] initWithFrame:CGRectZero]; - } - return _loadingView; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFQueryTableViewController.h b/ParseUI/ParseUI/Source/PFQueryTableViewController.h deleted file mode 100644 index 3460f4caf..000000000 --- a/ParseUI/ParseUI/Source/PFQueryTableViewController.h +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import -#import "ParseUIConstants.h" - -@import ParseCore; - -NS_ASSUME_NONNULL_BEGIN - -@class BFTask<__covariant BFGenericType>; -@class PFObject; -@class PFQuery; -@class PFTableViewCell; - -/** - This class allows you to think about a one-to-one mapping between a `PFObject` and a `UITableViewCell`, - rather than having to juggle index paths. - - You also get the following features out of the box: - - - Pagination with a cell that can be tapped to load the next page. - - Pull-to-refresh table view header. - - Automatic downloading and displaying of remote images in cells. - - Loading screen, shown before any data is loaded. - - Automatic loading and management of the objects array. - - Various methods that can be overridden to customize behavior at major events in the data cycle. - */ -@interface PFQueryTableViewController : UITableViewController - -///-------------------------------------- -/// @name Creating a PFQueryTableViewController -///-------------------------------------- - -/** - Initializes with a class name of the `PFObject` that will be associated with this table. - - @param style The UITableViewStyle for the table - @param className The class name of the instances of `PFObject` that this table will display. - - @return An initialized `PFQueryTableViewController` object or `nil` if the object couldn't be created. - */ -- (instancetype)initWithStyle:(UITableViewStyle)style - className:(nullable NSString *)className NS_DESIGNATED_INITIALIZER; - -/** - Initializes with a class name of the PFObjects that will be associated with this table. - - @param className The class name of the instances of `PFObject` that this table will display. - - @return An initialized `PFQueryTableViewController` object or `nil` if the object couldn't be created. - */ -- (instancetype)initWithClassName:(nullable NSString *)className; - -///-------------------------------------- -/// @name Configuring Behavior -///-------------------------------------- - -/** - The class name of the `PFObject` this table will use as a datasource. - */ -@property (nullable, nonatomic, copy) IBInspectable NSString *parseClassName; - -/** - The key to use to display for the cell text label. - - This won't apply if you override `-tableView:cellForRowAtIndexPath:object:` - */ -@property (nullable, nonatomic, copy) IBInspectable NSString *textKey; - -/** - The key to use to display for the cell image view. - - This won't apply if you override `-tableView:cellForRowAtIndexPath:object:` - */ -@property (nullable, nonatomic, copy) IBInspectable NSString *imageKey; - -/** - The image to use as a placeholder for the cell images. - - This won't apply if you override `-tableView:cellForRowAtIndexPath:object:` - */ -@property (nullable, nonatomic, strong) IBInspectable UIImage *placeholderImage; - -/** - Whether the table should use the default loading view. Default - `YES`. - */ -@property (nonatomic, assign) IBInspectable BOOL loadingViewEnabled; - -/** - Whether the table should use the built-in pull-to-refresh feature. Default - `YES`. - */ -@property (nonatomic, assign) IBInspectable BOOL pullToRefreshEnabled; - -/** - Whether the table should use the built-in pagination feature. Default - `YES`. - */ -@property (nonatomic, assign) IBInspectable BOOL paginationEnabled; - -/** - The number of objects to show per page. Default - `25`. - */ -@property (nonatomic, assign) IBInspectable NSUInteger objectsPerPage; - -/** - Whether the table is actively loading new data from the server. - */ -@property (nonatomic, assign, getter=isLoading) BOOL loading; - -///-------------------------------------- -/// @name Responding to Events -///-------------------------------------- - -/** - Called when objects will loaded from Parse. If you override this method, you must - call [super objectsWillLoad] in your implementation. - */ -- (void)objectsWillLoad; - -/** - Called when objects have loaded from Parse. If you override this method, you must - call [super objectsDidLoad:] in your implementation. - @param error The Parse error from running the PFQuery, if there was any. - */ -- (void)objectsDidLoad:(nullable NSError *)error; - -///-------------------------------------- -/// @name Accessing Results -///-------------------------------------- - -/** - The array of instances of `PFObject` that is used as a data source. - */ -@property (nullable, nonatomic, copy, readonly) NSArray<__kindof PFObject *> *objects; - -/** - Returns an object at a particular indexPath. - - The default impementation returns the object at `indexPath.row`. - If you want to return objects in a different indexPath order, like for sections, override this method. - - @param indexPath The indexPath. - - @return The object at the specified index - */ -- (nullable PFObject *)objectAtIndexPath:(nullable NSIndexPath *)indexPath; - -/** - Removes an object at the specified index path, animated. - */ -- (void)removeObjectAtIndexPath:(nullable NSIndexPath *)indexPath; - -/** - Removes an object at the specified index path, with or without animation. - */ -- (void)removeObjectAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)animated; - -/** - Removes all objects at the specified index paths, animated. - */ -- (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexPaths; - -/** - Removes all objects at the specified index paths, with or without animation. - */ -- (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexPaths animated:(BOOL)animated; - -/** - Removes the cell at the specified indexPath, with or without animation. - Important: This method only removes the cell. It does not delete any PFObject on the backend. - */ -- (void)removeCellAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)animated; - -/** - Removes the cells at the specified indexPaths, with or without animation. - Important: This method only removes the cells. It does not delete any PFObject on the backend. - */ -- (void)removeCellsAtIndexPaths:(NSArray *)indexPaths animated:(BOOL)animated; - -/** - Clears the table of all objects. - */ -- (void)clear; - -/** - Clears the table and loads the first page of objects. - - @return An awaitable task that completes when the reload succeeds - */ -- (BFTask *> *)loadObjects; - -/** - Loads the objects of the className at the specified page and appends it to the - objects already loaded and refreshes the table. - - @param page The page of objects to load. - @param clear Whether to clear the table after receiving the objects - - @return An awaitable task that completes when the reload succeeds - */ -- (BFTask *> *)loadObjects:(NSInteger)page clear:(BOOL)clear; - -/** - Loads the next page of objects, appends to table, and refreshes. - */ -- (void)loadNextPage; - -///-------------------------------------- -/// @name Querying -///-------------------------------------- - -/** - Override to construct your own custom PFQuery to get the objects. - @result PFQuery that loadObjects will use to the objects for this table. - */ -- (PFQuery *)queryForTable; - -///-------------------------------------- -/// @name Data Source Methods -///-------------------------------------- - -/** - Override this method to customize each cell given a PFObject that is loaded. - - If you don't override this method, it will use a default style cell and display either - the first data key from the object, or it will display the key as specified with `textKey`, `imageKey`. - - @warning The cell should inherit from `PFTableViewCell` which is a subclass of `UITableViewCell`. - - @param tableView The table view object associated with this controller. - @param indexPath The indexPath of the cell. - @param object The PFObject that is associated with the cell. - - @return The cell that represents this object. - */ -- (nullable PFTableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(nullable PFObject *)object; - -/** - Override this method to customize the cell that allows the user to load the - next page when pagination is turned on. - - @param tableView The table view object associated with this controller. - @param indexPath The indexPath of the cell. - - @return The cell that allows the user to paginate. - */ -- (nullable PFTableViewCell *)tableView:(UITableView *)tableView cellForNextPageAtIndexPath:(NSIndexPath *)indexPath; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFQueryTableViewController.m b/ParseUI/ParseUI/Source/PFQueryTableViewController.m deleted file mode 100644 index 655e89e35..000000000 --- a/ParseUI/ParseUI/Source/PFQueryTableViewController.m +++ /dev/null @@ -1,589 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFQueryTableViewController.h" - -#if __has_include() -#import -#import -#import -#else -#import "PFConstants.h" -#import "BFTask.h" -#import "BFTaskCompletionSource.h" -#endif - -@import ParseCore; - -#import "PFActivityIndicatorTableViewCell.h" -#import "PFImageView.h" -#import "PFLoadingView.h" -#import "PFLocalization.h" -#import "PFTableViewCell.h" -#import "PFUIAlertView.h" - -// Add headers to kill any warnings. -// `initWithStyle:` is a UITableViewController method. -// `initWithCoder:`/`initWithNibName:bundle:` are UIViewController methods and are, for sure, available. -@interface UITableViewController () - -- (instancetype)initWithStyle:(UITableViewStyle)style NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER; - -@end - -@interface PFQueryTableViewController () { - NSMutableArray *_mutableObjects; - - BOOL _firstLoad; // Whether we have loaded the first set of objects - NSInteger _currentPage; // The last page that was loaded - NSInteger _lastLoadCount; // The count of objects from the last load. - // Set to -1 when objects haven't loaded, or there was an error. - UITableViewCellSeparatorStyle _savedSeparatorStyle; -} - -@property (nonatomic, strong) PFLoadingView *loadingView; - -- (instancetype)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER; - -@end - -@implementation PFQueryTableViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithCoder:(NSCoder *)decoder { - // initWithCoder is usually a parallel designated initializer, as is the case here - // It's used by storyboard - self = [super initWithCoder:decoder]; - if (self) { - [self _setupWithClassName:nil]; - } - return self; -} - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - // This is used by interface builder - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - [self _setupWithClassName:nil]; - } - return self; -} - -- (instancetype)initWithStyle:(UITableViewStyle)style { - return [self initWithStyle:style className:nil]; -} - -- (instancetype)initWithClassName:(NSString *)className { - return [self initWithStyle:UITableViewStylePlain className:className]; -} - -- (instancetype)initWithStyle:(UITableViewStyle)style className:(NSString *)className { - self = [super initWithStyle:style]; - if (self) { - [self _setupWithClassName:className]; - } - return self; -} - -- (void)_setupWithClassName:(NSString *)otherClassName { - _mutableObjects = [NSMutableArray array]; - _firstLoad = YES; - - // Set some reasonable defaults - _objectsPerPage = 25; - _loadingViewEnabled = YES; - _paginationEnabled = YES; - _pullToRefreshEnabled = YES; - _lastLoadCount = -1; - - _parseClassName = [otherClassName copy]; -} - -#pragma mark - -#pragma mark UIViewController - -- (void)loadView { - [super loadView]; - - // Setup the Pull to Refresh UI if needed - if (self.pullToRefreshEnabled) { - UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; - [refreshControl addTarget:self - action:@selector(_refreshControlValueChanged:) - forControlEvents:UIControlEventValueChanged]; - self.refreshControl = refreshControl; - } -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - [self loadObjects]; -} - -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - - self.loadingView.frame = self.tableView.bounds; -} - -- (void)setEditing:(BOOL)editing animated:(BOOL)animated { - [self.tableView beginUpdates]; - - // If we're currently showing the pagination cell, we need to hide it during editing. - if ([self paginationEnabled] && [self _shouldShowPaginationCell]) { - [self.tableView deleteRowsAtIndexPaths:@[ [self _indexPathForPaginationCell] ] - withRowAnimation:UITableViewRowAnimationAutomatic]; - } - - [super setEditing:editing animated:animated]; - - // Ensure proper re-insertion of the pagination cell. - if ([self paginationEnabled] && [self _shouldShowPaginationCell]) { - [self.tableView insertRowsAtIndexPaths:@[ [self _indexPathForPaginationCell] ] - withRowAnimation:UITableViewRowAnimationAutomatic]; - } - - [self.tableView endUpdates]; -} - -#pragma mark - -#pragma mark Data - -- (void)objectsWillLoad { - if (_firstLoad) { - _savedSeparatorStyle = self.tableView.separatorStyle; - self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; - } - [self _refreshLoadingView]; -} - -- (void)objectsDidLoad:(NSError *)error { - if (_firstLoad) { - _firstLoad = NO; - self.tableView.separatorStyle = _savedSeparatorStyle; - } - [self _refreshLoadingView]; -} - -- (PFQuery *)queryForTable { - if (!self.parseClassName) { - [NSException raise:NSInternalInconsistencyException - format:@"You need to specify a parseClassName for the PFQueryTableViewController.", nil]; - } - - PFQuery *query = [PFQuery queryWithClassName:self.parseClassName]; - - // If no objects are loaded in memory, we look to the cache first to fill the table - // and then subsequently do a query against the network. - if ([self.objects count] == 0 && ![Parse isLocalDatastoreEnabled]) { - query.cachePolicy = kPFCachePolicyCacheThenNetwork; - } - - [query orderByDescending:@"createdAt"]; - - return query; -} - -// Alters a query to add functionality like pagination -- (void)_alterQuery:(PFQuery *)query forLoadingPage:(NSInteger)page { - if (self.paginationEnabled && self.objectsPerPage) { - query.limit = self.objectsPerPage; - query.skip = page * self.objectsPerPage; - } -} - -- (void)clear { - dispatch_async(dispatch_get_main_queue(), ^{ - [self->_mutableObjects removeAllObjects]; - [self.tableView reloadData]; - self->_currentPage = 0; - }); -} - -- (BFTask *> *)loadObjects { - return [self loadObjects:0 clear:YES]; -} - -- (BFTask *> *)loadObjects:(NSInteger)page clear:(BOOL)clear { - self.loading = YES; - [self objectsWillLoad]; - - PFQuery *query = [self queryForTable]; - [self _alterQuery:query forLoadingPage:page]; - - BFTaskCompletionSource *> *source = [BFTaskCompletionSource taskCompletionSource]; - [query findObjectsInBackgroundWithBlock:^(NSArray *foundObjects, NSError *error) { - dispatch_async(dispatch_get_main_queue(), ^{ - if (![Parse isLocalDatastoreEnabled] && - query.cachePolicy != kPFCachePolicyCacheOnly && - error.code == kPFErrorCacheMiss) { - // no-op on cache miss - return; - } - - self.loading = NO; - - if (error) { - self->_lastLoadCount = -1; - } else { - self->_currentPage = page; - self->_lastLoadCount = [foundObjects count]; - - if (clear) { - [self->_mutableObjects removeAllObjects]; - } - - [self->_mutableObjects addObjectsFromArray:foundObjects]; - } - [self.tableView reloadData]; - [self objectsDidLoad:error]; - [self.refreshControl endRefreshing]; - - if (error) { - [source trySetError:error]; - } else { - [source trySetResult:foundObjects]; - } - }); - }]; - - return source.task; -} - -- (void)loadNextPage { - if (!self.loading) { - [self loadObjects:(_currentPage + 1) clear:NO]; - } -} - -#pragma mark - -#pragma mark UIScrollViewDelegate - -// scrollViewDidEndDragging:willDecelerate: is called when a user stops dragging the table view. -- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { - // If the user lets go and the table view has no momentum, - // scrollViewDidEndDragging:willDecelerate: is called with willDecelerate:NO. - // In this case, we trigger a load for all the PFImageViews - // in our PFTableViewCells through _loadImagesForOnscreenRows. - if (!decelerate) { - [self _loadImagesForOnscreenRows]; - } -} - -// If the user lets go and the table view has momentum, -// scrollViewDidEndDragging:willDecelerate: is called with willDecelerate:YES. -// We will defer loading of images until scrollViewDidEndDecelerating: is called. -- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { - [self _loadImagesForOnscreenRows]; -} - -#pragma mark - -#pragma mark UITableViewDataSource - -// Return the number of rows in the section. -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - NSInteger count = [self.objects count]; - - if ([self _shouldShowPaginationCell]) { - count += 1; - } - - return count; -} - -// Default implementation that displays a default style cell -- (PFTableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - static NSString *cellIdentifier = @"PFTableViewCell"; - PFTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if (!cell) { - cell = [[PFTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; - } - - [self tableView:tableView configureCell:cell atIndexPath:indexPath object:object]; - - return cell; -} - -- (void)tableView:(UITableView *)tableView - configureCell:(PFTableViewCell *)cell - atIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - // Grab a key to display - NSString *key; - if (self.textKey) { - key = self.textKey; - } else if ([[object allKeys] count] > 0) { - key = [[object allKeys] objectAtIndex:0]; - } - - // Configure the cell - if (key) { - cell.textLabel.text = [NSString stringWithFormat:@"%@", [object objectForKey:key]]; - } - - if (self.placeholderImage) { - cell.imageView.image = self.placeholderImage; - } - - if (self.imageKey) { - cell.imageView.file = object[self.imageKey]; - } -} - -- (PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath { - return self.objects[indexPath.row]; -} - -- (void)removeObjectAtIndexPath:(NSIndexPath *)indexPath { - [self removeObjectAtIndexPath:indexPath animated:YES]; -} - -- (void)removeObjectAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated { - [self removeObjectsAtIndexPaths:@[ indexPath ] animated:animated]; -} - -- (void)removeObjectsAtIndexPaths:(NSArray *)indexPaths { - [self removeObjectsAtIndexPaths:indexPaths animated:YES]; -} - -- (void)removeCellAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)animated { - [self removeCellsAtIndexPaths:@[indexPath] animated: animated]; -} - -- (void)removeCellsAtIndexPaths:(NSArray *)indexPaths animated:(BOOL)animated { - NSMutableIndexSet *mutableIndexSet = [[NSMutableIndexSet alloc]init]; - - for (NSIndexPath *indexPath in indexPaths) { - [mutableIndexSet addIndex:indexPath.row]; - } - - [_mutableObjects removeObjectsAtIndexes:mutableIndexSet]; - - [self.tableView deleteRowsAtIndexPaths:indexPaths - withRowAnimation:animated ? UITableViewRowAnimationAutomatic : UITableViewRowAnimationNone]; -} - -- (void)removeObjectsAtIndexPaths:(NSArray *)indexPaths animated:(BOOL)animated { - if (indexPaths.count == 0) { - return; - } - - // We need the contents as both an index set and a list of index paths. - NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet]; - - for (NSIndexPath *indexPath in indexPaths) { - if (indexPath.section != 0) { - [NSException raise:NSRangeException format:@"Index Path section %lu out of range!", (long)indexPath.section]; - } - - if (indexPath.row >= self.objects.count) { - [NSException raise:NSRangeException format:@"Index Path row %lu out of range!", (long)indexPath.row]; - } - - [indexes addIndex:indexPath.row]; - } - - BFContinuationBlock deletionHandlerBlock = ^id (BFTask *task) { - self.refreshControl.enabled = YES; - if (task.error) { - [self _handleDeletionError:task.error]; - } - - return nil; - }; - - NSMutableArray *allDeletionTasks = [NSMutableArray arrayWithCapacity:indexes.count]; - NSArray *objectsToRemove = [self.objects objectsAtIndexes:indexes]; - - // Remove the contents from our local cache so we can give the user immediate feedback. - [_mutableObjects removeObjectsInArray:objectsToRemove]; - [self.tableView deleteRowsAtIndexPaths:indexPaths - withRowAnimation:animated ? UITableViewRowAnimationAutomatic : UITableViewRowAnimationNone]; - - for (id obj in objectsToRemove) { - [allDeletionTasks addObject:[obj deleteInBackground]]; - } - - [[BFTask taskForCompletionOfAllTasks:allDeletionTasks] continueWithExecutor:[BFExecutor mainThreadExecutor] - withBlock:deletionHandlerBlock]; -} - -- (PFTableViewCell *)tableView:(UITableView *)otherTableView cellForNextPageAtIndexPath:(NSIndexPath *)indexPath { - static NSString *cellIdentifier = @"PFTableViewCellNextPage"; - - PFActivityIndicatorTableViewCell *cell = [otherTableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if (cell == nil) { - cell = [[PFActivityIndicatorTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault - reuseIdentifier:cellIdentifier]; - cell.textLabel.text = PFLocalizedString(@"Load more...", @"Load more..."); - } - - cell.animating = self.loading; - - return cell; -} - -- (UITableViewCell *)tableView:(UITableView *)otherTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - PFTableViewCell *cell; - if ([self _shouldShowPaginationCell] && [indexPath isEqual:[self _indexPathForPaginationCell]]) { - // Return the pagination cell on the last cell - cell = [self tableView:otherTableView cellForNextPageAtIndexPath:indexPath]; - } else { - cell = [self tableView:otherTableView - cellForRowAtIndexPath:indexPath - object:[self objectAtIndexPath:indexPath]]; - } - - if ([cell isKindOfClass:[PFTableViewCell class]] && - !otherTableView.dragging && - !otherTableView.decelerating) { - // The reason we dispatch to the main queue is that we want to enable subclasses to override - // tableView:cellForRowAtIndexPath:object:, and we still do image loading after they assign - // the remote image file. - dispatch_async(dispatch_get_main_queue(), ^{ - [cell.imageView loadInBackground]; - }); - } - return cell; -} - -#pragma mark - -#pragma mark UITableViewDelegate - -- (void)tableView:(UITableView *)otherTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - // Handle selection of the next page row - if (!_firstLoad && - self.paginationEnabled && - [indexPath isEqual:[self _indexPathForPaginationCell]]) { - [self loadNextPage]; - } -} - -- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView - editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { - if ([indexPath isEqual:[self _indexPathForPaginationCell]]) { - return UITableViewCellEditingStyleNone; - } - - return UITableViewCellEditingStyleDelete; -} - -- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath { - if ([indexPath isEqual:[self _indexPathForPaginationCell]]) { - return NO; - } - - return YES; -} - -#pragma mark - -#pragma mark Private - -// Whether we need to show the pagination cell -- (BOOL)_shouldShowPaginationCell { - return (self.paginationEnabled && - !self.editing && - [self.objects count] != 0 && - (_lastLoadCount == -1 || _lastLoadCount >= (NSInteger)self.objectsPerPage)); -} - -// The row of the pagination cell -- (NSIndexPath *)_indexPathForPaginationCell { - return [NSIndexPath indexPathForRow:[self.objects count] inSection:0]; -} - -- (void)_loadImagesForOnscreenRows { - if (self.objects.count > 0) { - NSArray *visiblePaths = [self.tableView indexPathsForVisibleRows]; - for (NSIndexPath *indexPath in visiblePaths) { - [self _loadImageForCellAtIndexPath:indexPath]; - } - } -} - -- (void)_loadImageForCellAtIndexPath:(NSIndexPath *)indexPath { - PFTableViewCell *cell = (PFTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath]; - if ([cell isKindOfClass:[PFTableViewCell class]]) { - [cell.imageView loadInBackground]; - } -} - -#pragma mark - -#pragma mark Error handling - -- (void)_handleDeletionError:(NSError *)error { - // Fully reload on error. - [self loadObjects]; - - NSString *message = [NSString stringWithFormat:@"%@: \"%@\"", - PFLocalizedString(@"Error occurred during deletion", @"Error occurred during deletion"), - error.localizedDescription]; - [PFUIAlertView presentAlertInViewController:self withTitle:PFLocalizedString(@"Delete Error", @"Delete Error") message:message]; -} - -#pragma mark - -#pragma mark Actions - -- (void)_refreshControlValueChanged:(UIRefreshControl *)refreshControl { - [self loadObjects]; -} - -#pragma mark - -#pragma mark Accessors - -- (NSArray<__kindof PFObject *> *)objects { - return _mutableObjects; -} - -#pragma mark - -#pragma mark Loading View - -- (void)_refreshLoadingView { - BOOL showLoadingView = self.loadingViewEnabled && self.loading && _firstLoad; - - if (showLoadingView) { - [self.tableView addSubview:self.loadingView]; - [self.view setNeedsLayout]; - } else { - // Avoid loading `loadingView` - just use an ivar. - if (_loadingView) { - [self.loadingView removeFromSuperview]; - self.loadingView = nil; - } - } -} - -- (PFLoadingView *)loadingView { - if (!_loadingView) { - _loadingView = [[PFLoadingView alloc] initWithFrame:CGRectZero]; - } - return _loadingView; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFResources.h b/ParseUI/ParseUI/Source/PFResources.h deleted file mode 100644 index 3adb9f110..000000000 --- a/ParseUI/ParseUI/Source/PFResources.h +++ /dev/null @@ -1,10 +0,0 @@ -// This is an auto-generated file. -#import -@interface PFResources : NSObject -+ (NSData *)apple_icon3x_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)parse_logo_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)apple_icon2x_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)parse_logo2x_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)parse_logo3x_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)apple_icon_png;//modified:2022-11-07 15:10:28 +0300 -@end diff --git a/ParseUI/ParseUI/Source/PFResources.m b/ParseUI/ParseUI/Source/PFResources.m deleted file mode 100644 index 67106e827..000000000 --- a/ParseUI/ParseUI/Source/PFResources.m +++ /dev/null @@ -1,50 +0,0 @@ -// This is an auto-generated file. -#import "PFResources.h" -@implementation PFResources - static const unsigned char apple_icon3x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x42, 0x8, 0x6, 0x0, 0x0, 0x0, 0x1c, 0xf6, 0x25, 0xa, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x4, 0xca, 0x49, 0x44, 0x41, 0x54, 0x68, 0x5, 0xdd, 0x9b, 0x5b, 0x68, 0x15, 0x47, 0x1c, 0xc6, 0x3d, 0xb1, 0xde, 0xad, 0x22, 0xde, 0x83, 0x60, 0xad, 0x18, 0x44, 0xd4, 0x34, 0x6a, 0xd1, 0x7, 0x93, 0xa7, 0x5a, 0xaa, 0x6d, 0xbc, 0xd5, 0x27, 0x9, 0xf8, 0x50, 0x21, 0xa8, 0x8, 0xa2, 0x42, 0x15, 0xbc, 0xa1, 0xc5, 0xb, 0x14, 0x44, 0x41, 0x2d, 0xe2, 0x83, 0x60, 0x29, 0x5a, 0xa8, 0x2d, 0x48, 0x20, 0x79, 0xb0, 0x8d, 0xf, 0xad, 0xd7, 0x62, 0xa9, 0x4a, 0x51, 0x50, 0xe2, 0x9d, 0x88, 0xe2, 0x2d, 0x78, 0x8d, 0xc6, 0xdf, 0x77, 0x3c, 0x7b, 0xd8, 0x73, 0x32, 0xbb, 0xb3, 0xe7, 0x44, 0xe8, 0x8c, 0x7f, 0xf8, 0x32, 0xb3, 0xf3, 0x9f, 0x99, 0xfd, 0xbe, 0xf3, 0x9f, 0xdd, 0x9d, 0x9d, 0xd9, 0xa4, 0x3a, 0x39, 0x66, 0x6d, 0x6d, 0x6d, 0x13, 0xa1, 0x54, 0x3, 0x2a, 0xc0, 0x68, 0x50, 0x9a, 0x4a, 0xa5, 0x5e, 0x93, 0xfa, 0x69, 0x8, 0x9a, 0xb, 0x4e, 0x83, 0x7c, 0xeb, 0xe9, 0xa5, 0x22, 0x54, 0x94, 0x82, 0x5f, 0xf3, 0xd5, 0x64, 0x8e, 0x1f, 0xf9, 0x2a, 0x6a, 0x12, 0x2, 0xee, 0x46, 0x88, 0x52, 0xf1, 0x7f, 0xc5, 0xa, 0x2b, 0x29, 0xb6, 0x61, 0x47, 0xdb, 0x41, 0xba, 0x92, 0x3e, 0x8e, 0x82, 0xfe, 0x31, 0x7d, 0xfd, 0x19, 0xe3, 0x73, 0xcf, 0x85, 0xa8, 0x51, 0xe0, 0x11, 0xb0, 0xd9, 0x6c, 0xf7, 0xd8, 0x47, 0x30, 0x42, 0x49, 0x37, 0xf0, 0x8f, 0x4d, 0x11, 0xfe, 0x7b, 0xc0, 0x9f, 0x1b, 0x7, 0x64, 0x57, 0x26, 0x10, 0xa5, 0x2a, 0x6b, 0x22, 0x7e, 0x1b, 0xf7, 0x8a, 0x21, 0xdb, 0x17, 0x28, 0x12, 0x36, 0xbb, 0x43, 0x85, 0xbe, 0xee, 0x29, 0x88, 0x60, 0x4, 0xd9, 0x25, 0x36, 0x45, 0x19, 0xff, 0xac, 0x88, 0x2e, 0xdc, 0x2c, 0x86, 0x74, 0x63, 0x2, 0x61, 0x3b, 0xdd, 0x64, 0x1f, 0xc1, 0xa, 0x41, 0x1a, 0x86, 0xaf, 0x2c, 0xc2, 0x76, 0xe3, 0x4f, 0x45, 0x74, 0xe1, 0x66, 0x31, 0x84, 0xcb, 0x63, 0x44, 0xbd, 0xc0, 0xb7, 0xce, 0x4d, 0xe6, 0x16, 0x56, 0x10, 0xaf, 0x8e, 0x10, 0x76, 0x86, 0xf2, 0x72, 0x4b, 0xf3, 0x82, 0xdd, 0x1f, 0x14, 0xdc, 0xa2, 0xf8, 0x6, 0xe1, 0x73, 0x3d, 0xa6, 0x9b, 0x7a, 0xb0, 0x87, 0x99, 0xfb, 0x1f, 0xc5, 0x77, 0xe9, 0x40, 0x4b, 0xa2, 0xd2, 0x3, 0x4c, 0x4, 0x43, 0x93, 0xd0, 0xa1, 0x5e, 0x57, 0xd0, 0x2b, 0x49, 0x5d, 0x53, 0x9d, 0x82, 0x2e, 0x54, 0x4e, 0xd4, 0x99, 0x4e, 0xaa, 0xc0, 0xc, 0x30, 0x2, 0x94, 0x82, 0xc1, 0xa0, 0x5, 0x34, 0x81, 0x13, 0xe0, 0x37, 0xa2, 0x50, 0xd0, 0xe4, 0x55, 0x22, 0x68, 0xf7, 0x39, 0xa8, 0x6, 0x9f, 0x82, 0x32, 0x10, 0x88, 0x7a, 0x49, 0xfe, 0x6, 0x38, 0xf, 0x1a, 0x41, 0x1d, 0xfd, 0x5f, 0x24, 0xed, 0xb8, 0x71, 0x62, 0xbd, 0x5a, 0xe8, 0x8e, 0x15, 0x37, 0x13, 0xc7, 0x9d, 0x35, 0x4d, 0x99, 0xbe, 0x5, 0x91, 0xd1, 0xc1, 0x57, 0x2, 0xa6, 0x81, 0x3, 0xe0, 0x21, 0x28, 0xc4, 0xf4, 0xd8, 0xd0, 0x8f, 0x50, 0x9c, 0xd1, 0xb8, 0x27, 0x58, 0xf, 0x5a, 0x40, 0x31, 0xd6, 0x4a, 0xa3, 0x23, 0xa0, 0x6, 0x8c, 0x0, 0xfd, 0xc0, 0x14, 0xf0, 0x1d, 0xb8, 0xa, 0x3a, 0x6a, 0xf5, 0x74, 0xf0, 0xb1, 0x49, 0x5d, 0xe4, 0x50, 0xa4, 0xc1, 0x30, 0x1a, 0xd4, 0x81, 0xf1, 0xa6, 0x86, 0xe, 0x95, 0xdd, 0x87, 0xcb, 0xd7, 0xf9, 0x37, 0x21, 0xe3, 0xfb, 0x18, 0xa2, 0x3e, 0xa1, 0xf2, 0x49, 0xe0, 0xba, 0x28, 0xfd, 0xbe, 0xfd, 0x40, 0x3, 0x9c, 0xe7, 0xea, 0x20, 0xb0, 0x76, 0x11, 0xa3, 0xc2, 0x28, 0x9c, 0x67, 0x40, 0x9f, 0xa0, 0x92, 0x27, 0xe9, 0x13, 0x78, 0x56, 0x11, 0xb9, 0xbf, 0xc5, 0x37, 0x27, 0x62, 0x88, 0xea, 0x41, 0xd9, 0x2f, 0xc0, 0x37, 0x51, 0xd2, 0xa2, 0x77, 0xb7, 0xec, 0xec, 0x25, 0x47, 0x18, 0x8e, 0xdd, 0x60, 0x1c, 0xf0, 0xd1, 0x76, 0x41, 0x7a, 0x5e, 0x40, 0x3c, 0x3b, 0x14, 0x89, 0xd6, 0x14, 0xa, 0x8f, 0x7, 0xe, 0xcf, 0xd2, 0x55, 0xc, 0xc1, 0x6d, 0x61, 0xce, 0xe1, 0x88, 0xad, 0xd, 0x3b, 0x3c, 0xca, 0x6f, 0xca, 0x17, 0x25, 0xee, 0xe9, 0x88, 0x11, 0xad, 0x9, 0xe4, 0xd3, 0x17, 0x9d, 0x47, 0x82, 0x44, 0xb5, 0x1, 0x4c, 0x47, 0x58, 0x5b, 0x3e, 0xef, 0x20, 0x62, 0x4b, 0xf3, 0x1d, 0x1e, 0x1c, 0x6b, 0x31, 0x75, 0x81, 0x49, 0x94, 0xb8, 0x7, 0xc2, 0x34, 0x4f, 0xf3, 0xcd, 0xb6, 0x23, 0xaa, 0x39, 0x8a, 0x74, 0x8a, 0x61, 0x38, 0x6, 0xe7, 0x85, 0xa8, 0xa, 0x8e, 0x96, 0xeb, 0xb5, 0x67, 0x18, 0xc2, 0x14, 0x35, 0xa3, 0x29, 0x62, 0x9f, 0x19, 0x3d, 0x6e, 0x17, 0x36, 0xc4, 0x89, 0x12, 0x75, 0x9, 0x9b, 0xec, 0xb6, 0x6, 0x23, 0xbb, 0x23, 0xc6, 0xd2, 0x50, 0xa1, 0x84, 0xd, 0xa, 0x1d, 0xfb, 0x92, 0xb5, 0x3e, 0x6f, 0x25, 0x6c, 0xa0, 0x2f, 0x6a, 0x42, 0x3c, 0x6f, 0x87, 0xf2, 0xc6, 0xac, 0x8f, 0xc2, 0x5a, 0xb8, 0xbe, 0xf4, 0xc6, 0x1e, 0x6b, 0x12, 0x36, 0x20, 0xb6, 0x86, 0x7b, 0xce, 0x44, 0xdb, 0xb6, 0x12, 0x96, 0xa8, 0xa2, 0x43, 0xfa, 0xfa, 0xf0, 0x88, 0xea, 0x6d, 0xe3, 0x23, 0x61, 0xd6, 0xb0, 0xda, 0x3a, 0xf9, 0x1f, 0xfc, 0x7a, 0xbb, 0x8f, 0x35, 0x9, 0xd3, 0xc3, 0xce, 0x37, 0xd3, 0xcb, 0x70, 0xac, 0x49, 0x98, 0x96, 0xb6, 0x7c, 0xb3, 0x9c, 0x65, 0x0, 0x13, 0x79, 0x9, 0xbb, 0x6c, 0x72, 0x38, 0x5e, 0x36, 0x87, 0xeb, 0xac, 0x6b, 0x1c, 0x47, 0x5f, 0x85, 0x69, 0x53, 0x70, 0xbe, 0x4d, 0x98, 0x56, 0x6f, 0x7d, 0xb4, 0x2d, 0x44, 0x2d, 0x72, 0x6d, 0x46, 0x11, 0xfb, 0xb, 0xbc, 0xf0, 0x50, 0xd9, 0x10, 0x38, 0x6f, 0x8d, 0xe2, 0x5d, 0xc2, 0x53, 0x5c, 0xcb, 0x56, 0x5a, 0x43, 0xf4, 0xd1, 0x16, 0x11, 0xb5, 0xc5, 0x26, 0xe2, 0x8a, 0x98, 0xac, 0x31, 0xfd, 0xd7, 0xcf, 0x3f, 0x3b, 0x11, 0xa7, 0x8f, 0xca, 0x72, 0x2c, 0x10, 0xe6, 0xf3, 0x1e, 0x95, 0x76, 0x80, 0xb4, 0xb1, 0xb1, 0x11, 0x4, 0x7a, 0xb2, 0x8b, 0x39, 0xdd, 0x71, 0xde, 0x3, 0x5a, 0x74, 0xf4, 0xd9, 0x74, 0x23, 0xac, 0xe5, 0xf2, 0xfa, 0x37, 0xbc, 0xae, 0xb8, 0x8f, 0xc2, 0x6f, 0x7c, 0x56, 0x95, 0xe1, 0xae, 0xb9, 0xef, 0xea, 0x6c, 0xe8, 0x38, 0xf8, 0xe1, 0x3d, 0x10, 0x25, 0x9, 0xd2, 0xd4, 0x94, 0x8d, 0x98, 0x4a, 0x18, 0xa3, 0xa7, 0x49, 0x26, 0x29, 0xef, 0xb1, 0x69, 0x5b, 0xa9, 0x34, 0x1c, 0x31, 0x69, 0x79, 0x1f, 0xa2, 0xb6, 0x9f, 0x6b, 0xec, 0x59, 0x7e, 0xc4, 0x74, 0xf3, 0xb8, 0x5, 0x34, 0x65, 0xf1, 0xd1, 0xb4, 0x5f, 0x3d, 0x12, 0x61, 0xd7, 0x73, 0x22, 0x96, 0x79, 0x58, 0xef, 0xf0, 0x51, 0x51, 0x86, 0xf3, 0x8f, 0x12, 0xa5, 0x7c, 0x4e, 0xc4, 0x54, 0xc0, 0x75, 0xf6, 0x21, 0x89, 0x66, 0xfc, 0xbe, 0x2d, 0xf2, 0x28, 0x5a, 0x63, 0x11, 0x76, 0x89, 0x34, 0xbb, 0xc4, 0xad, 0x7c, 0xda, 0x70, 0xe8, 0xc5, 0x73, 0xc3, 0xdb, 0x23, 0xaf, 0xfe, 0x6a, 0xc9, 0x3b, 0x2d, 0x4a, 0xac, 0xdb, 0x45, 0x4c, 0x85, 0x99, 0x27, 0xb8, 0xbe, 0xc7, 0xd5, 0x9e, 0x99, 0xf, 0x76, 0x13, 0x92, 0xa3, 0x11, 0x96, 0x5d, 0xe6, 0xc8, 0xb9, 0xc6, 0x2, 0x5, 0x54, 0xd0, 0x43, 0x6e, 0x21, 0x78, 0x1e, 0x94, 0x39, 0x9e, 0x2e, 0xf, 0x8b, 0x12, 0x57, 0xa3, 0x30, 0x39, 0xa8, 0xa8, 0x8d, 0x8a, 0x15, 0xca, 0x3b, 0x6e, 0x3f, 0xc1, 0xf5, 0xe7, 0x7c, 0x8e, 0xc6, 0xa1, 0x18, 0xae, 0xc4, 0xb0, 0x3c, 0xcc, 0xf1, 0x9c, 0x70, 0x99, 0x43, 0xf9, 0x2b, 0x70, 0xa9, 0x40, 0x58, 0xbb, 0x5d, 0x97, 0x24, 0xc2, 0xf4, 0x1d, 0xc5, 0x59, 0x30, 0xdc, 0x21, 0x41, 0xa2, 0xa2, 0x97, 0xe3, 0x4a, 0x44, 0x9d, 0x32, 0xf1, 0x8a, 0x1c, 0x8a, 0x41, 0x65, 0x1a, 0x6a, 0x8a, 0xf2, 0x25, 0x78, 0x10, 0x94, 0x39, 0x90, 0x6a, 0x6b, 0x56, 0xbb, 0x99, 0x46, 0x51, 0x5, 0xf1, 0x63, 0x48, 0x4e, 0x5, 0x4f, 0x81, 0xb, 0xb6, 0xcc, 0x46, 0xde, 0x3a, 0x14, 0xc3, 0x1d, 0xa0, 0x68, 0x26, 0xc7, 0x7, 0x81, 0x3e, 0x74, 0x49, 0x6a, 0xe7, 0xa8, 0xf8, 0x3b, 0x50, 0xaa, 0x77, 0xbe, 0x56, 0xa0, 0xe1, 0x5d, 0x6, 0xaa, 0x40, 0x25, 0x48, 0xca, 0x43, 0x91, 0x5a, 0x43, 0xa4, 0x36, 0x93, 0xbe, 0x5b, 0x43, 0x9c, 0xfe, 0xd1, 0xe6, 0xa2, 0x25, 0x6c, 0xcd, 0xf8, 0xbf, 0x7, 0xe5, 0xb6, 0xb3, 0x53, 0xe7, 0x23, 0xb0, 0x1e, 0x34, 0x81, 0x38, 0xbb, 0x86, 0xf3, 0x2b, 0x5b, 0x7f, 0x1d, 0xf2, 0x73, 0x2, 0x7d, 0xfd, 0x59, 0xb, 0x8e, 0x1, 0x7d, 0xc3, 0xf8, 0xc, 0x88, 0xd8, 0x21, 0x30, 0xf, 0x74, 0x29, 0xf4, 0x4, 0xb4, 0xd1, 0xf7, 0x8b, 0x5f, 0x80, 0xbd, 0x40, 0xdf, 0x9, 0x4b, 0x88, 0x7e, 0xc0, 0x3a, 0xb0, 0x10, 0x68, 0x82, 0x9e, 0xd8, 0xde, 0x0, 0xa1, 0x3b, 0xe4, 0xa8, 0x44, 0xd8, 0xd7, 0x91, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)apple_icon3x_png { - return [NSData dataWithBytes:apple_icon3x_png length:sizeof(apple_icon3x_png)]; - } - - static const unsigned char parse_logo_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0xde, 0x0, 0x0, 0x0, 0x44, 0x8, 0x6, 0x0, 0x0, 0x0, 0xee, 0x9a, 0x8b, 0x92, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x44, 0x43, 0x37, 0x45, 0x43, 0x42, 0x35, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x44, 0x43, 0x37, 0x45, 0x43, 0x42, 0x36, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x31, 0x30, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x44, 0x43, 0x37, 0x45, 0x43, 0x42, 0x34, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0xf6, 0xc4, 0x10, 0x9d, 0x0, 0x0, 0x11, 0x8e, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x5d, 0x9, 0x98, 0x54, 0xc5, 0x11, 0xae, 0xdd, 0x9d, 0x5, 0x59, 0x90, 0x9b, 0x5, 0xb9, 0x5, 0x11, 0xf0, 0x2, 0x14, 0x54, 0x54, 0x22, 0x6e, 0x44, 0x3c, 0x50, 0xbc, 0x95, 0xc3, 0x88, 0x9, 0x41, 0x3c, 0x21, 0x1e, 0x68, 0x30, 0x11, 0x8f, 0x18, 0x3c, 0x51, 0x14, 0x13, 0x94, 0x28, 0x26, 0x9e, 0x78, 0x44, 0x12, 0x15, 0x25, 0xe0, 0x89, 0x8a, 0x28, 0x88, 0xa0, 0xe2, 0xe2, 0x2, 0x72, 0xca, 0xd, 0xcb, 0xd, 0x7b, 0xb0, 0xe9, 0xdf, 0xf7, 0xf7, 0x37, 0x9d, 0x9, 0xc8, 0xcc, 0xce, 0x3b, 0xe6, 0x3d, 0xba, 0xbe, 0xaf, 0xbe, 0xe9, 0xd9, 0x9d, 0x79, 0xd3, 0xaf, 0xbb, 0xff, 0xea, 0xaa, 0xea, 0xaa, 0x7a, 0x59, 0xfd, 0xae, 0xbd, 0xe5, 0x55, 0x11, 0x69, 0xa3, 0xb8, 0x5c, 0xfc, 0xa1, 0x2c, 0xc5, 0x6b, 0x15, 0x17, 0x2a, 0xfe, 0x54, 0xf1, 0xc7, 0x8a, 0x97, 0x8b, 0x25, 0x4b, 0x11, 0xa5, 0x8a, 0x8a, 0xa, 0xc5, 0x22, 0xf7, 0xe, 0x1f, 0x2a, 0xcd, 0x9b, 0x1c, 0xf4, 0xd3, 0xdf, 0x62, 0x8a, 0x4f, 0x52, 0xdc, 0x30, 0x80, 0xfe, 0xf4, 0x50, 0x7c, 0x9d, 0xe2, 0x95, 0x8a, 0xa7, 0x29, 0xfe, 0x87, 0xe2, 0xc9, 0x8a, 0xcb, 0xec, 0x54, 0x59, 0x8a, 0x3a, 0x1, 0x78, 0xbb, 0xd9, 0xde, 0xaa, 0x78, 0x1, 0x77, 0x24, 0xcf, 0xc0, 0xaf, 0xb8, 0x8a, 0xe2, 0x3a, 0x8a, 0x1b, 0xf0, 0xf7, 0x21, 0x2, 0x2e, 0x26, 0xcf, 0x54, 0x7c, 0xa7, 0xe2, 0x37, 0xed, 0xd4, 0x58, 0x8a, 0x3a, 0xf0, 0x34, 0xcd, 0x50, 0x7c, 0xaa, 0x4f, 0xbf, 0x59, 0x53, 0x71, 0x63, 0xc5, 0xc7, 0x2a, 0x3e, 0x9b, 0xbb, 0x5f, 0x75, 0xc5, 0x9d, 0x15, 0xbf, 0xa1, 0x78, 0x82, 0xe2, 0x6b, 0x15, 0xaf, 0xb3, 0x53, 0x64, 0x29, 0x8a, 0x94, 0x9d, 0x60, 0x7b, 0xf9, 0x41, 0x50, 0x25, 0x37, 0x28, 0xfe, 0x46, 0xf1, 0xd3, 0x8a, 0xcf, 0x53, 0xdc, 0x41, 0xf1, 0x63, 0x8a, 0x77, 0xf2, 0x33, 0x97, 0xd0, 0xfe, 0xeb, 0x64, 0xa7, 0xc8, 0x52, 0xd4, 0x81, 0x17, 0x24, 0x2d, 0x54, 0x7c, 0xbd, 0xe2, 0xe3, 0x15, 0x4f, 0xe7, 0xdf, 0xe0, 0xf0, 0x79, 0x57, 0x71, 0x81, 0x9d, 0x26, 0x4b, 0x16, 0x78, 0xde, 0xd2, 0x1c, 0xc5, 0xa7, 0x28, 0xfe, 0x2b, 0xdf, 0xc3, 0x16, 0x7c, 0x4d, 0xf1, 0x71, 0x76, 0xaa, 0x2c, 0x59, 0xe0, 0x79, 0x4b, 0xbb, 0x14, 0x5f, 0xad, 0xf8, 0x76, 0xbe, 0xaf, 0xad, 0xf8, 0x45, 0xc5, 0xcd, 0xec, 0x74, 0x59, 0xb2, 0xc0, 0xf3, 0x9e, 0xee, 0x56, 0xfc, 0x0, 0xdb, 0x7, 0x2b, 0xfe, 0x8b, 0x8f, 0x76, 0xa8, 0x25, 0x4b, 0xfb, 0x2d, 0xf0, 0x40, 0xb7, 0x88, 0xe3, 0xe5, 0x4, 0xf5, 0x52, 0x7c, 0xa5, 0x9d, 0x32, 0x4b, 0x16, 0x78, 0xde, 0x13, 0xce, 0xfd, 0xe0, 0x74, 0x59, 0xc5, 0xf7, 0xb7, 0x29, 0xce, 0xb7, 0xd3, 0x66, 0xc9, 0x2, 0xcf, 0x7b, 0x5a, 0xac, 0x78, 0x4, 0xdb, 0x4d, 0xc5, 0x89, 0x76, 0xb1, 0x64, 0xc9, 0x2, 0xcf, 0x7, 0x7a, 0x46, 0xf1, 0x6c, 0xb6, 0x2f, 0x57, 0x5c, 0xd7, 0x4e, 0x9d, 0x25, 0xb, 0x3c, 0xef, 0xa9, 0x44, 0xf1, 0xe3, 0x6c, 0xc3, 0xbb, 0xd9, 0xdb, 0x4e, 0x9d, 0x25, 0xb, 0x3c, 0x7f, 0x68, 0xa2, 0x38, 0x1, 0xd5, 0xa0, 0xf3, 0xec, 0xd4, 0x59, 0xb2, 0xc0, 0xf3, 0x87, 0xd6, 0x2b, 0x7e, 0x8f, 0x6d, 0x44, 0xb8, 0x34, 0xb0, 0xd3, 0x67, 0xc9, 0x2, 0xcf, 0x1f, 0xd2, 0xc0, 0x3, 0xe8, 0xe, 0xb7, 0xd3, 0x67, 0x29, 0xac, 0x14, 0xb, 0x59, 0x7f, 0xbf, 0x34, 0xda, 0x0, 0xde, 0x7, 0x2e, 0x5f, 0x1f, 0x7, 0xf4, 0x4d, 0x79, 0xed, 0x76, 0x8a, 0x9b, 0x28, 0xce, 0x13, 0xe7, 0x58, 0x3, 0xb4, 0x51, 0xf1, 0xf, 0x8a, 0xe7, 0x8b, 0x93, 0xc8, 0xbb, 0xde, 0xa7, 0xfb, 0x46, 0xbf, 0xaa, 0x89, 0x93, 0xac, 0xbc, 0xcb, 0xa5, 0x6b, 0xe6, 0x48, 0xfa, 0xc9, 0xcf, 0xb8, 0x46, 0x73, 0xc5, 0x6d, 0xc5, 0x9, 0x72, 0x40, 0xc6, 0x49, 0x9d, 0x84, 0xcf, 0x14, 0x8b, 0x73, 0x1c, 0xb4, 0x48, 0x9c, 0xb4, 0xb3, 0x25, 0x2e, 0xde, 0x83, 0x9b, 0x73, 0xde, 0x8e, 0xf7, 0x1, 0x1f, 0x42, 0xd, 0xce, 0x39, 0xfe, 0xb7, 0x59, 0x9c, 0x44, 0xed, 0x22, 0xc5, 0xf3, 0x14, 0xaf, 0x30, 0xd6, 0xc3, 0x7e, 0x3, 0xbc, 0x95, 0x5c, 0xec, 0xf5, 0x14, 0xb7, 0x76, 0x71, 0xd7, 0xef, 0x48, 0xbb, 0xb1, 0xa7, 0xe2, 0xf6, 0x1c, 0xf8, 0x7d, 0x11, 0xb2, 0xe8, 0x91, 0x41, 0xf1, 0x8a, 0x38, 0x87, 0xfc, 0x9b, 0x3d, 0xbc, 0xef, 0x2b, 0x14, 0xdf, 0x27, 0xce, 0xd1, 0xca, 0x99, 0xfc, 0xed, 0x64, 0xa9, 0x85, 0xe2, 0x13, 0x15, 0x1f, 0xa3, 0xb8, 0x15, 0xb5, 0x85, 0xfa, 0x4, 0xc1, 0xf9, 0xe2, 0x38, 0xae, 0x52, 0x5, 0xdb, 0x9, 0x8a, 0x2f, 0x54, 0xdc, 0x5d, 0x9c, 0x60, 0xf6, 0x6a, 0x49, 0x7e, 0xb7, 0x84, 0xc0, 0xfb, 0x94, 0x36, 0xfb, 0x54, 0x71, 0xf2, 0x40, 0x83, 0xa0, 0xc3, 0x14, 0x5f, 0xa4, 0xf8, 0x74, 0xc5, 0x47, 0x24, 0x39, 0xe7, 0x5b, 0x8, 0xbe, 0x77, 0x14, 0xa3, 0x72, 0xc3, 0x37, 0xfb, 0xb, 0xf0, 0x70, 0xe3, 0x1b, 0x8, 0xbc, 0xfa, 0x69, 0x5e, 0xb, 0x3, 0x8d, 0xe4, 0xdb, 0xdf, 0x8a, 0x13, 0x84, 0x9d, 0x18, 0x8e, 0xb6, 0x9b, 0xd2, 0x7a, 0x13, 0x77, 0x6, 0xec, 0x7c, 0xb5, 0xf9, 0xaa, 0xd5, 0xdd, 0xde, 0x64, 0x2c, 0xa6, 0x87, 0x14, 0x8f, 0x93, 0x78, 0x6a, 0x93, 0x9b, 0xd4, 0x8a, 0xf7, 0x8b, 0x9c, 0xc5, 0x9a, 0x49, 0x0, 0xf, 0xf3, 0x8a, 0x3c, 0xc7, 0x41, 0x8a, 0xbb, 0xf1, 0x7b, 0x89, 0x54, 0x93, 0x80, 0x29, 0x49, 0x41, 0x40, 0x61, 0xbc, 0x6e, 0x56, 0x7c, 0xf4, 0x1e, 0xfe, 0x5f, 0xc6, 0xb1, 0xda, 0xc6, 0x6b, 0x66, 0xf1, 0x77, 0x6b, 0x19, 0xc0, 0xac, 0x42, 0xa0, 0x82, 0x2f, 0xe7, 0xb8, 0x3d, 0x25, 0x4e, 0x38, 0xa0, 0x5f, 0xda, 0x43, 0x77, 0xde, 0xc3, 0xa9, 0xec, 0x8f, 0x49, 0x15, 0x9c, 0x73, 0x8, 0xd1, 0x52, 0xc5, 0xb9, 0x8a, 0xf, 0xe4, 0x3d, 0xe4, 0xb0, 0x7d, 0x1c, 0xf9, 0x36, 0x9a, 0x3e, 0xf, 0x13, 0x88, 0x91, 0x6, 0xde, 0xe, 0x4e, 0xac, 0x96, 0xbc, 0x95, 0x5, 0xdc, 0x60, 0x71, 0x12, 0x6d, 0x5b, 0x24, 0x0, 0xed, 0x3b, 0xc5, 0x1f, 0x2a, 0xfe, 0x84, 0xd2, 0x6c, 0xd, 0x25, 0x72, 0x39, 0x17, 0x4f, 0x4d, 0xaa, 0x56, 0x5d, 0xc4, 0x49, 0xde, 0xfd, 0x5, 0xff, 0x8e, 0xeb, 0x3c, 0xca, 0x9d, 0x69, 0x60, 0x82, 0x4a, 0xec, 0x6, 0x95, 0x1b, 0xb, 0x63, 0x5f, 0x6a, 0xe, 0x42, 0xeb, 0xee, 0x92, 0x3d, 0xe7, 0x32, 0x6e, 0xa5, 0xd6, 0xa0, 0xf3, 0x21, 0x93, 0x15, 0x12, 0x87, 0x2a, 0x1e, 0x2b, 0x4e, 0xe6, 0x88, 0x79, 0xad, 0x4f, 0xa9, 0xee, 0xcf, 0xe6, 0x6e, 0xac, 0x81, 0x57, 0x4a, 0xe0, 0xe5, 0x71, 0xb1, 0xe6, 0x73, 0x87, 0x41, 0xa2, 0xf3, 0x49, 0x6c, 0xc7, 0x38, 0x6e, 0xe8, 0x2b, 0x42, 0x1, 0x6f, 0x55, 0xfc, 0x9c, 0x87, 0x6b, 0x7, 0xf7, 0x70, 0xbf, 0xfc, 0xff, 0x51, 0xd4, 0x7c, 0x2, 0x8, 0x73, 0xfe, 0xad, 0x31, 0xe7, 0xa5, 0xec, 0x63, 0xd, 0xa, 0x7a, 0x7c, 0xbf, 0xab, 0x38, 0x69, 0x6a, 0x1d, 0xf8, 0xbf, 0xd3, 0xc8, 0x28, 0x59, 0x82, 0xf0, 0xc6, 0x39, 0x51, 0x5, 0x5e, 0x2e, 0x59, 0x24, 0xf5, 0x80, 0x69, 0x48, 0xec, 0x3e, 0xe2, 0x94, 0x96, 0x30, 0xd5, 0xd4, 0xd5, 0x8a, 0x5f, 0xe6, 0xa4, 0x7f, 0x29, 0x7b, 0xaf, 0xf9, 0xb2, 0x83, 0xb, 0x16, 0xb, 0xec, 0x23, 0xee, 0x70, 0x87, 0x28, 0xbe, 0x8a, 0xbb, 0xe6, 0x81, 0x5c, 0xec, 0xd3, 0x8, 0xbe, 0x17, 0x7d, 0x1e, 0x9b, 0x7c, 0x4a, 0xdf, 0xbe, 0x9, 0x7f, 0x2f, 0xa2, 0x2a, 0x3c, 0x85, 0x6a, 0xd2, 0xaa, 0x14, 0xd5, 0xcb, 0xd3, 0x39, 0x36, 0xf5, 0xf8, 0x7e, 0xa9, 0xe2, 0x31, 0x8a, 0x5f, 0x52, 0xbc, 0x6c, 0x1f, 0xdf, 0xdd, 0x2e, 0x4e, 0x15, 0x1, 0xd8, 0xc5, 0xa8, 0x70, 0x30, 0x9e, 0x2, 0xf3, 0x8, 0xf6, 0x73, 0x0, 0xfb, 0xd, 0x5b, 0xfa, 0x59, 0xaa, 0xb0, 0x43, 0xb8, 0xe8, 0xdd, 0xa4, 0x6b, 0x14, 0x8f, 0xe4, 0x1c, 0x9, 0x6d, 0xcc, 0x7f, 0x29, 0x7e, 0x42, 0x9c, 0x62, 0x5b, 0x25, 0xfb, 0xd0, 0xb2, 0x56, 0x52, 0x50, 0xfd, 0x93, 0xeb, 0xa8, 0x13, 0x85, 0x6c, 0x7f, 0xee, 0x86, 0x3d, 0xb9, 0x93, 0xde, 0x45, 0x93, 0xa0, 0x3c, 0x99, 0xc5, 0x18, 0x26, 0xca, 0xe3, 0xae, 0x23, 0x29, 0xda, 0x6, 0x47, 0x71, 0xe1, 0x3d, 0x67, 0x80, 0xe, 0x8b, 0x61, 0x28, 0xa5, 0x2f, 0xe2, 0x41, 0x3f, 0x97, 0xd4, 0xb, 0x2d, 0xc1, 0x4e, 0xba, 0x91, 0x92, 0x7c, 0xaa, 0xd1, 0x47, 0x2c, 0xa2, 0x5f, 0xf9, 0x38, 0x2e, 0x28, 0xa1, 0x31, 0x3d, 0x1, 0x74, 0xef, 0x2b, 0x3e, 0x47, 0xf1, 0x91, 0xec, 0xe3, 0x3b, 0x4, 0x4d, 0x2a, 0xa0, 0xc3, 0xae, 0xfe, 0xba, 0x1, 0xba, 0xd1, 0x1c, 0xcb, 0x7, 0x92, 0x0, 0xdd, 0xcf, 0xed, 0xde, 0x73, 0xb8, 0x43, 0x1c, 0xce, 0x5d, 0x48, 0xef, 0xbc, 0x57, 0x11, 0x9c, 0x6e, 0xd1, 0x1, 0xbc, 0xde, 0x18, 0x3, 0x74, 0x93, 0x38, 0x5e, 0x97, 0x70, 0xa7, 0x4b, 0xd5, 0xc6, 0x85, 0x66, 0x34, 0x8b, 0x1a, 0x13, 0xc6, 0xe2, 0x6f, 0xbc, 0xa7, 0xaa, 0x8a, 0xef, 0x21, 0xa0, 0xeb, 0x45, 0xd, 0x78, 0xb5, 0xc, 0xdb, 0x6e, 0x65, 0x92, 0xdf, 0x19, 0x46, 0x69, 0x5b, 0x60, 0x78, 0x26, 0x87, 0x53, 0x5d, 0x18, 0xcd, 0x5d, 0x2c, 0x5d, 0xfa, 0x9e, 0x52, 0xef, 0x21, 0x43, 0xd, 0x1e, 0xc7, 0x85, 0xeb, 0x35, 0x9d, 0x45, 0xd0, 0xb7, 0xe2, 0xfb, 0xc5, 0x74, 0x1a, 0x14, 0x70, 0xa7, 0xab, 0xac, 0x7, 0xb1, 0xa5, 0x38, 0xa1, 0x7a, 0x7, 0x70, 0x61, 0x5d, 0x41, 0x41, 0xb5, 0xc9, 0xc5, 0xbe, 0xaf, 0x23, 0x0, 0x7b, 0x48, 0xbc, 0xc4, 0x63, 0x3f, 0x89, 0xe7, 0x62, 0xa6, 0x43, 0x75, 0x79, 0xff, 0x3, 0xf8, 0xbe, 0x98, 0xf7, 0x80, 0xf1, 0x9a, 0xeb, 0x52, 0xff, 0x97, 0x52, 0xdb, 0x39, 0x8d, 0x42, 0x58, 0xcf, 0x7, 0x2a, 0x27, 0x34, 0x8b, 0x12, 0xf0, 0xe, 0x31, 0xc, 0xf5, 0xc2, 0x24, 0xbf, 0x53, 0xc0, 0xc5, 0x23, 0x54, 0x8f, 0x3a, 0x50, 0xed, 0xd8, 0xe2, 0x72, 0xdf, 0x20, 0x9, 0x6f, 0x12, 0x27, 0x8f, 0x50, 0x3b, 0x12, 0x9e, 0x10, 0x6f, 0xb3, 0x29, 0xe0, 0xe1, 0x7c, 0xcd, 0x90, 0xe6, 0x13, 0xe8, 0xbd, 0x7c, 0xd5, 0x85, 0x6b, 0x63, 0x8c, 0x1a, 0x1b, 0x3b, 0xd1, 0x33, 0x1e, 0xde, 0xc7, 0xc7, 0x54, 0x69, 0x7f, 0xe4, 0xfb, 0x6b, 0xd3, 0x1c, 0xb7, 0xea, 0x1c, 0x17, 0x5d, 0xbc, 0xeb, 0x3b, 0xda, 0xe3, 0x5e, 0xdd, 0x3, 0x76, 0xce, 0xe3, 0xd, 0x27, 0x4b, 0x7, 0xee, 0xac, 0xcd, 0xa2, 0x2, 0xbc, 0x2e, 0x86, 0x93, 0x21, 0x59, 0xe0, 0x5d, 0x47, 0xd5, 0xa0, 0x2f, 0x6d, 0xbc, 0x65, 0x1e, 0xf7, 0x11, 0xd2, 0xfa, 0x79, 0xb6, 0xf, 0xa6, 0xde, 0xef, 0x5, 0x75, 0xa5, 0x1d, 0x59, 0x95, 0xef, 0x1, 0xf8, 0x4b, 0x5d, 0xda, 0xc1, 0xbb, 0xf2, 0x5a, 0xa0, 0x17, 0xb8, 0x7b, 0x7b, 0x4d, 0xdf, 0xd2, 0x16, 0x9b, 0xc4, 0xdf, 0x5e, 0x53, 0xc9, 0xeb, 0xc0, 0xf6, 0xff, 0x3b, 0x6d, 0x2e, 0xe1, 0xdc, 0x43, 0xf8, 0x7e, 0xed, 0x71, 0xff, 0xd7, 0xd3, 0x71, 0xf3, 0x2c, 0xdf, 0x1f, 0x41, 0xb5, 0xb3, 0x6e, 0x14, 0x80, 0x57, 0x60, 0xa8, 0x53, 0xf3, 0x93, 0xfc, 0x4e, 0x11, 0x8d, 0x76, 0x3f, 0x9d, 0x1d, 0x37, 0xb0, 0x8f, 0x42, 0xf5, 0xe6, 0x28, 0x17, 0xaf, 0xd, 0x9b, 0xa4, 0xe, 0x17, 0x97, 0xb6, 0x77, 0x87, 0xbb, 0xa4, 0x9e, 0x69, 0xea, 0x6f, 0x38, 0x21, 0xee, 0xf5, 0x71, 0xdc, 0x26, 0x52, 0x55, 0x7b, 0x2f, 0x8d, 0x6b, 0xdc, 0xa1, 0xf8, 0x2, 0xb6, 0xe1, 0x10, 0xe9, 0x25, 0xf1, 0x7c, 0x4e, 0xaf, 0x9, 0x73, 0xf3, 0x6b, 0xee, 0xb6, 0x42, 0x27, 0xcc, 0x38, 0xd9, 0x83, 0x23, 0x30, 0x4c, 0xc0, 0x6b, 0xc5, 0xed, 0x5c, 0xab, 0x26, 0xdb, 0x53, 0x1c, 0x10, 0x3f, 0x69, 0x4d, 0x82, 0xca, 0x39, 0xd8, 0x45, 0x75, 0x16, 0x93, 0x88, 0xa3, 0x8b, 0x36, 0xfc, 0xdb, 0xa3, 0x54, 0xb, 0xdd, 0xa2, 0xaa, 0x86, 0x8a, 0xf6, 0xae, 0xf, 0x3b, 0x85, 0x9b, 0x84, 0x7e, 0xff, 0x91, 0xed, 0xb5, 0xdc, 0x39, 0x57, 0xf9, 0xdc, 0x87, 0x32, 0xa, 0xdb, 0xcf, 0xf9, 0xfe, 0x7c, 0x9a, 0x20, 0xa1, 0x5, 0xde, 0x25, 0x86, 0x2d, 0xf3, 0x6a, 0x8, 0xfa, 0xfb, 0x3c, 0xd5, 0x27, 0x10, 0xa2, 0x62, 0xdc, 0x8, 0xea, 0xde, 0x4e, 0x67, 0x41, 0x7f, 0x3, 0x18, 0x37, 0xb9, 0xdc, 0xef, 0x36, 0x74, 0xac, 0x80, 0xa6, 0x84, 0x68, 0x7d, 0xc0, 0xae, 0x7b, 0xd0, 0xd8, 0x5d, 0xae, 0x37, 0xc6, 0xdf, 0x6f, 0xda, 0x42, 0xa7, 0x4b, 0x31, 0xdf, 0x23, 0x91, 0xfb, 0xc8, 0x30, 0x2, 0xaf, 0x16, 0x6f, 0x44, 0x1b, 0xca, 0x53, 0x43, 0xd0, 0x67, 0xa8, 0x69, 0xfa, 0x40, 0xb8, 0x11, 0x8d, 0xfb, 0x74, 0xa9, 0xb6, 0x1, 0xb4, 0x62, 0xda, 0xaf, 0x6e, 0x9f, 0x79, 0x35, 0x93, 0x78, 0x44, 0x47, 0x61, 0x88, 0x80, 0x77, 0x3d, 0x9d, 0x1a, 0x42, 0x35, 0xfc, 0xa5, 0x80, 0xfb, 0x33, 0x57, 0xe2, 0x95, 0x13, 0xaa, 0x1b, 0x1a, 0x50, 0xa8, 0x80, 0x37, 0x88, 0x8e, 0xa, 0xa1, 0xce, 0xbc, 0x3d, 0x24, 0xfd, 0x7e, 0xc3, 0x0, 0x86, 0x1b, 0xe5, 0xf1, 0xab, 0x18, 0x76, 0xdd, 0x83, 0x14, 0x42, 0x6e, 0x53, 0xbe, 0xa1, 0xd6, 0xae, 0x9, 0xc9, 0x38, 0xe7, 0xd3, 0x31, 0x3, 0xc2, 0x11, 0xc5, 0x9d, 0x19, 0xd2, 0x2f, 0xd4, 0x87, 0x9d, 0x9e, 0x95, 0x95, 0x25, 0x25, 0xa5, 0x25, 0xbd, 0x67, 0xcd, 0x9d, 0xd7, 0x23, 0x4c, 0xc0, 0x83, 0xea, 0x73, 0x2b, 0xdb, 0x70, 0xa8, 0x3c, 0x1d, 0x22, 0x29, 0x5c, 0x28, 0xf1, 0x40, 0x5a, 0x37, 0xcb, 0xd1, 0xc3, 0x61, 0x34, 0xc6, 0xa3, 0x3e, 0xe7, 0x26, 0xd8, 0x94, 0x61, 0x20, 0xa8, 0xdf, 0x4d, 0xd8, 0x7e, 0x52, 0x9c, 0xe0, 0x88, 0x4c, 0x20, 0x8, 0xdd, 0x3f, 0xa1, 0x11, 0x8b, 0xc5, 0x64, 0xf2, 0x87, 0x9f, 0xdc, 0xb0, 0x79, 0xeb, 0xb6, 0x50, 0x0, 0x2f, 0xc6, 0x5, 0xa6, 0x5d, 0xb2, 0x77, 0x88, 0xbb, 0x7, 0xb8, 0x5e, 0x53, 0xb9, 0x1, 0x3c, 0x44, 0xcc, 0xd4, 0x71, 0xe9, 0xba, 0xe3, 0x3c, 0x1c, 0x87, 0x5d, 0x86, 0x50, 0xae, 0x1f, 0x82, 0x31, 0xc6, 0x19, 0xad, 0x8e, 0x12, 0x82, 0x4b, 0x7f, 0x6c, 0x86, 0xf5, 0xef, 0x6d, 0xc5, 0x1f, 0xc7, 0x72, 0x72, 0x64, 0xed, 0xfa, 0x8d, 0xa7, 0x7d, 0x53, 0x58, 0x74, 0x6c, 0x18, 0x80, 0x37, 0x4a, 0x9c, 0xa8, 0x0, 0xd0, 0xb, 0x19, 0xa0, 0xb7, 0x57, 0x86, 0xb4, 0x81, 0xf, 0xc7, 0x90, 0x1b, 0xcf, 0x21, 0x5c, 0xc7, 0xb1, 0xf0, 0x8a, 0x4c, 0x2f, 0x60, 0xdb, 0x10, 0x8c, 0x2f, 0x82, 0xae, 0x75, 0x52, 0x34, 0xdc, 0xf8, 0xcb, 0x32, 0xac, 0x7f, 0x38, 0x73, 0x46, 0x58, 0x99, 0x28, 0x95, 0x33, 0x7b, 0xea, 0xb4, 0xe9, 0x7d, 0x32, 0x1d, 0x78, 0xa3, 0x24, 0x5e, 0xca, 0xf, 0xbb, 0xc6, 0x10, 0x9, 0x27, 0xad, 0xe0, 0x2b, 0xdc, 0xf4, 0xf5, 0x5c, 0xb8, 0xde, 0x5b, 0xc6, 0x35, 0xbd, 0x20, 0x84, 0xbf, 0xe9, 0x38, 0xd8, 0x30, 0x14, 0x95, 0x3a, 0xc7, 0x68, 0x4f, 0xc8, 0xd0, 0x3e, 0x22, 0x28, 0x60, 0x75, 0x95, 0xdc, 0x5c, 0x59, 0xb8, 0x64, 0xf9, 0x99, 0xab, 0xd6, 0xac, 0xab, 0x96, 0x89, 0xc0, 0x83, 0xf3, 0x0, 0xae, 0xf8, 0xdf, 0xf1, 0x3d, 0x62, 0x32, 0x2f, 0x95, 0xf0, 0x3e, 0x2b, 0xaf, 0x38, 0xc1, 0x39, 0x92, 0x2e, 0xbd, 0xee, 0x71, 0x7f, 0x91, 0x23, 0x37, 0x83, 0x6d, 0x38, 0x3, 0x2e, 0xc8, 0xe0, 0xb1, 0xc5, 0xfa, 0x3d, 0x99, 0x6d, 0xc4, 0x4a, 0x7e, 0x96, 0xa1, 0xfd, 0xc4, 0x99, 0xe2, 0xfb, 0xd9, 0xd9, 0x59, 0xb2, 0x7d, 0xc7, 0xce, 0x43, 0x7f, 0x58, 0xbe, 0xa2, 0x63, 0xa6, 0x1, 0xf, 0x51, 0xb, 0x38, 0x78, 0xec, 0x6b, 0x2c, 0x82, 0xb3, 0x24, 0xb8, 0xf3, 0x18, 0xb7, 0x54, 0xd, 0x31, 0xd4, 0xcd, 0x74, 0x68, 0x87, 0xa4, 0x91, 0xf5, 0x9c, 0x2, 0x99, 0x8e, 0x1b, 0xa8, 0x49, 0xa7, 0x66, 0xe8, 0xd8, 0x1e, 0x4a, 0x6, 0x21, 0x9f, 0x2e, 0x93, 0xbd, 0xdd, 0x3f, 0x1d, 0x81, 0xed, 0x2e, 0x2f, 0x97, 0xa2, 0x45, 0x4b, 0x4e, 0x34, 0x81, 0x17, 0x94, 0x7, 0xb, 0x6, 0x3c, 0xe, 0xc7, 0x91, 0xc6, 0xf2, 0xa6, 0x61, 0x57, 0x20, 0xaf, 0xd, 0x67, 0x5f, 0xb3, 0x25, 0xdc, 0x94, 0xe5, 0x32, 0x88, 0xfd, 0x98, 0xa7, 0x89, 0xda, 0x2e, 0x11, 0xe7, 0xec, 0x10, 0xf3, 0x32, 0x52, 0x32, 0xcf, 0xd9, 0xd2, 0x56, 0xe2, 0x1, 0xf0, 0x9f, 0x64, 0xf8, 0x3a, 0xc0, 0x6e, 0x5c, 0x1e, 0xcb, 0x8d, 0xc9, 0xf7, 0xb, 0x17, 0x77, 0x36, 0x13, 0x61, 0x71, 0x70, 0x8a, 0x4c, 0xe0, 0x1c, 0xf1, 0xfe, 0x39, 0xe8, 0x31, 0xfe, 0x1e, 0xe, 0x3c, 0x3b, 0x25, 0x4c, 0x28, 0xec, 0x8b, 0xfb, 0xc9, 0x41, 0x14, 0xc5, 0xc1, 0xfd, 0xd7, 0xa2, 0xca, 0x8b, 0x7e, 0x9a, 0x45, 0x86, 0xf0, 0xa, 0x7f, 0x30, 0x22, 0x13, 0x76, 0x46, 0x0, 0xc8, 0x3f, 0x47, 0xd7, 0xf1, 0xde, 0xfb, 0xd1, 0x3e, 0xc5, 0x91, 0xe, 0x12, 0x7c, 0x91, 0x34, 0x8c, 0xb8, 0xd7, 0x2f, 0x24, 0xf8, 0xa2, 0x45, 0x87, 0x19, 0xed, 0x4c, 0xf, 0x6d, 0x5b, 0xac, 0x78, 0x69, 0x4e, 0x76, 0xf6, 0xc1, 0xc5, 0x9b, 0xb7, 0xb4, 0x8f, 0x25, 0x48, 0x8f, 0x20, 0x5d, 0xb1, 0xc8, 0x93, 0x7b, 0x89, 0x4e, 0x95, 0x5, 0x3e, 0xfe, 0x2e, 0x4a, 0x39, 0x20, 0x6, 0x14, 0xe9, 0x34, 0x8, 0xeb, 0x69, 0x41, 0x29, 0xaf, 0x81, 0x57, 0x95, 0xbb, 0x4c, 0x49, 0x2, 0xf0, 0x60, 0xbb, 0x21, 0x87, 0xc, 0x67, 0x46, 0x85, 0x64, 0x9c, 0xaf, 0xad, 0x12, 0x17, 0xaa, 0x50, 0x65, 0x0, 0x41, 0xb0, 0xf4, 0xa7, 0x26, 0x82, 0xb3, 0xa8, 0x46, 0x14, 0x90, 0x57, 0x93, 0x8b, 0xf8, 0xbf, 0xa9, 0x4, 0xe1, 0xd2, 0x0, 0xb4, 0xa6, 0xa6, 0x7c, 0x45, 0x8d, 0x94, 0x65, 0x19, 0x3e, 0x9e, 0x58, 0x37, 0x4b, 0xb3, 0x15, 0xf0, 0x36, 0x14, 0x6f, 0x6a, 0x10, 0x54, 0xe9, 0x87, 0x32, 0xe, 0x16, 0xca, 0x2e, 0x7c, 0x25, 0x4e, 0x1e, 0xd3, 0x64, 0xbe, 0xf7, 0x83, 0xb0, 0x88, 0x2e, 0xa4, 0xe3, 0x0, 0xe7, 0x2a, 0x79, 0x49, 0xec, 0x82, 0x3a, 0xf, 0x10, 0x35, 0x38, 0xf4, 0xb1, 0x40, 0xe7, 0x84, 0xcf, 0x6d, 0xe2, 0x82, 0x9c, 0xce, 0x45, 0xf9, 0x1f, 0x9, 0xcf, 0x21, 0xf4, 0xde, 0xe8, 0x29, 0xaa, 0x9e, 0x38, 0x2b, 0x1b, 0x40, 0xe1, 0x84, 0x5d, 0x57, 0x17, 0x2d, 0x1a, 0x44, 0xdb, 0xea, 0x3b, 0xaa, 0x53, 0xa8, 0xc3, 0x32, 0x93, 0x2, 0xa9, 0xd4, 0xe3, 0xbe, 0x69, 0x2f, 0xb1, 0xae, 0x3e, 0x97, 0xe9, 0x84, 0x0, 0x90, 0x93, 0x15, 0xf8, 0x6a, 0x99, 0xc0, 0x83, 0x53, 0xe3, 0xa, 0x4a, 0x79, 0x2f, 0xd5, 0x99, 0x2c, 0x4a, 0x53, 0xec, 0x18, 0xeb, 0x24, 0xf5, 0x72, 0xb, 0xe9, 0x4a, 0xc8, 0x61, 0x94, 0xe4, 0x7b, 0xaa, 0xff, 0x8, 0x75, 0x60, 0x11, 0xa5, 0xe7, 0x7a, 0xee, 0xc2, 0x15, 0x46, 0xbf, 0xb5, 0xa, 0xa, 0xc9, 0x7f, 0x10, 0xd5, 0xe5, 0x46, 0x5c, 0x0, 0xfa, 0xff, 0x9d, 0xc9, 0x50, 0xd5, 0x10, 0x72, 0xf5, 0x63, 0x4, 0x76, 0x3f, 0x8c, 0x5, 0xea, 0xb9, 0x3c, 0x46, 0xcd, 0x0, 0xa9, 0x36, 0x3d, 0x8, 0xc2, 0x3c, 0xf2, 0x31, 0xe4, 0x6b, 0xa8, 0x1d, 0x2c, 0x22, 0x0, 0x3f, 0xa2, 0x20, 0x2a, 0xf2, 0x40, 0x35, 0xad, 0xcd, 0x57, 0x8c, 0xfb, 0xef, 0x25, 0x9e, 0xbd, 0x91, 0xa9, 0x1a, 0x84, 0x3e, 0x6f, 0xcc, 0x33, 0x81, 0xa7, 0x6b, 0x6, 0x46, 0x91, 0x30, 0x19, 0x57, 0x51, 0x65, 0x32, 0x1, 0x57, 0x48, 0xc7, 0xc1, 0x14, 0xda, 0x8, 0xab, 0x53, 0xdc, 0xa1, 0x72, 0x8, 0xba, 0xe6, 0x5c, 0x84, 0xd8, 0x3d, 0x91, 0xfb, 0x87, 0xe2, 0xa8, 0x38, 0x3a, 0xc8, 0x97, 0x68, 0x3d, 0xcf, 0xf, 0x42, 0x72, 0x6, 0x79, 0x4, 0x5, 0xf, 0x92, 0x66, 0x4f, 0xa4, 0xba, 0xde, 0x8e, 0x1a, 0x41, 0x15, 0xb6, 0xdb, 0x51, 0xc8, 0xe1, 0x7b, 0xb, 0xe9, 0x0, 0x41, 0x24, 0x7, 0x2a, 0xb9, 0xad, 0x75, 0xb1, 0x5f, 0x10, 0x7e, 0xb7, 0x67, 0xfa, 0xe0, 0x55, 0x54, 0xc4, 0x2d, 0x90, 0x58, 0x0, 0x46, 0xbb, 0xdf, 0x4, 0xa9, 0x88, 0xf8, 0x4e, 0xf3, 0x41, 0x27, 0x38, 0xd0, 0x1c, 0x4d, 0x75, 0x30, 0x1d, 0x75, 0xa8, 0x9c, 0xbb, 0xda, 0x1a, 0x4a, 0x77, 0x5d, 0x45, 0xb, 0x2a, 0x18, 0x5c, 0xf0, 0xe7, 0x8a, 0x13, 0x59, 0x51, 0x35, 0x82, 0xe3, 0xa, 0x1, 0xb5, 0x84, 0xc, 0xdb, 0x1c, 0x1e, 0x72, 0xc4, 0x4b, 0x76, 0x24, 0x18, 0x1, 0xc4, 0xa3, 0x28, 0x98, 0x62, 0xf4, 0x21, 0x80, 0x91, 0x28, 0xba, 0x81, 0x63, 0xff, 0x22, 0x81, 0xb8, 0x3d, 0x8d, 0xf1, 0x17, 0xc3, 0xf9, 0x95, 0x15, 0x2, 0xe0, 0xa1, 0x8f, 0xa5, 0x31, 0x89, 0x36, 0x21, 0x7, 0xe, 0x19, 0x2, 0xc7, 0xf1, 0x3d, 0xd4, 0x9d, 0x21, 0x9c, 0x6c, 0xaf, 0xa8, 0xdc, 0x70, 0xb6, 0x8c, 0xa1, 0x5d, 0x34, 0x5e, 0xa2, 0x4f, 0xbb, 0xa9, 0xa2, 0x2f, 0x93, 0xf8, 0xe3, 0xb3, 0xeb, 0x13, 0x88, 0xa8, 0xc7, 0xd9, 0x9d, 0x6d, 0xa8, 0xa5, 0x75, 0x69, 0x5f, 0x5f, 0x40, 0x95, 0x14, 0x51, 0xfc, 0x4f, 0x48, 0xea, 0x75, 0x70, 0x36, 0xf2, 0x15, 0x26, 0x2, 0xa, 0xf8, 0xee, 0x90, 0xca, 0xd7, 0x5b, 0xf5, 0x7c, 0xa7, 0x1b, 0x3a, 0xf0, 0x32, 0x69, 0xd6, 0xb8, 0x51, 0x56, 0x69, 0x59, 0x59, 0xa4, 0x81, 0x57, 0x95, 0x12, 0x55, 0x83, 0xe, 0x35, 0x11, 0x7f, 0x23, 0xff, 0x1b, 0x49, 0xe2, 0x7, 0xad, 0x95, 0xfd, 0x97, 0x60, 0xc3, 0x4f, 0x95, 0x78, 0xfe, 0x24, 0x52, 0xbb, 0x7a, 0x12, 0x70, 0xdd, 0x38, 0x47, 0xa8, 0x2c, 0x80, 0x72, 0x81, 0x57, 0x52, 0x28, 0x4e, 0xaa, 0xc4, 0xd8, 0xd6, 0xe2, 0x2e, 0xba, 0x3a, 0x53, 0x7, 0x2, 0xd8, 0x6b, 0x94, 0x5f, 0x5f, 0xe, 0x6a, 0xe8, 0xe4, 0x43, 0x67, 0x47, 0x78, 0xd2, 0x61, 0x83, 0xfc, 0x92, 0x6d, 0xa8, 0x42, 0x17, 0x5, 0x0, 0xba, 0x28, 0xab, 0xf0, 0x95, 0x21, 0x78, 0x3a, 0xc7, 0xd2, 0x31, 0x83, 0x33, 0xdc, 0x51, 0xc6, 0x9c, 0xa0, 0x82, 0x1c, 0xe2, 0x50, 0xff, 0x90, 0xe2, 0xf5, 0xf4, 0xce, 0xda, 0x38, 0x4c, 0x3, 0x11, 0x55, 0xe0, 0xc1, 0xb6, 0x18, 0xca, 0x36, 0xce, 0x98, 0x6, 0x4a, 0xf8, 0xdd, 0xfa, 0x51, 0x23, 0xb8, 0xd6, 0x6f, 0xe4, 0x5c, 0x99, 0xa5, 0xdb, 0x91, 0xa9, 0x3d, 0x2c, 0xc9, 0x6b, 0x98, 0x89, 0xc0, 0x9d, 0x2c, 0xf0, 0x82, 0x27, 0xd4, 0x65, 0xc4, 0xb9, 0x5b, 0x5, 0x27, 0x71, 0x9b, 0x5d, 0xe7, 0x19, 0x4b, 0xb0, 0x9, 0x2f, 0x93, 0x78, 0x26, 0x8a, 0x6, 0xdf, 0xb1, 0x49, 0x7c, 0xb7, 0xd0, 0xd8, 0x31, 0x4f, 0xb2, 0xc0, 0xb, 0x96, 0x60, 0xb8, 0x9f, 0xc5, 0x36, 0xe, 0xe5, 0x3f, 0xb0, 0x6b, 0x3b, 0x14, 0x4, 0x47, 0x94, 0xae, 0x34, 0x80, 0xe3, 0x88, 0x5b, 0x92, 0x4, 0xed, 0x3c, 0x3, 0x78, 0x79, 0x16, 0x78, 0xc1, 0xaa, 0x99, 0x5a, 0xdf, 0x9f, 0x68, 0xd7, 0x73, 0xa8, 0x8, 0x25, 0xf0, 0x75, 0x59, 0x3c, 0xd8, 0x81, 0x2d, 0x93, 0xf8, 0xce, 0xbb, 0x7c, 0xc5, 0x11, 0x4e, 0x57, 0xb, 0xbc, 0xe0, 0xc8, 0xcc, 0x9a, 0x9e, 0x69, 0xd7, 0x72, 0xa8, 0x8, 0x7, 0xed, 0xcf, 0xb0, 0x8d, 0x14, 0xaa, 0x2e, 0x49, 0x7c, 0xe7, 0xd, 0x89, 0x47, 0x17, 0xf5, 0xb1, 0xc0, 0xb, 0x8e, 0x74, 0x1c, 0x25, 0xb2, 0x1c, 0x36, 0xda, 0xb5, 0x1c, 0x3a, 0x9a, 0x61, 0x0, 0xa9, 0x55, 0x12, 0x9f, 0x87, 0xf3, 0x4c, 0xa7, 0x4, 0x21, 0x48, 0xa2, 0xb9, 0x5, 0x5e, 0x30, 0x94, 0x69, 0xee, 0xfb, 0xa, 0x8b, 0xa5, 0x94, 0x68, 0xa5, 0x21, 0x30, 0x93, 0xb5, 0xd9, 0xc6, 0x1b, 0xf6, 0xfd, 0x95, 0x16, 0x78, 0xc1, 0x90, 0x2e, 0x11, 0x51, 0x4d, 0xd2, 0xcf, 0xf8, 0x76, 0x83, 0x1a, 0x5b, 0x2c, 0xa5, 0x44, 0x8, 0xe1, 0x2b, 0x4f, 0xf1, 0x3b, 0xc8, 0x11, 0xd4, 0x4e, 0x16, 0xc4, 0xe4, 0xb6, 0xb6, 0xc0, 0xf3, 0x9f, 0x16, 0xf3, 0x35, 0x27, 0x49, 0x55, 0xc5, 0x6b, 0xea, 0x65, 0xb1, 0x94, 0x12, 0x21, 0xb6, 0xb6, 0xba, 0x61, 0x2e, 0x24, 0x43, 0xf8, 0xdc, 0x68, 0xb6, 0x11, 0x4, 0x7f, 0x77, 0x86, 0xdc, 0x4b, 0x4d, 0x89, 0x3f, 0xc5, 0xa9, 0x6e, 0xd4, 0x81, 0x87, 0x43, 0xd5, 0x1d, 0x6c, 0x17, 0x4, 0xdc, 0x97, 0x6e, 0x16, 0x78, 0x29, 0x53, 0x2b, 0x43, 0xc5, 0x4c, 0x25, 0x21, 0x7a, 0xbc, 0x61, 0xeb, 0xc1, 0xc9, 0xd2, 0x2f, 0x3, 0xee, 0x5, 0xd1, 0x52, 0x88, 0xc4, 0x41, 0xe8, 0xe2, 0xc5, 0x51, 0x7, 0x1e, 0x82, 0x6e, 0x75, 0x9d, 0x96, 0x33, 0x2, 0x54, 0x37, 0x21, 0xb5, 0x1f, 0x92, 0x68, 0x87, 0xe5, 0x79, 0x41, 0xba, 0xb0, 0x12, 0x84, 0xe7, 0x9c, 0x14, 0x55, 0x54, 0x4, 0x4b, 0xe8, 0x27, 0x43, 0x3d, 0x22, 0xf1, 0xfc, 0xb7, 0xa0, 0x4c, 0xc, 0xfd, 0xe4, 0x22, 0xe4, 0x33, 0x4e, 0x8a, 0x3a, 0xf0, 0x40, 0xfa, 0xf9, 0x64, 0xad, 0x29, 0x75, 0x82, 0x20, 0x80, 0xae, 0x4b, 0xc8, 0xc6, 0xd, 0xc5, 0x83, 0x7, 0x5, 0xf8, 0xfb, 0x8, 0x76, 0xd6, 0xe5, 0x4, 0xbf, 0xa0, 0x10, 0x4d, 0x85, 0x90, 0xfd, 0xae, 0x1f, 0x14, 0x82, 0xf8, 0x4d, 0x14, 0xfe, 0x6d, 0x18, 0xd0, 0xbd, 0xe0, 0xf1, 0x69, 0x2d, 0xd8, 0xc6, 0x73, 0x2e, 0x96, 0xee, 0xf, 0xc0, 0xc3, 0x80, 0xeb, 0x8a, 0xc8, 0xb7, 0xca, 0x5e, 0x9e, 0xca, 0xe9, 0x21, 0x41, 0xaf, 0xd7, 0xde, 0x35, 0x84, 0xab, 0x85, 0x21, 0x4e, 0x14, 0xc5, 0x6b, 0x91, 0x14, 0x8c, 0xf4, 0x9c, 0x9b, 0x2, 0xea, 0xc3, 0x10, 0xc3, 0x2e, 0xaf, 0x6c, 0x2a, 0x15, 0x1e, 0xa4, 0xa9, 0x2b, 0x8e, 0x23, 0x98, 0x62, 0x2, 0x1, 0xed, 0xb7, 0xd0, 0xd5, 0x2, 0x4, 0xcf, 0x72, 0x1c, 0x95, 0xf8, 0x81, 0xa8, 0x2, 0xf, 0xa0, 0x7b, 0x98, 0xed, 0x36, 0x46, 0xdb, 0x6b, 0x42, 0x9a, 0xcb, 0x38, 0x89, 0x47, 0xd8, 0x7f, 0xc5, 0x76, 0x18, 0xc6, 0x19, 0x65, 0xf2, 0xf4, 0x3, 0x4b, 0x90, 0xa6, 0x83, 0x10, 0xae, 0x2a, 0x3e, 0xfe, 0x7e, 0x77, 0x71, 0xca, 0x37, 0x80, 0xbe, 0x94, 0xf4, 0x9e, 0xe0, 0x8b, 0x47, 0xba, 0x7d, 0xc8, 0x36, 0xa, 0xde, 0xa2, 0xc2, 0x80, 0x5f, 0xe7, 0x7b, 0x0, 0xd9, 0xd, 0x6c, 0xa3, 0xec, 0xc7, 0x40, 0xd9, 0xc3, 0x83, 0x51, 0xa3, 0x6c, 0x7f, 0x3c, 0x42, 0x69, 0x3, 0x42, 0xa1, 0x9e, 0xfb, 0x3c, 0xfe, 0x3d, 0x44, 0xc7, 0x4f, 0xe3, 0x40, 0x83, 0xe0, 0xe4, 0x39, 0x53, 0xc2, 0x53, 0x8c, 0x17, 0x3b, 0xc3, 0x0, 0x89, 0x67, 0xe4, 0xa3, 0x76, 0xa, 0xc2, 0xb1, 0xda, 0xfb, 0xf0, 0xdb, 0x28, 0x1d, 0xf1, 0xa, 0xc1, 0x5f, 0x46, 0x5b, 0x2d, 0x9d, 0xfa, 0x2c, 0x5b, 0xb9, 0xe3, 0xe8, 0xf9, 0xef, 0xc2, 0xb9, 0x39, 0xc5, 0xc3, 0x7b, 0x40, 0xa2, 0x1d, 0xaa, 0x7c, 0xeb, 0xa, 0xe8, 0xa8, 0x4a, 0x80, 0xa7, 0xc1, 0xee, 0xf1, 0x91, 0xe1, 0x51, 0x6, 0x1e, 0xa4, 0xc, 0x12, 0x5f, 0xf5, 0x73, 0x6, 0x30, 0x99, 0x8f, 0x8b, 0xfb, 0x65, 0x18, 0x1a, 0x11, 0xe4, 0xd3, 0xd, 0x9b, 0x6e, 0x32, 0x25, 0xf8, 0x4a, 0x89, 0x17, 0x5c, 0xd, 0x3, 0xe1, 0x81, 0x8e, 0x88, 0xfe, 0xd0, 0x7, 0xd8, 0x8, 0x3c, 0xfe, 0x8c, 0xea, 0x7a, 0x35, 0x8f, 0x7e, 0x13, 0xa5, 0x20, 0xde, 0x96, 0x78, 0x6d, 0xd5, 0x9b, 0x25, 0x1e, 0x7f, 0x99, 0xe, 0xc1, 0xa1, 0xd1, 0x8b, 0xea, 0xb3, 0x70, 0xc7, 0x9b, 0xc2, 0xdd, 0xdc, 0x6d, 0xd5, 0xf3, 0x22, 0xda, 0xa4, 0xe7, 0xf2, 0x3d, 0xd6, 0x1c, 0x32, 0xe2, 0x67, 0xec, 0xed, 0xb, 0x51, 0xf7, 0xb8, 0xe1, 0x1, 0x1c, 0x28, 0xe3, 0xa7, 0x33, 0x95, 0x51, 0xf, 0x12, 0x2e, 0xe7, 0x13, 0xd2, 0xbc, 0x2e, 0xa2, 0x63, 0x8e, 0x16, 0xa7, 0xea, 0xd6, 0x3c, 0xda, 0x26, 0x0, 0x34, 0x2a, 0x49, 0xd, 0xe7, 0x84, 0xeb, 0x87, 0x3a, 0x9a, 0x55, 0xd4, 0xaa, 0x84, 0x60, 0xcc, 0xde, 0x22, 0xe0, 0x74, 0xb0, 0x32, 0xce, 0xa2, 0x46, 0x52, 0x6d, 0x86, 0xdd, 0x5a, 0xdb, 0x85, 0xdf, 0xc0, 0xf8, 0xa1, 0x4a, 0x38, 0x32, 0xd3, 0x51, 0x3e, 0xf0, 0x40, 0x43, 0x38, 0x3e, 0xe2, 0xe2, 0xbd, 0x6c, 0x22, 0x18, 0xa0, 0xed, 0x20, 0x82, 0x28, 0x87, 0xf6, 0x2b, 0xee, 0x65, 0xb0, 0xc4, 0x1f, 0xf2, 0x59, 0x19, 0xc2, 0xb5, 0x90, 0x4d, 0x8f, 0xda, 0x31, 0x2f, 0x1b, 0x8e, 0x94, 0xf7, 0xb9, 0xbe, 0x3e, 0xff, 0xb9, 0x2f, 0xef, 0xf, 0xae, 0x6e, 0x48, 0x6c, 0x64, 0xa2, 0xeb, 0x67, 0xe, 0x1c, 0x43, 0xfd, 0x7f, 0x22, 0x55, 0xc1, 0x1a, 0x29, 0xa8, 0x12, 0x50, 0x55, 0xee, 0xa0, 0x24, 0xc3, 0xc0, 0x22, 0xef, 0x4f, 0x57, 0x2d, 0x7b, 0x93, 0x3b, 0xde, 0xc8, 0x4, 0xb0, 0xa1, 0xce, 0x8b, 0x3e, 0x57, 0xbc, 0x91, 0xbf, 0x9f, 0xe9, 0x34, 0x8f, 0xc0, 0x18, 0x21, 0xf1, 0x43, 0x6c, 0x3c, 0xa3, 0x60, 0x2c, 0x55, 0x68, 0xd4, 0x48, 0x41, 0xea, 0x55, 0x43, 0x49, 0x3e, 0x44, 0x2f, 0x8f, 0xea, 0xf8, 0x30, 0x8e, 0xdf, 0x7, 0x12, 0xaf, 0x10, 0xb0, 0x96, 0x2, 0xf2, 0x1, 0xf, 0xee, 0xa5, 0x9c, 0x3b, 0xf6, 0x19, 0x9c, 0xb, 0x50, 0x4b, 0xde, 0xc3, 0xb7, 0xb4, 0xff, 0xbb, 0x25, 0xb9, 0xe, 0xe, 0xe0, 0x3d, 0xc0, 0x16, 0x9d, 0x25, 0x4e, 0x3d, 0xd8, 0xee, 0xfc, 0xdf, 0x66, 0xee, 0xd6, 0x0, 0xe3, 0xd2, 0x7d, 0x5d, 0xc8, 0xeb, 0x1a, 0x9a, 0x99, 0x42, 0x5f, 0x53, 0x8a, 0xff, 0x59, 0x1c, 0x77, 0x39, 0xee, 0xbb, 0x37, 0x79, 0x5, 0x8d, 0xf9, 0x79, 0x34, 0x86, 0x35, 0x68, 0x70, 0xe, 0x87, 0xd2, 0x7c, 0x28, 0x61, 0xd7, 0x9a, 0x93, 0x95, 0xf8, 0xec, 0x80, 0x52, 0xaa, 0x95, 0xf, 0x1a, 0xc6, 0x7c, 0x22, 0x2d, 0x20, 0x28, 0xa1, 0x8e, 0xa0, 0xf2, 0xd6, 0x5d, 0x12, 0xcf, 0x17, 0x4c, 0x65, 0x87, 0xf0, 0x9b, 0x76, 0xb1, 0xaf, 0x78, 0x72, 0x13, 0x72, 0xe3, 0xfa, 0x72, 0x4c, 0x1a, 0x71, 0xb7, 0x18, 0x4c, 0x95, 0x74, 0x21, 0xed, 0x98, 0x65, 0x4, 0xd0, 0x4e, 0xf6, 0x17, 0x42, 0xbd, 0x2e, 0x3f, 0xdf, 0x9a, 0xc0, 0x6d, 0x96, 0x20, 0xec, 0xf1, 0x1b, 0xcf, 0x52, 0x98, 0xad, 0xf0, 0xf8, 0x7e, 0x26, 0x4b, 0xbc, 0xee, 0xe7, 0x50, 0xa, 0x8d, 0xa6, 0x6c, 0x83, 0x97, 0x13, 0x88, 0xf3, 0xd9, 0xd6, 0xc9, 0xd3, 0x50, 0xb1, 0x51, 0x3d, 0xd, 0x4e, 0xba, 0xc3, 0xb8, 0xb3, 0x99, 0x5, 0x95, 0xb6, 0x73, 0x8c, 0xee, 0x11, 0xa7, 0xe2, 0x5a, 0x52, 0x14, 0x33, 0x16, 0x5a, 0x79, 0xc4, 0xc1, 0xb7, 0x89, 0x83, 0x3e, 0x8e, 0x52, 0xf7, 0x1c, 0x2e, 0xa4, 0x26, 0xe4, 0xb3, 0x53, 0x58, 0x90, 0xd8, 0x3d, 0xff, 0x4d, 0x87, 0x40, 0x32, 0xcf, 0x21, 0x47, 0x76, 0x35, 0xca, 0xdc, 0x15, 0x48, 0xe5, 0x82, 0xa6, 0x4b, 0x8c, 0x39, 0x2a, 0xf3, 0x79, 0xdc, 0x16, 0x52, 0x58, 0x41, 0x68, 0xf5, 0xe1, 0xce, 0x84, 0x1a, 0xa2, 0xb9, 0xdc, 0xed, 0x75, 0x1, 0xdf, 0x54, 0x68, 0x1, 0x1d, 0x11, 0x4f, 0xed, 0xcd, 0xf9, 0xe0, 0x11, 0xa1, 0x8a, 0xd9, 0xbd, 0x5c, 0x3, 0xfd, 0xe8, 0x74, 0xeb, 0x48, 0x20, 0x35, 0x25, 0xf7, 0x4c, 0xe2, 0x3a, 0x15, 0x14, 0xd4, 0x13, 0x28, 0x38, 0x16, 0xa7, 0xda, 0x91, 0x18, 0x75, 0xe0, 0x6, 0xc9, 0x6c, 0x8f, 0x11, 0xa1, 0xaf, 0x28, 0xbd, 0x5b, 0x52, 0xfd, 0x0, 0x18, 0xe, 0xe7, 0xee, 0x56, 0x9d, 0xea, 0x44, 0x29, 0x25, 0xf7, 0x36, 0x2, 0x56, 0x67, 0x3a, 0xcf, 0xa4, 0x9a, 0x84, 0x85, 0x93, 0xca, 0xd9, 0xdc, 0x6a, 0xaa, 0xb5, 0x9d, 0xa5, 0x72, 0xa9, 0x4a, 0x4f, 0xd2, 0x78, 0xdf, 0x44, 0x69, 0x1c, 0x4, 0x2d, 0xa6, 0x1a, 0x7d, 0x3f, 0x77, 0xaf, 0x6e, 0xdc, 0x41, 0xda, 0x53, 0x70, 0xd5, 0xe4, 0xee, 0x50, 0x8d, 0xbb, 0xda, 0x4e, 0xa, 0x29, 0xf4, 0x79, 0x1d, 0xed, 0xed, 0xd9, 0xb4, 0xb1, 0x67, 0x49, 0x70, 0xf, 0x7d, 0xd1, 0x8e, 0x97, 0x47, 0xe9, 0x6c, 0x3b, 0x92, 0x26, 0x4, 0xec, 0xb2, 0xb6, 0xc4, 0x42, 0xd, 0xae, 0x85, 0xdd, 0xdc, 0xd1, 0xb6, 0x72, 0x37, 0x9f, 0xcf, 0xf9, 0x87, 0x76, 0x33, 0x57, 0xf6, 0x70, 0x4c, 0x90, 0x2c, 0xfd, 0x57, 0x80, 0x1, 0x0, 0xc5, 0xb1, 0xf0, 0x59, 0xcd, 0x2e, 0xe2, 0x4, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)parse_logo_png { - return [NSData dataWithBytes:parse_logo_png length:sizeof(parse_logo_png)]; - } - - static const unsigned char apple_icon2x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, 0x0, 0x2c, 0x8, 0x6, 0x0, 0x0, 0x0, 0xd, 0x53, 0x1a, 0xf5, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x3, 0x6, 0x49, 0x44, 0x41, 0x54, 0x58, 0x9, 0xcd, 0x98, 0xcb, 0x6b, 0xd5, 0x40, 0x14, 0xc6, 0x9b, 0xd6, 0x7, 0x6d, 0x15, 0x8a, 0x50, 0x8a, 0x6e, 0xac, 0xd7, 0xc7, 0x42, 0x41, 0xdd, 0x15, 0xc5, 0x95, 0xf, 0x5c, 0x54, 0xea, 0xc2, 0x85, 0x2b, 0xbb, 0x10, 0x51, 0xa4, 0x20, 0x8, 0xba, 0xf3, 0xf, 0xd0, 0xae, 0x4a, 0x2b, 0xae, 0xc4, 0x85, 0x28, 0x2a, 0xea, 0x4a, 0xc4, 0x85, 0xd5, 0x5a, 0x1f, 0x28, 0x28, 0x15, 0xc1, 0x6e, 0x4a, 0x11, 0x6f, 0xb5, 0xa8, 0x20, 0x22, 0x14, 0xb9, 0x95, 0xda, 0x5e, 0x7f, 0xdf, 0x35, 0x49, 0x27, 0x93, 0xe4, 0xf6, 0xa, 0x66, 0xe2, 0x81, 0x8f, 0x39, 0xe7, 0xcc, 0xc9, 0x7c, 0x1f, 0x93, 0xcc, 0x64, 0x92, 0xba, 0xba, 0xc, 0xad, 0x5c, 0x2e, 0x17, 0xc0, 0x59, 0x30, 0x2, 0xae, 0x64, 0x48, 0x55, 0x7d, 0x68, 0xc8, 0x9b, 0x41, 0x1f, 0x98, 0x5, 0x81, 0x5d, 0xad, 0x7e, 0xd5, 0x9f, 0xde, 0x45, 0xb5, 0x14, 0xfd, 0x4d, 0xd, 0xec, 0x2b, 0xa9, 0xbf, 0xf, 0x36, 0x59, 0xd7, 0x15, 0xad, 0x38, 0xfb, 0x10, 0x31, 0x2d, 0x60, 0x2c, 0x98, 0x12, 0xab, 0xdd, 0x99, 0xbd, 0x2, 0x8b, 0x1, 0x1, 0x37, 0x2d, 0x11, 0x41, 0x58, 0xc4, 0xf9, 0xe7, 0x77, 0xc3, 0xa2, 0x8f, 0x86, 0x10, 0xee, 0x8, 0xd8, 0x13, 0xda, 0x63, 0xd1, 0x6a, 0x7, 0x11, 0x22, 0xd2, 0x66, 0x67, 0x88, 0xbe, 0x7a, 0x7, 0x12, 0xe6, 0x29, 0x20, 0x5c, 0x2, 0x7e, 0x0, 0xdb, 0xde, 0x90, 0x68, 0x9d, 0xaf, 0x74, 0xe4, 0x41, 0xba, 0xce, 0x56, 0x42, 0xac, 0x19, 0x5b, 0xe1, 0x48, 0x42, 0x94, 0x6, 0xe2, 0xe, 0x5f, 0xd0, 0x4f, 0xda, 0xbb, 0x60, 0x6f, 0xb4, 0xa2, 0xf6, 0xc8, 0xab, 0xa5, 0x14, 0x2, 0xed, 0x2d, 0xab, 0xc0, 0x1c, 0x18, 0xf7, 0x3c, 0x6f, 0xca, 0xbc, 0x8e, 0x7e, 0xad, 0x20, 0xf5, 0x4f, 0xd2, 0x37, 0x1b, 0xf4, 0x91, 0x6f, 0xc2, 0x5f, 0xb, 0xa, 0xa0, 0x19, 0x7c, 0x2, 0xaf, 0xec, 0xeb, 0xc9, 0x2d, 0x6c, 0xc, 0xb6, 0x1, 0xf4, 0x83, 0x9, 0x60, 0xdb, 0x5b, 0x12, 0x67, 0x40, 0xbb, 0x3d, 0x12, 0xb9, 0x26, 0x70, 0x8, 0xdc, 0x1, 0xd3, 0xc0, 0x36, 0xed, 0xde, 0x7a, 0x95, 0x9c, 0x0, 0x8d, 0xf6, 0xf5, 0xb1, 0x19, 0xf2, 0x8b, 0xce, 0x51, 0x78, 0x1c, 0x2c, 0xb4, 0x77, 0x94, 0xa9, 0x79, 0x4, 0x86, 0xc1, 0x37, 0xd0, 0x1, 0xba, 0xc0, 0x72, 0x50, 0x8b, 0x69, 0xf7, 0x3e, 0xcc, 0x8c, 0x3d, 0x4c, 0x2c, 0x46, 0x4c, 0x2b, 0x78, 0xe, 0x5c, 0xda, 0xc, 0x64, 0xdd, 0x31, 0x41, 0x24, 0x1b, 0x81, 0x96, 0x69, 0x1e, 0x26, 0x51, 0xbb, 0x24, 0xca, 0xdc, 0xb0, 0x2e, 0x10, 0x6f, 0x8e, 0x29, 0x75, 0x93, 0x18, 0x85, 0x66, 0x22, 0xa4, 0x42, 0xdd, 0xf6, 0x3c, 0xa6, 0xc5, 0xe7, 0x7c, 0x4a, 0xbb, 0x2c, 0x14, 0x23, 0x87, 0xc4, 0xbd, 0x9c, 0x4, 0xbd, 0x87, 0xb7, 0xc5, 0x14, 0xe3, 0x91, 0x58, 0x43, 0xe2, 0x9d, 0x99, 0x74, 0xe8, 0xef, 0x66, 0x85, 0x3d, 0x30, 0xf9, 0xf4, 0xc, 0xed, 0x31, 0x13, 0xe, 0xfd, 0x61, 0x5b, 0x8c, 0xb8, 0x25, 0xa8, 0xf2, 0x74, 0x3b, 0x14, 0x12, 0x50, 0x25, 0x1e, 0x69, 0x25, 0x68, 0x7d, 0x50, 0xe1, 0xb8, 0x1d, 0x4c, 0xe2, 0x93, 0x20, 0xf7, 0xc7, 0x3, 0xd6, 0x11, 0xbc, 0x1f, 0xff, 0x27, 0x41, 0x25, 0x9e, 0x9f, 0x99, 0x34, 0x41, 0xd3, 0x49, 0x1d, 0x19, 0xe7, 0xf4, 0x2, 0x4e, 0x7c, 0xdf, 0xe9, 0x96, 0x7d, 0xc9, 0x98, 0x3c, 0x6d, 0xf8, 0xd5, 0x49, 0x1d, 0x79, 0xa, 0xda, 0x97, 0x26, 0xe8, 0x73, 0x52, 0x87, 0x83, 0x9c, 0xce, 0x4c, 0x9a, 0x90, 0x88, 0x29, 0x31, 0x12, 0xc9, 0xb8, 0xb, 0x36, 0x42, 0x75, 0xd4, 0xa6, 0x93, 0xa0, 0x21, 0x3b, 0xe9, 0x30, 0xee, 0x65, 0x96, 0xb6, 0x98, 0x7c, 0x7a, 0x97, 0xe9, 0x54, 0xa8, 0xd3, 0x5e, 0xe2, 0x53, 0x6f, 0x16, 0x67, 0xe4, 0xeb, 0x9c, 0xdd, 0xc9, 0x36, 0xf0, 0x5a, 0xe3, 0xd7, 0xe3, 0xfc, 0xa2, 0x7d, 0xac, 0x20, 0x27, 0xd3, 0x7, 0xc4, 0x13, 0x26, 0xa6, 0x7, 0x34, 0x54, 0xce, 0xd4, 0x38, 0x7, 0x49, 0x5e, 0xcf, 0x49, 0x90, 0x49, 0x7b, 0x39, 0x10, 0xb4, 0x98, 0xec, 0x7, 0xd0, 0x66, 0xf6, 0xe6, 0xe0, 0x77, 0x57, 0x96, 0x9d, 0xbf, 0x8d, 0x5f, 0xca, 0x41, 0x80, 0x49, 0xf9, 0x95, 0xe0, 0x56, 0x45, 0x90, 0x9f, 0xd5, 0x99, 0xba, 0x64, 0x56, 0x38, 0xf6, 0x7, 0x98, 0x98, 0x52, 0x28, 0x88, 0x40, 0x6f, 0xdf, 0x5e, 0xc7, 0x22, 0x2, 0x3a, 0xcd, 0x4e, 0x7f, 0x10, 0x84, 0x2d, 0xf, 0xb7, 0x3e, 0x85, 0x74, 0xce, 0x75, 0x6d, 0x47, 0x42, 0x11, 0xb6, 0x83, 0x92, 0x2e, 0xc7, 0x6a, 0x9e, 0xc1, 0x57, 0x59, 0x5c, 0xb6, 0x96, 0x30, 0xa6, 0x60, 0xc0, 0x91, 0xa8, 0xef, 0xf0, 0xb4, 0x87, 0xc4, 0x69, 0xe, 0x45, 0x4b, 0xc1, 0xcb, 0x8c, 0x45, 0xcd, 0x31, 0xfe, 0x81, 0x34, 0xd, 0xb1, 0x3c, 0xc5, 0x6d, 0x60, 0x3c, 0x43, 0x51, 0x27, 0x63, 0xa4, 0x24, 0xaa, 0xde, 0x3b, 0xc4, 0x14, 0xa8, 0xb9, 0xd, 0xb6, 0x26, 0x5d, 0x4c, 0x6e, 0xc, 0xdc, 0x0, 0xfa, 0x14, 0x2e, 0x82, 0x6, 0xa0, 0x8f, 0x86, 0xfd, 0xa0, 0x13, 0x68, 0xc3, 0xb5, 0x4d, 0x27, 0xd4, 0xd3, 0xac, 0xea, 0xf3, 0x76, 0x47, 0x4d, 0x31, 0xa2, 0xf4, 0xff, 0x50, 0xff, 0x82, 0x5e, 0x80, 0x29, 0x30, 0xa, 0x2e, 0x82, 0x6d, 0xd5, 0x6, 0xa0, 0x5f, 0x7f, 0x52, 0x4e, 0x81, 0x41, 0xa0, 0x95, 0xab, 0x5f, 0xc3, 0xd7, 0x80, 0x8e, 0x1d, 0xa9, 0xf6, 0x1b, 0xf5, 0x4e, 0xf9, 0x49, 0xea, 0xad, 0xd1, 0x32, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)apple_icon2x_png { - return [NSData dataWithBytes:apple_icon2x_png length:sizeof(apple_icon2x_png)]; - } - - static const unsigned char parse_logo2x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x1, 0xbb, 0x0, 0x0, 0x0, 0x88, 0x8, 0x6, 0x0, 0x0, 0x0, 0x7e, 0xf0, 0x45, 0xa9, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x45, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x46, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x43, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x44, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0xe8, 0x51, 0xff, 0x90, 0x0, 0x0, 0x26, 0xd1, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x5d, 0x7, 0x98, 0x14, 0x55, 0xd6, 0xbd, 0xd, 0x33, 0xcc, 0x90, 0x54, 0x24, 0x88, 0xa2, 0x2, 0x8a, 0x28, 0x20, 0x62, 0x40, 0x51, 0x5c, 0x57, 0x10, 0x51, 0x44, 0xd7, 0x35, 0xff, 0xbb, 0x46, 0x5c, 0x31, 0xc3, 0x9a, 0x45, 0xd4, 0x55, 0x74, 0xd7, 0xac, 0xb0, 0x86, 0x5d, 0x73, 0x5e, 0x75, 0x4d, 0x6b, 0x56, 0x14, 0x11, 0xcc, 0x1, 0x41, 0xc9, 0x51, 0x82, 0x8, 0x8, 0x22, 0x82, 0x48, 0x9a, 0xf8, 0xbf, 0x63, 0x9d, 0x96, 0xa6, 0xe6, 0x55, 0x4f, 0xcf, 0x4c, 0x55, 0x77, 0x55, 0xf5, 0x3d, 0xdf, 0x77, 0x3f, 0xe0, 0x55, 0x33, 0x53, 0xfd, 0xea, 0xd5, 0x3b, 0x37, 0xbf, 0xc4, 0x49, 0x83, 0x86, 0xb4, 0x13, 0x91, 0x53, 0x8c, 0x34, 0x96, 0xf8, 0xa2, 0xbe, 0x91, 0xa9, 0x46, 0x66, 0x19, 0x99, 0x61, 0x64, 0xb5, 0x91, 0x52, 0x51, 0x28, 0x14, 0xa, 0x45, 0x6c, 0xb0, 0x66, 0xed, 0x3a, 0x19, 0x3a, 0x68, 0xa0, 0xec, 0xb3, 0x47, 0xd7, 0x2a, 0xd7, 0xa, 0x8c, 0xdc, 0x62, 0xa4, 0xb7, 0x91, 0xe2, 0x18, 0xcf, 0x41, 0x82, 0xe4, 0x56, 0x66, 0xa4, 0xc4, 0xc8, 0x14, 0x92, 0xdf, 0x24, 0xfe, 0x1d, 0xb2, 0x41, 0x97, 0x8a, 0x42, 0xa1, 0x50, 0xc4, 0x13, 0x20, 0xbb, 0xed, 0x8c, 0x34, 0xe3, 0xdf, 0xf3, 0x5, 0x6d, 0x8c, 0x1c, 0xca, 0xbf, 0xff, 0x42, 0xd2, 0xfb, 0xd0, 0xc8, 0x33, 0xfc, 0x7b, 0xa5, 0x2e, 0xd, 0x85, 0x42, 0xa1, 0x88, 0xf, 0xea, 0x19, 0x29, 0x37, 0x52, 0x91, 0xc7, 0x73, 0xd0, 0xc4, 0x48, 0x4f, 0x23, 0x43, 0x8c, 0x8c, 0x33, 0x32, 0xd2, 0xc8, 0x31, 0x46, 0xa, 0x75, 0x79, 0x28, 0x14, 0xa, 0x45, 0x7c, 0xc8, 0x4e, 0xb1, 0x11, 0x20, 0xb8, 0x43, 0x8c, 0xbc, 0x68, 0x64, 0xb4, 0x91, 0x63, 0x75, 0x8e, 0x14, 0xa, 0x85, 0x22, 0xfa, 0xf0, 0x72, 0x5d, 0x22, 0x89, 0x63, 0x6a, 0x8c, 0x8, 0xbd, 0x95, 0x91, 0x46, 0xfc, 0x73, 0xeb, 0xc, 0x9, 0xec, 0x0, 0xca, 0x28, 0x23, 0x7f, 0x17, 0xc7, 0xcd, 0xa9, 0x50, 0x28, 0x14, 0x8a, 0x18, 0x91, 0xdd, 0x93, 0x46, 0x6e, 0x8c, 0xd1, 0xf7, 0x6c, 0x40, 0xb2, 0xdb, 0xca, 0x48, 0x6b, 0x23, 0x9d, 0x53, 0xc8, 0xc, 0xf1, 0xbb, 0x44, 0x9a, 0xff, 0xdb, 0x97, 0x9f, 0xbb, 0xd7, 0xc8, 0x75, 0x46, 0x56, 0xe9, 0xb2, 0x51, 0x28, 0x14, 0x8a, 0xe8, 0x59, 0x3d, 0x36, 0x34, 0x8c, 0xd9, 0xf7, 0x44, 0x6, 0xe6, 0x4a, 0x23, 0x33, 0x8d, 0xbc, 0x4f, 0xe2, 0x3a, 0xd1, 0x48, 0x27, 0x23, 0xfd, 0x8d, 0x3c, 0x6a, 0xe4, 0xbb, 0x34, 0xff, 0x1f, 0x99, 0xaa, 0x17, 0x19, 0x79, 0xdb, 0x48, 0x77, 0x5d, 0x36, 0xa, 0x85, 0x42, 0x11, 0xf, 0xb2, 0xcb, 0x17, 0x20, 0x13, 0x13, 0x9, 0x29, 0x7f, 0x31, 0x72, 0x90, 0x91, 0x2b, 0x8d, 0xcc, 0x4d, 0xf3, 0xf9, 0x1e, 0x46, 0xde, 0x32, 0x32, 0x40, 0x97, 0x8e, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0x45, 0x11, 0xb3, 0x8d, 0xdc, 0x64, 0x64, 0x2f, 0x71, 0xdc, 0x95, 0xcb, 0x3c, 0x3e, 0xd7, 0x82, 0x96, 0x20, 0xdc, 0xbc, 0x9, 0x9d, 0x36, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x22, 0xe0, 0xee, 0x1c, 0x66, 0xa4, 0x8f, 0x91, 0x17, 0xd2, 0x7c, 0x6e, 0xa8, 0x38, 0xee, 0xd0, 0x22, 0x9d, 0x32, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x2a, 0xd0, 0x55, 0xe5, 0x78, 0x23, 0x3, 0x8d, 0xac, 0xf0, 0xf8, 0xcc, 0xd9, 0x46, 0x1e, 0x96, 0xf8, 0xc5, 0x38, 0x15, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0xcf, 0x0, 0x32, 0x43, 0xed, 0xdd, 0xd7, 0x1e, 0xd7, 0x4f, 0xa2, 0x85, 0xa7, 0x45, 0xe8, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x69, 0x8c, 0x17, 0xa7, 0x4, 0xe1, 0x4d, 0x8f, 0xeb, 0xa7, 0x89, 0xe3, 0xfa, 0x54, 0x28, 0x14, 0xa, 0x85, 0x92, 0x5d, 0xa4, 0xb1, 0xdc, 0xc8, 0x9f, 0xc4, 0x49, 0x4e, 0xb1, 0x1, 0x99, 0x9c, 0x67, 0xea, 0x34, 0x29, 0x14, 0xa, 0x85, 0x92, 0x5d, 0xd4, 0x81, 0xa3, 0x81, 0x10, 0xc3, 0x7b, 0xc8, 0xe3, 0xfa, 0x8, 0x23, 0xbd, 0x74, 0x9a, 0x14, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0xea, 0x40, 0xd3, 0xec, 0xc1, 0xe2, 0xf4, 0xcf, 0x74, 0x3, 0x67, 0x2, 0x22, 0x7e, 0xd7, 0x42, 0xa7, 0x49, 0xa1, 0x50, 0x28, 0x94, 0xec, 0xa2, 0x8e, 0xf5, 0xb4, 0xf0, 0x3e, 0xb6, 0x5c, 0xdb, 0x45, 0x9c, 0x33, 0x2, 0xb, 0x74, 0x9a, 0x14, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0xea, 0x40, 0x3d, 0xde, 0x0, 0x23, 0xdf, 0x5a, 0xae, 0x9d, 0x6a, 0xe4, 0x70, 0x9d, 0x22, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x3, 0xe6, 0x18, 0x19, 0x24, 0xce, 0x29, 0xe8, 0xa9, 0x48, 0x9e, 0x0, 0xbf, 0x85, 0x4e, 0x91, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x1, 0xaf, 0x19, 0xb9, 0xdb, 0x32, 0xbe, 0xb3, 0x91, 0x8b, 0x75, 0x7a, 0x14, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0x2e, 0xb8, 0xd9, 0xc8, 0x44, 0xcb, 0xf8, 0x19, 0x46, 0x76, 0xd2, 0xe9, 0x51, 0x28, 0x14, 0xa, 0x25, 0xbb, 0x38, 0xe0, 0x7, 0x23, 0x97, 0x59, 0xc6, 0xb7, 0x11, 0xe7, 0x68, 0x20, 0x85, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x2, 0x38, 0xd1, 0xfc, 0x19, 0xcb, 0x38, 0x92, 0x55, 0xda, 0xeb, 0xf4, 0x28, 0x14, 0xa, 0x85, 0x92, 0x5d, 0x5c, 0x80, 0xa2, 0xf2, 0x9f, 0x5d, 0x63, 0xa8, 0xbd, 0xfb, 0x8b, 0x4e, 0x8d, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x5, 0xe3, 0x8c, 0xbc, 0x6a, 0x19, 0x3f, 0xc1, 0x48, 0x4b, 0x9d, 0x1e, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x93, 0x75, 0xe7, 0x46, 0x47, 0xd1, 0x36, 0x62, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x23, 0x7c, 0x65, 0xe4, 0xd, 0xcb, 0xf8, 0x19, 0x3a, 0x35, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x17, 0x54, 0x1a, 0x79, 0xce, 0x32, 0xde, 0xd3, 0x48, 0x3b, 0x9d, 0x1e, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0xb, 0xde, 0x36, 0x32, 0xd7, 0x35, 0xd6, 0x54, 0x9c, 0x33, 0xf1, 0x14, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0xb, 0x2c, 0x35, 0xf2, 0xa5, 0x65, 0xfc, 0x77, 0x3a, 0x35, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x27, 0xd8, 0xb2, 0x32, 0xf7, 0x36, 0xd2, 0x5a, 0xa7, 0x46, 0xa1, 0x50, 0x28, 0x94, 0xec, 0xe2, 0x82, 0xb1, 0x46, 0x4a, 0x5c, 0x63, 0x68, 0x1d, 0xb6, 0x9d, 0x4e, 0x8d, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x5, 0x3f, 0x1a, 0x99, 0xea, 0x1a, 0x2b, 0x10, 0xed, 0x95, 0xa9, 0x50, 0x28, 0x14, 0x59, 0x87, 0x1e, 0x30, 0x1a, 0x1c, 0x70, 0xc0, 0xeb, 0x27, 0x46, 0xf6, 0x70, 0x8d, 0xef, 0x66, 0xe4, 0xe9, 0x8, 0x7f, 0xaf, 0x42, 0x23, 0xd, 0x8c, 0x34, 0xf1, 0xb0, 0x52, 0x13, 0x46, 0xd6, 0x19, 0x59, 0x48, 0xcb, 0x76, 0x83, 0x38, 0xa7, 0xbb, 0x2b, 0x14, 0x99, 0xee, 0x49, 0xc9, 0x35, 0x86, 0xf5, 0xd5, 0x50, 0x9c, 0xc, 0x67, 0x9b, 0xa2, 0xe, 0x85, 0xf2, 0x7b, 0xae, 0x2f, 0xac, 0xb5, 0x72, 0x9d, 0x3e, 0x5f, 0x90, 0xe0, 0xfc, 0xe3, 0x59, 0x6c, 0x6d, 0x64, 0x4b, 0xcb, 0x3b, 0x8c, 0xf9, 0xc7, 0x99, 0x9e, 0x8b, 0x8c, 0x94, 0x89, 0x73, 0xcc, 0x59, 0x45, 0xd8, 0x17, 0x96, 0x22, 0x38, 0xcc, 0xb0, 0x8c, 0xed, 0x1c, 0xb1, 0x8d, 0x7, 0x27, 0xaf, 0x77, 0x30, 0xd2, 0xc9, 0xc8, 0x5e, 0x46, 0xda, 0xf2, 0xdf, 0x45, 0xdc, 0x94, 0x2a, 0x2d, 0x2f, 0x4a, 0x5, 0x17, 0xff, 0x4f, 0xe2, 0x9c, 0xf9, 0x87, 0x79, 0x98, 0x69, 0x64, 0x16, 0xff, 0xfc, 0x26, 0xa6, 0xcf, 0xbb, 0x1e, 0x37, 0x9, 0xe1, 0xc6, 0x5b, 0xaa, 0xaf, 0x40, 0x5a, 0x6c, 0x6b, 0x64, 0x47, 0xa, 0xd6, 0x19, 0x9a, 0x2f, 0xa0, 0x79, 0xfa, 0xf6, 0x54, 0xa6, 0xa, 0x39, 0xa7, 0x95, 0x1e, 0x1b, 0x72, 0x39, 0x37, 0x5a, 0x6c, 0xba, 0xf3, 0xc5, 0x39, 0x48, 0x79, 0x26, 0xff, 0x3e, 0xdb, 0xc8, 0x2, 0x6e, 0xc6, 0x8a, 0xf4, 0x68, 0xcd, 0xf7, 0xbb, 0x3, 0xf7, 0xa7, 0x2e, 0x46, 0x76, 0x30, 0xd2, 0x86, 0x7b, 0x40, 0x7d, 0x8f, 0xf7, 0x3c, 0x39, 0xff, 0xdf, 0x73, 0xee, 0x67, 0xf0, 0x1d, 0x9f, 0xc2, 0x77, 0x7c, 0x9e, 0x92, 0x5d, 0xfe, 0x60, 0x11, 0x17, 0x49, 0x22, 0x65, 0xac, 0x63, 0xc8, 0xef, 0x19, 0xbd, 0x3c, 0xf, 0x31, 0x72, 0xb0, 0x91, 0xae, 0x5c, 0xfc, 0xad, 0x6a, 0xf1, 0x73, 0x1a, 0xf0, 0x67, 0x61, 0x43, 0xeb, 0x95, 0x32, 0x8e, 0xd, 0x68, 0xba, 0x91, 0x31, 0x46, 0xfe, 0x27, 0x4e, 0x89, 0x46, 0x1c, 0x2c, 0x3f, 0x28, 0x2, 0xb7, 0x53, 0x9, 0x10, 0x6e, 0x2, 0x77, 0x18, 0x79, 0x25, 0x8b, 0xf7, 0xd0, 0x90, 0xd6, 0xd0, 0xce, 0x54, 0x4a, 0x5a, 0xf3, 0x7e, 0x92, 0x8d, 0xc8, 0x8b, 0x68, 0x1, 0x5d, 0x60, 0xe4, 0xbb, 0x1c, 0xcc, 0x11, 0x7e, 0x7f, 0x37, 0x23, 0x87, 0x89, 0x93, 0xac, 0xb5, 0x13, 0x89, 0xae, 0x7e, 0x1d, 0xf6, 0xaf, 0x22, 0xae, 0x33, 0x6c, 0xcc, 0xfb, 0xbb, 0x3c, 0x2b, 0xdf, 0x52, 0xd9, 0x1a, 0x2f, 0xce, 0xb9, 0x93, 0x93, 0xe8, 0x69, 0xc8, 0x77, 0xd4, 0xe7, 0x3e, 0x84, 0xf7, 0xbc, 0x37, 0x9f, 0x43, 0xe7, 0x3a, 0xcc, 0x7f, 0x52, 0x61, 0xe9, 0x9d, 0x72, 0x6d, 0x1e, 0x15, 0x8e, 0x64, 0xb, 0xc5, 0xaf, 0xa5, 0x6a, 0xe, 0x83, 0x92, 0x5d, 0x8c, 0xb0, 0xd8, 0xc8, 0x2f, 0xe2, 0xd4, 0xd8, 0x25, 0xd1, 0x82, 0xda, 0x6a, 0x98, 0x36, 0x78, 0xb8, 0x29, 0x50, 0xf4, 0x7e, 0x84, 0x91, 0xc3, 0x49, 0x50, 0x41, 0xa1, 0x2d, 0xa5, 0x9f, 0x91, 0xeb, 0x8d, 0x7c, 0x64, 0xe4, 0x29, 0x23, 0x6f, 0x8a, 0x53, 0xb2, 0x11, 0x55, 0x1c, 0x21, 0x55, 0x5b, 0xc2, 0x2d, 0xa, 0x98, 0xec, 0xb0, 0x69, 0x75, 0x37, 0xb2, 0x9f, 0x91, 0x3, 0x8c, 0xec, 0x23, 0x4e, 0xf, 0xd6, 0xa2, 0x6a, 0xfe, 0xdf, 0xf3, 0x46, 0xfe, 0x9b, 0xc5, 0xb9, 0x1, 0xb1, 0xf5, 0x31, 0x72, 0x1a, 0xad, 0x87, 0x6c, 0xec, 0x3b, 0xc5, 0xdc, 0xd0, 0x21, 0xfd, 0x8d, 0xc, 0xe5, 0x6, 0x8c, 0x86, 0xf, 0x23, 0xb9, 0xee, 0xf2, 0xd, 0xed, 0xa9, 0xc4, 0x9e, 0xc8, 0xf7, 0xbd, 0x41, 0xc0, 0xbf, 0xab, 0x3d, 0x9, 0x75, 0x8, 0x95, 0x8e, 0xff, 0x70, 0xee, 0xc7, 0x2b, 0xd9, 0xc5, 0xf, 0x38, 0x1, 0x61, 0x8d, 0x8b, 0xec, 0x8a, 0xa8, 0x7d, 0x2f, 0x8, 0xc1, 0xfd, 0x61, 0x23, 0x38, 0x95, 0x1b, 0x75, 0xb7, 0x1c, 0x69, 0xfa, 0x7d, 0x28, 0xd3, 0x8c, 0x3c, 0x6e, 0xe4, 0x3e, 0xa9, 0x7a, 0x72, 0x44, 0x14, 0x60, 0x73, 0xb5, 0x95, 0x7, 0xb8, 0x91, 0x9c, 0xcc, 0x79, 0xeb, 0x4e, 0xcb, 0xa6, 0x26, 0x48, 0x64, 0x61, 0x3e, 0x12, 0x24, 0x19, 0x9c, 0xf8, 0xd1, 0xd7, 0xf5, 0xe, 0xe4, 0x6a, 0xaf, 0x83, 0x5, 0x73, 0x95, 0x38, 0x67, 0x4f, 0xc2, 0xb3, 0x80, 0x23, 0xb9, 0x9e, 0xa5, 0x15, 0x18, 0x67, 0xec, 0x6e, 0xe4, 0x1c, 0x23, 0x87, 0x4a, 0x6e, 0xba, 0x38, 0x25, 0xc3, 0x21, 0xff, 0xe0, 0xdc, 0x7f, 0xc0, 0xf7, 0xfc, 0x1d, 0x7a, 0x40, 0x94, 0xec, 0x62, 0x80, 0xd5, 0x46, 0xd6, 0x5a, 0xb4, 0xf1, 0x46, 0x39, 0xbe, 0xaf, 0x83, 0xb8, 0x9, 0x1d, 0x23, 0x8e, 0xeb, 0xab, 0xa6, 0xc0, 0x26, 0xe, 0x3f, 0x3d, 0x12, 0x51, 0x56, 0x88, 0x13, 0x9b, 0x4a, 0x70, 0xc3, 0x87, 0x65, 0x81, 0x58, 0x4b, 0x73, 0x23, 0x9b, 0xd5, 0xe0, 0x67, 0xc2, 0x8d, 0x72, 0x8b, 0x91, 0xb3, 0xc4, 0x39, 0xf9, 0xfd, 0x71, 0x89, 0x56, 0xcc, 0xab, 0x32, 0xc3, 0xb1, 0xba, 0xa0, 0x27, 0x37, 0xad, 0xa3, 0x42, 0x40, 0x1e, 0xe9, 0x80, 0xe6, 0x9, 0x57, 0x53, 0xab, 0xaf, 0xd, 0xb1, 0xae, 0xa4, 0x60, 0xfe, 0x96, 0x71, 0x43, 0x4c, 0xfe, 0x1c, 0x78, 0x44, 0xb6, 0x20, 0xc1, 0x37, 0xa2, 0x57, 0xa2, 0xb0, 0x86, 0x3f, 0xbf, 0x1, 0x37, 0x7e, 0xc8, 0xa5, 0x46, 0x6e, 0x23, 0xe9, 0xc5, 0xcd, 0xc5, 0x9, 0x4b, 0xff, 0x5c, 0x5a, 0x72, 0xb5, 0xb1, 0xe2, 0xa0, 0x74, 0x22, 0xee, 0xe, 0xf7, 0xe3, 0xf2, 0x94, 0xf5, 0x5c, 0xc9, 0xf5, 0xd7, 0x94, 0xcf, 0x21, 0xe9, 0xad, 0xca, 0x4, 0x9b, 0x1b, 0xf9, 0x3, 0x15, 0x6c, 0x58, 0x78, 0x77, 0xd0, 0xd3, 0x10, 0x78, 0x72, 0x91, 0x92, 0x5d, 0xb0, 0xc0, 0x42, 0xf9, 0xc5, 0xb2, 0x1, 0xe6, 0xc2, 0x85, 0x59, 0x9f, 0x9b, 0xe4, 0x59, 0xb4, 0x8, 0x32, 0x8d, 0x93, 0x94, 0x93, 0xd0, 0x3e, 0x17, 0xa7, 0xc9, 0x35, 0x82, 0xcf, 0x70, 0x37, 0x2e, 0xa1, 0x46, 0x9c, 0x4a, 0x76, 0x15, 0x29, 0x64, 0x87, 0x17, 0xa0, 0x15, 0xad, 0x10, 0x4, 0xbc, 0x7f, 0x4f, 0xcd, 0xba, 0xba, 0x97, 0xe, 0xbe, 0xff, 0x7, 0x8d, 0xfc, 0xd9, 0xc8, 0xe5, 0xb9, 0x72, 0x79, 0x84, 0xc, 0x3d, 0x8c, 0x5c, 0xc8, 0xe7, 0x57, 0x1c, 0xe2, 0xfb, 0x44, 0x72, 0xc9, 0x35, 0x46, 0x4e, 0xcf, 0x70, 0x73, 0xc5, 0xba, 0x41, 0xec, 0x10, 0xb1, 0x34, 0xc4, 0x76, 0xe6, 0x51, 0x89, 0x5a, 0xc9, 0x77, 0x47, 0xaa, 0x21, 0xbb, 0x86, 0x54, 0xaa, 0x40, 0x78, 0xad, 0xb9, 0xce, 0xba, 0xd3, 0x8a, 0xd8, 0x3c, 0xc3, 0xd, 0x78, 0x57, 0x2a, 0x56, 0x3, 0x68, 0x79, 0xbc, 0x17, 0x83, 0xf5, 0x2, 0xeb, 0xed, 0x62, 0x2a, 0xb4, 0x99, 0x5a, 0xfd, 0x78, 0x97, 0x67, 0xf1, 0x3d, 0x1f, 0xc7, 0xe7, 0xb0, 0x84, 0xef, 0x77, 0x2a, 0xd9, 0x25, 0x95, 0xda, 0x26, 0x54, 0x66, 0x93, 0x64, 0xb7, 0xd, 0xdf, 0xef, 0xae, 0x54, 0x76, 0x9a, 0x57, 0xc3, 0x2f, 0x9, 0x3e, 0x2b, 0x58, 0xd7, 0x3, 0x8d, 0xdc, 0x4a, 0x4b, 0x4f, 0xc9, 0x2e, 0xa2, 0xa8, 0x97, 0x25, 0x97, 0x51, 0x75, 0xe8, 0x4f, 0xf7, 0x41, 0xaf, 0x1a, 0x68, 0xd6, 0xe3, 0xb9, 0xf0, 0xb1, 0x0, 0x27, 0xd0, 0x4a, 0xcd, 0x4, 0xc9, 0xec, 0xb7, 0xf9, 0x16, 0x6d, 0x1a, 0x19, 0x5e, 0x87, 0x51, 0xa3, 0x3e, 0xa0, 0x1a, 0xb, 0x17, 0xd6, 0xe7, 0x28, 0x5a, 0x8, 0xff, 0xce, 0xd3, 0xf5, 0x83, 0xac, 0xc4, 0x21, 0x54, 0x50, 0x6a, 0xfa, 0xae, 0x42, 0x2b, 0x5f, 0x98, 0x42, 0x1e, 0x73, 0xb9, 0x69, 0x81, 0x5c, 0x3e, 0xe, 0xe0, 0x5e, 0xf1, 0x5c, 0xef, 0x12, 0x27, 0x26, 0x97, 0xe, 0x3f, 0x70, 0x33, 0x7d, 0x5f, 0x9c, 0xf8, 0xcd, 0x2c, 0xa9, 0xb9, 0x1b, 0x71, 0x59, 0x35, 0x7b, 0x1a, 0x48, 0x10, 0x9, 0x43, 0x7, 0x8a, 0x93, 0xb4, 0xd2, 0x85, 0x9b, 0x71, 0x3a, 0xf4, 0xe6, 0x9a, 0xbc, 0xdb, 0xc8, 0x30, 0x89, 0xa6, 0x2b, 0x1d, 0xdf, 0xfd, 0x4c, 0x2a, 0x1c, 0x99, 0x74, 0x6a, 0x42, 0x1c, 0xed, 0xb, 0x71, 0x7a, 0xf9, 0x7e, 0xc8, 0x77, 0x37, 0xd3, 0x24, 0x12, 0x58, 0xc1, 0x3f, 0x7a, 0x5c, 0xc3, 0xfc, 0xef, 0xce, 0xf7, 0x1c, 0x4a, 0xee, 0xde, 0x24, 0x47, 0x2f, 0xf4, 0xe1, 0xfb, 0xfe, 0xb0, 0x91, 0x9b, 0xa4, 0x6a, 0x5f, 0x61, 0x25, 0x3b, 0x45, 0xb5, 0xc0, 0xb, 0x7f, 0xa5, 0x91, 0x23, 0x33, 0x78, 0xd6, 0x15, 0xd4, 0xb0, 0x9f, 0xe0, 0x46, 0x34, 0xc1, 0xe7, 0x7b, 0xc1, 0x4b, 0x34, 0x83, 0x82, 0x33, 0xff, 0xf6, 0x35, 0x72, 0x34, 0x37, 0xf2, 0x2d, 0x3c, 0xfe, 0x4f, 0x33, 0x23, 0xff, 0xa2, 0xa6, 0x8e, 0x4d, 0x7f, 0x5d, 0x1e, 0x3d, 0xbb, 0x53, 0xb8, 0x69, 0x75, 0xc8, 0xf0, 0xf3, 0x20, 0x8c, 0x89, 0xdc, 0xb8, 0xbe, 0x22, 0xa9, 0x2d, 0x94, 0xec, 0x24, 0xfd, 0xc0, 0xea, 0x84, 0xeb, 0x39, 0x5d, 0x62, 0xc, 0xb2, 0xf1, 0x1e, 0xa5, 0xe5, 0x34, 0x25, 0xc0, 0x7b, 0x29, 0xa3, 0x62, 0x36, 0x96, 0x22, 0x5c, 0x3f, 0x70, 0x1, 0xff, 0x89, 0xa, 0x5f, 0x61, 0x9a, 0xfd, 0xf0, 0x22, 0xbe, 0x37, 0x58, 0x97, 0x33, 0x23, 0xb4, 0x5e, 0x92, 0x61, 0x80, 0x23, 0x32, 0x98, 0x9f, 0xd1, 0xe2, 0x24, 0x8b, 0x20, 0x76, 0xf6, 0x6d, 0x0, 0xf7, 0x82, 0xf7, 0xf4, 0x53, 0x4a, 0x82, 0x64, 0x77, 0x38, 0xd7, 0x74, 0xfb, 0x34, 0x96, 0x1e, 0x2c, 0xbc, 0xbe, 0x5c, 0xf7, 0x4f, 0x28, 0xd9, 0x45, 0xb, 0x30, 0xe5, 0x9b, 0x7a, 0x3c, 0xd8, 0xa0, 0x2d, 0x2, 0xb8, 0x31, 0xce, 0x91, 0xea, 0x33, 0xf3, 0x16, 0xd3, 0x82, 0x7a, 0x82, 0xda, 0x5d, 0xb6, 0xe2, 0x64, 0x9f, 0x51, 0x86, 0xf3, 0x5e, 0xe1, 0xfa, 0xf2, 0x3a, 0xcd, 0x7d, 0x30, 0x5d, 0x24, 0x27, 0xd1, 0xad, 0x12, 0x67, 0x40, 0x23, 0xbf, 0x9d, 0xdf, 0x35, 0x13, 0x5, 0x2, 0x1b, 0xfa, 0x5b, 0x46, 0x5e, 0x26, 0xc1, 0x95, 0x65, 0xf1, 0x5e, 0xb, 0xf9, 0xfc, 0x6, 0xa5, 0xf9, 0xcc, 0x47, 0xb4, 0x96, 0x5e, 0x92, 0xdc, 0xc5, 0x60, 0x93, 0x4a, 0xd6, 0x63, 0xb4, 0x38, 0xce, 0x33, 0x72, 0x6c, 0x1a, 0x25, 0xb, 0xd6, 0x8, 0xd2, 0xe5, 0x7, 0x70, 0xc3, 0x8e, 0x82, 0x62, 0x84, 0xe7, 0xd0, 0x22, 0xcd, 0x67, 0xf0, 0xde, 0xa0, 0xd4, 0xe7, 0x11, 0xbe, 0x77, 0x95, 0x59, 0xba, 0xb7, 0x4a, 0x5a, 0x8f, 0x10, 0xb8, 0x2a, 0x8f, 0xe1, 0xbe, 0xd4, 0xd3, 0xe3, 0xf3, 0xc8, 0xd4, 0x7e, 0x9c, 0x4a, 0xc9, 0x10, 0x7a, 0x2, 0x7c, 0x81, 0xb6, 0xb, 0xb, 0x16, 0x70, 0xd3, 0x15, 0x5b, 0x2c, 0xa8, 0xa0, 0xb2, 0xbf, 0xea, 0x91, 0x34, 0xa0, 0x3d, 0x5f, 0x50, 0xd, 0xd1, 0x2d, 0xa4, 0xbb, 0xe6, 0x20, 0xbe, 0xd4, 0xef, 0xe5, 0x68, 0x33, 0x5a, 0xca, 0x45, 0xdd, 0x87, 0x1b, 0xa2, 0x17, 0xfa, 0x51, 0x1b, 0x6d, 0x16, 0xe3, 0xf5, 0x82, 0xd, 0xe0, 0x9d, 0xc, 0x88, 0x6e, 0x39, 0xad, 0x63, 0x3c, 0x3b, 0xb8, 0x8a, 0xfe, 0x29, 0x8e, 0xdb, 0xb8, 0x2c, 0xcb, 0xf7, 0x3b, 0x22, 0xd, 0xd1, 0x2d, 0xe2, 0xa6, 0x86, 0x24, 0x95, 0xe7, 0x24, 0x1c, 0xc9, 0x46, 0x15, 0xf4, 0x58, 0xc, 0xe4, 0x7a, 0x43, 0x46, 0xa0, 0x57, 0x62, 0x44, 0x47, 0x12, 0xde, 0x81, 0x21, 0x5e, 0x2f, 0x5, 0x24, 0x90, 0xc7, 0xd3, 0x10, 0x5d, 0x5, 0x49, 0x1e, 0xdf, 0xf7, 0x4c, 0x92, 0x77, 0x65, 0x8e, 0xee, 0x17, 0x99, 0xe9, 0x4f, 0xf2, 0x5e, 0xb0, 0xc6, 0xa7, 0xa6, 0xf9, 0xec, 0xe9, 0x54, 0xe2, 0x7a, 0x28, 0xd9, 0x45, 0x3, 0x4d, 0xa5, 0x6a, 0x5c, 0x6a, 0x43, 0x40, 0xae, 0x3, 0x68, 0xac, 0x23, 0xa9, 0xb9, 0xed, 0x98, 0xe6, 0x73, 0x88, 0x91, 0xc0, 0xb5, 0x89, 0xb6, 0x65, 0xd7, 0x85, 0xc8, 0x55, 0x33, 0x99, 0x5a, 0xdf, 0x5f, 0x65, 0x63, 0x72, 0x82, 0x1b, 0x88, 0xb, 0x3d, 0x95, 0x46, 0x23, 0x8f, 0x32, 0x4e, 0xe4, 0xf3, 0xeb, 0x9a, 0xe6, 0x33, 0x8b, 0xa8, 0xa0, 0xec, 0x46, 0x6b, 0xf8, 0xe3, 0x1c, 0xde, 0x2f, 0xea, 0xd6, 0xce, 0xf7, 0xb8, 0xf6, 0x16, 0x35, 0xf3, 0xfb, 0x25, 0xbc, 0xae, 0x67, 0x90, 0xde, 0xb9, 0x54, 0x16, 0x3e, 0xf4, 0xf8, 0x4c, 0xb, 0x2a, 0x58, 0x5d, 0x42, 0x78, 0xff, 0xf0, 0x82, 0x20, 0x83, 0x14, 0xb1, 0x78, 0x2f, 0x4f, 0xd1, 0xe7, 0xfc, 0x7e, 0x20, 0x8e, 0xaf, 0x43, 0x74, 0xef, 0x50, 0xf6, 0x9f, 0x26, 0x91, 0xd, 0x4d, 0x63, 0xbd, 0xc1, 0x9d, 0xfc, 0x6, 0xf7, 0x5, 0x25, 0xbb, 0x90, 0x3, 0xd9, 0x88, 0xee, 0xf4, 0xfb, 0x1f, 0xc4, 0xdf, 0x6c, 0x4c, 0x68, 0x77, 0x97, 0x88, 0xe3, 0x8a, 0xec, 0x5b, 0x8d, 0x1b, 0xe3, 0x6, 0x5a, 0x3, 0x8, 0x2, 0xaf, 0xc, 0xe9, 0x9c, 0xc1, 0xe5, 0x75, 0x38, 0x49, 0xd9, 0x8b, 0xf0, 0x86, 0x4b, 0x38, 0x12, 0x7f, 0xfc, 0xc2, 0x60, 0x6a, 0xdf, 0x4d, 0xd3, 0x68, 0xe7, 0xf, 0x50, 0x23, 0x86, 0x82, 0xb2, 0x24, 0xc7, 0xf7, 0x8b, 0x58, 0xeb, 0xdf, 0x3d, 0xae, 0xdd, 0xc1, 0xeb, 0x73, 0x22, 0x32, 0xf7, 0x88, 0x5f, 0xf5, 0xa7, 0x75, 0x6c, 0xc3, 0xb6, 0xb4, 0x9c, 0xb6, 0xc, 0xd1, 0x3d, 0xb7, 0xa5, 0x17, 0xc4, 0x8b, 0x4, 0xa0, 0x50, 0x27, 0x4b, 0x3f, 0xde, 0xd, 0xf1, 0xdc, 0xc3, 0xd2, 0xbb, 0x99, 0x7b, 0xd2, 0x48, 0x8f, 0xcf, 0x34, 0xe7, 0xfc, 0x5f, 0xa0, 0x64, 0x17, 0x6e, 0x6c, 0x6f, 0x19, 0x9b, 0xef, 0xb3, 0xe5, 0x8, 0x17, 0xd1, 0xed, 0x69, 0xdc, 0x18, 0x58, 0xf8, 0x88, 0xc7, 0xed, 0xc3, 0x17, 0x20, 0xa, 0xbd, 0x2, 0x3f, 0xe5, 0x6, 0xf4, 0x59, 0x1a, 0x17, 0xc7, 0xc5, 0x31, 0x58, 0x1f, 0x50, 0x54, 0xae, 0x15, 0x27, 0x8b, 0xd1, 0x2b, 0x69, 0x2, 0xc9, 0x26, 0x70, 0xe1, 0x9e, 0x1d, 0x12, 0x2b, 0x1c, 0xb1, 0xd3, 0x3b, 0xc5, 0x5e, 0xba, 0x72, 0xa3, 0x38, 0x75, 0x6b, 0x51, 0xab, 0x57, 0x43, 0x79, 0x10, 0x12, 0x53, 0x4e, 0x13, 0x7b, 0x88, 0x61, 0x2f, 0x3e, 0xa7, 0x30, 0x0, 0x56, 0x26, 0xba, 0xd, 0xed, 0xef, 0x71, 0x7d, 0x1a, 0xdf, 0x1d, 0x28, 0xb6, 0x51, 0xc9, 0x28, 0x9d, 0x42, 0x5, 0x17, 0x56, 0x9e, 0x2d, 0xeb, 0xbb, 0x9, 0x95, 0x91, 0xcb, 0x94, 0xec, 0xc2, 0xb, 0x5b, 0x26, 0x9d, 0x9f, 0x1a, 0x2f, 0x5c, 0x19, 0x7, 0xa4, 0xb9, 0xfe, 0x39, 0x17, 0x11, 0x5e, 0xe2, 0xa8, 0x35, 0x5f, 0xfe, 0x86, 0x16, 0xc2, 0x27, 0x1e, 0xd7, 0x61, 0x59, 0xfc, 0x3e, 0xe2, 0xeb, 0x3, 0x75, 0x5d, 0xc3, 0xaa, 0xb1, 0x72, 0xfb, 0xd2, 0x6a, 0xf, 0xb, 0xb0, 0xe9, 0xdb, 0x4e, 0xbb, 0xb8, 0x85, 0xca, 0x54, 0x94, 0x1, 0xa5, 0x10, 0xc9, 0x2b, 0xb6, 0xf8, 0xe2, 0xb9, 0x54, 0x3a, 0x72, 0x89, 0x4e, 0xb4, 0xe8, 0xbc, 0xfa, 0x58, 0xbe, 0x40, 0x6b, 0x2e, 0x8a, 0xb5, 0x82, 0x15, 0xb4, 0xf2, 0x8e, 0x13, 0xef, 0xee, 0x52, 0x37, 0x53, 0x29, 0x51, 0xb2, 0xb, 0x19, 0xa0, 0xa9, 0xef, 0x6a, 0x19, 0x9f, 0xec, 0xe3, 0xef, 0x98, 0x27, 0x76, 0x77, 0x12, 0x12, 0x18, 0xae, 0x20, 0x19, 0x8c, 0x8e, 0xf0, 0x1c, 0x7e, 0xcf, 0xc5, 0x6f, 0x4b, 0x55, 0x47, 0x2d, 0xcf, 0x8, 0x9, 0x77, 0x27, 0x91, 0x74, 0x80, 0x5b, 0x66, 0x88, 0xc7, 0x35, 0x3c, 0x3f, 0xb4, 0x3, 0x43, 0xfc, 0xf2, 0xc7, 0x10, 0xdd, 0x33, 0x14, 0xa7, 0x13, 0x2c, 0xe3, 0x2f, 0x92, 0xe8, 0x2a, 0x63, 0xf0, 0xde, 0xa2, 0x3c, 0xe2, 0x7c, 0xcb, 0x77, 0xc1, 0xfb, 0xdc, 0x26, 0x87, 0xf7, 0x5, 0xc5, 0xf6, 0x71, 0xf1, 0x3e, 0xf, 0x13, 0xef, 0x2, 0x4a, 0x2b, 0xa2, 0x7e, 0xca, 0xc3, 0x3b, 0x5c, 0x67, 0x5f, 0x7a, 0xf0, 0xd5, 0x70, 0x7a, 0xf, 0x94, 0xec, 0x42, 0x4, 0xc4, 0xea, 0xf6, 0xb3, 0x8c, 0xcf, 0xf2, 0xf1, 0x77, 0xe0, 0x85, 0xbc, 0x47, 0x36, 0x3d, 0x1f, 0x6f, 0x24, 0xad, 0x1, 0x68, 0xda, 0x25, 0x31, 0x98, 0xc7, 0x25, 0xb4, 0x4c, 0x6d, 0x41, 0xec, 0x3d, 0xeb, 0xea, 0xda, 0xc8, 0x11, 0x50, 0xc3, 0x75, 0x87, 0xc7, 0x35, 0x14, 0xd4, 0xa2, 0x9d, 0xd2, 0x53, 0x21, 0xbb, 0x67, 0x64, 0x15, 0x5f, 0x2c, 0x55, 0xdd, 0xad, 0x8b, 0x39, 0x5e, 0x16, 0xa3, 0x77, 0x17, 0x1d, 0x7c, 0x1e, 0x4a, 0xf9, 0x37, 0xdc, 0xe9, 0xe8, 0x21, 0xfb, 0x4c, 0x8e, 0xee, 0x7, 0xa, 0x1d, 0x5a, 0x6a, 0xed, 0xed, 0x71, 0xfd, 0x1a, 0x3e, 0x83, 0xb8, 0x9c, 0xe7, 0x87, 0x2c, 0xcd, 0x3f, 0xca, 0xc6, 0x3a, 0x49, 0x9b, 0x17, 0xe1, 0x7c, 0x25, 0xbb, 0xf0, 0x0, 0x8d, 0x95, 0xdd, 0xad, 0x7a, 0x16, 0x5, 0xa0, 0x79, 0x55, 0x70, 0xa1, 0x63, 0x61, 0xdc, 0xc4, 0x45, 0xf2, 0x75, 0xcc, 0xe6, 0x72, 0x2, 0xdd, 0x17, 0xb6, 0xc4, 0x1e, 0x8c, 0xef, 0x16, 0xa1, 0xef, 0x2, 0x57, 0x98, 0x57, 0xcc, 0xb, 0x5d, 0x6b, 0xe, 0x16, 0xef, 0x58, 0x65, 0x2e, 0x81, 0x98, 0x6f, 0x6f, 0xcb, 0xf8, 0xdf, 0x24, 0x98, 0xec, 0xe2, 0x5c, 0x3, 0x1e, 0x13, 0x64, 0x36, 0xa3, 0x1e, 0xf, 0xa1, 0x2, 0xa4, 0xcc, 0xaf, 0xcd, 0xc1, 0x7d, 0x60, 0x9d, 0x20, 0xa6, 0xeb, 0x55, 0x2, 0x71, 0x95, 0x78, 0x27, 0xb, 0x45, 0x19, 0x8b, 0xa9, 0xf4, 0xbd, 0xe2, 0xc1, 0x5b, 0xe8, 0x67, 0xda, 0x5f, 0xc9, 0x2e, 0x1c, 0x38, 0xd2, 0x43, 0x63, 0x59, 0x18, 0xc0, 0xef, 0x5a, 0xca, 0xdf, 0x77, 0x65, 0x4c, 0xac, 0x39, 0x1b, 0x60, 0xe9, 0x3c, 0x6a, 0x19, 0x47, 0xf0, 0x7a, 0x50, 0x44, 0xbe, 0x3, 0x6a, 0xb7, 0xee, 0x13, 0x7b, 0x7f, 0xcb, 0x2f, 0xf9, 0xc, 0xe7, 0x85, 0xf4, 0xde, 0x61, 0xd9, 0xb8, 0x33, 0x60, 0xe1, 0x92, 0x7f, 0x2e, 0xa6, 0xeb, 0xd, 0xef, 0xe9, 0x19, 0xe2, 0x14, 0x62, 0xe7, 0xd2, 0x6a, 0x1d, 0x4c, 0xcf, 0x86, 0x97, 0x45, 0x77, 0x63, 0x8c, 0xf7, 0x50, 0x24, 0xe, 0xd, 0xf0, 0x50, 0xfe, 0x10, 0xc6, 0x40, 0x86, 0x72, 0xa6, 0x1d, 0x86, 0x94, 0xec, 0x2, 0x2, 0xfa, 0x40, 0xda, 0x3a, 0x4, 0xa0, 0x8b, 0x40, 0x50, 0xc5, 0xb5, 0xab, 0xf3, 0x60, 0x5e, 0x87, 0x79, 0x90, 0x1, 0x62, 0x15, 0x5d, 0x43, 0x7e, 0xef, 0x28, 0xf0, 0x47, 0xdd, 0x59, 0x5b, 0xcb, 0xb5, 0xc9, 0xb4, 0x20, 0x16, 0x87, 0xf4, 0xde, 0xe1, 0x92, 0x3f, 0xd4, 0xe2, 0x51, 0xb8, 0x47, 0xaa, 0x36, 0x3a, 0x57, 0xf8, 0x7, 0xa4, 0xe4, 0xdf, 0x22, 0xf6, 0x32, 0x9b, 0xbb, 0x62, 0x6a, 0xd1, 0xb9, 0x81, 0x12, 0x29, 0xc4, 0xed, 0x6d, 0xde, 0xaa, 0x36, 0xb4, 0xb8, 0x33, 0x3a, 0x5d, 0x45, 0xc9, 0x2e, 0x18, 0xa0, 0xc0, 0x7b, 0x67, 0xd7, 0x18, 0xfc, 0xe9, 0x63, 0x74, 0x6a, 0xea, 0x84, 0xef, 0xf8, 0xf2, 0xbb, 0x81, 0x98, 0xc6, 0xd9, 0x21, 0xbf, 0x77, 0xd4, 0xc7, 0xf5, 0xf2, 0xb0, 0x20, 0x50, 0x50, 0x1e, 0x66, 0x57, 0x20, 0x36, 0xdd, 0xad, 0x5d, 0x63, 0x70, 0xc7, 0xbf, 0xac, 0x4b, 0x32, 0x30, 0xa0, 0x6d, 0xdc, 0xdd, 0x62, 0x3f, 0x3d, 0x2, 0x9d, 0x5d, 0x2e, 0xcb, 0xa3, 0xb9, 0xc0, 0x5a, 0x3b, 0xd9, 0xe3, 0x1d, 0x41, 0x8f, 0xdd, 0x8c, 0xca, 0x42, 0x94, 0xec, 0x82, 0xc1, 0x11, 0x16, 0x6d, 0x3, 0xe9, 0xb4, 0x1f, 0xeb, 0xd4, 0xd4, 0x19, 0xe8, 0x68, 0x31, 0xc9, 0x32, 0x7e, 0xbc, 0x64, 0xd6, 0xe9, 0x3d, 0x17, 0x40, 0x31, 0xf8, 0x85, 0x96, 0x71, 0xc4, 0x80, 0x90, 0xac, 0x32, 0x25, 0xe4, 0x73, 0xe, 0x2f, 0x85, 0x3b, 0xc6, 0x88, 0x92, 0x90, 0x65, 0xba, 0x1c, 0x3, 0x3, 0x36, 0x70, 0x5b, 0x89, 0x1, 0x9a, 0x7d, 0xa3, 0xc, 0xa2, 0x24, 0xcf, 0xe6, 0x63, 0x2a, 0xdf, 0x21, 0x9b, 0x67, 0xc, 0x39, 0xb, 0x47, 0x29, 0xd9, 0x65, 0x1f, 0x68, 0xf, 0xf6, 0x7f, 0x96, 0x71, 0xd4, 0xc7, 0x6c, 0xd0, 0xe9, 0xa9, 0x33, 0xd0, 0x75, 0xe1, 0x1e, 0xcb, 0x78, 0xcb, 0x4c, 0x16, 0x7c, 0x96, 0x51, 0x42, 0xab, 0x13, 0xd6, 0xa8, 0xad, 0x4f, 0x29, 0xd2, 0xf5, 0x47, 0x86, 0x7c, 0xbe, 0x11, 0x5f, 0xb4, 0x9d, 0x62, 0xff, 0xb6, 0x2e, 0xc5, 0xc0, 0xd0, 0x97, 0x4a, 0x90, 0x1b, 0xd8, 0x3f, 0xd0, 0x6f, 0x74, 0x71, 0x9e, 0xce, 0xb, 0xf6, 0x50, 0xaf, 0x2c, 0x66, 0xd4, 0xac, 0xb6, 0x50, 0xb2, 0xcb, 0x2e, 0x50, 0x8, 0xdd, 0xd1, 0x35, 0x6, 0x6d, 0xe4, 0x39, 0x9d, 0x1a, 0xdf, 0x80, 0x14, 0xf0, 0x19, 0xae, 0xb1, 0x4, 0xc9, 0xae, 0x28, 0x44, 0xf7, 0x9, 0xb2, 0x43, 0x3d, 0xdd, 0x5e, 0x96, 0x6b, 0x48, 0x7c, 0x18, 0x11, 0x81, 0xb9, 0x46, 0x1f, 0x52, 0xdb, 0xb1, 0x2c, 0x9f, 0xeb, 0x32, 0xc, 0x4, 0x50, 0x8e, 0x6e, 0xb7, 0xec, 0xcd, 0x28, 0x33, 0x42, 0xe6, 0xe5, 0x67, 0x79, 0x3e, 0x3f, 0xc8, 0x38, 0xff, 0xc0, 0x32, 0x8e, 0xce, 0x32, 0x43, 0x94, 0xec, 0xb2, 0x87, 0x22, 0xba, 0x18, 0xdc, 0x80, 0xcb, 0x67, 0x92, 0x4e, 0x8f, 0x6f, 0x40, 0x52, 0xc4, 0xf3, 0x96, 0x71, 0x9c, 0x90, 0xbc, 0x7d, 0x88, 0xee, 0x13, 0x75, 0x51, 0x36, 0xf7, 0xe5, 0x3c, 0x8f, 0xf1, 0xb0, 0x92, 0x9d, 0x7b, 0x4e, 0xe1, 0xbe, 0x5c, 0xa1, 0xcb, 0x30, 0x10, 0x60, 0xff, 0xb0, 0x95, 0xd2, 0x8c, 0x15, 0xe7, 0x6c, 0xc7, 0x7c, 0x7, 0x5a, 0xa0, 0x9d, 0x27, 0xf6, 0xc4, 0xa8, 0xf3, 0x3c, 0x14, 0x4b, 0x25, 0xbb, 0x0, 0x80, 0xd4, 0x71, 0x5b, 0xcf, 0x3a, 0xa4, 0xcd, 0xaf, 0xd7, 0xe9, 0xf1, 0x15, 0xb0, 0x94, 0xdd, 0x1d, 0xf5, 0x51, 0xd7, 0xd8, 0x33, 0x44, 0xf7, 0x88, 0x17, 0xaf, 0xb9, 0x6b, 0xc, 0x59, 0x8c, 0xc3, 0x24, 0x98, 0x12, 0x94, 0x20, 0xd0, 0xc4, 0x62, 0x2d, 0xa3, 0x31, 0xc2, 0x6a, 0x5d, 0x82, 0xbe, 0x3, 0xa7, 0xa9, 0xdb, 0xba, 0x83, 0x60, 0x9d, 0x5f, 0xa4, 0x7b, 0xc8, 0x6f, 0x98, 0x4a, 0xeb, 0xd7, 0x8d, 0x46, 0x95, 0x95, 0x95, 0xd7, 0x16, 0x35, 0x68, 0xd0, 0x40, 0xc9, 0x2e, 0x58, 0xa0, 0xb3, 0x84, 0xad, 0x33, 0xf7, 0x7c, 0x51, 0x17, 0x66, 0x10, 0x80, 0x1b, 0xd3, 0x76, 0x34, 0x4b, 0xbf, 0x90, 0xdf, 0x37, 0xda, 0xb7, 0x3d, 0x1d, 0xa1, 0x79, 0xb6, 0x95, 0x4a, 0x20, 0x76, 0x54, 0xa6, 0x4b, 0xd0, 0x77, 0xa0, 0x2b, 0x88, 0xed, 0x0, 0x63, 0xc4, 0xa8, 0x27, 0xea, 0xf4, 0x6c, 0x2, 0x34, 0x86, 0x9e, 0xe6, 0x1e, 0x34, 0x44, 0xd7, 0xef, 0x8d, 0xd1, 0x1f, 0xf4, 0x56, 0xb2, 0xb, 0x16, 0xa7, 0x79, 0x58, 0x75, 0x88, 0xcb, 0xac, 0xd2, 0xe9, 0xf1, 0x1d, 0x65, 0x1e, 0x64, 0xb7, 0xaf, 0x84, 0x2b, 0x6e, 0xe7, 0x26, 0x89, 0x2b, 0x23, 0x46, 0x14, 0x4d, 0x2c, 0x63, 0x68, 0xdd, 0x56, 0xaa, 0x4b, 0xd0, 0x57, 0x20, 0x2e, 0x3a, 0xc0, 0x32, 0x3e, 0x4f, 0xa2, 0x11, 0xdb, 0xcd, 0x36, 0xb0, 0xa7, 0x5e, 0xef, 0x1e, 0x2c, 0x28, 0x28, 0x28, 0x9c, 0x38, 0x6d, 0xe6, 0x25, 0xd3, 0x67, 0xcf, 0x4d, 0x28, 0xd9, 0x5, 0x3, 0xd4, 0x20, 0x5d, 0x61, 0x19, 0x9f, 0x2d, 0xb9, 0xeb, 0xa7, 0x97, 0xf, 0x40, 0x92, 0x84, 0xdb, 0xb5, 0x83, 0x73, 0xc7, 0x3a, 0x87, 0xf4, 0x7e, 0xd1, 0xc8, 0x77, 0x42, 0xc4, 0xe6, 0xd8, 0xd6, 0xa2, 0x6d, 0xb5, 0xf8, 0x7b, 0x26, 0xa3, 0xc2, 0x51, 0x96, 0xb7, 0xb1, 0x8c, 0xa3, 0x65, 0xd9, 0x12, 0x9d, 0x1e, 0x2b, 0x70, 0xca, 0xc3, 0x26, 0x8d, 0xee, 0x13, 0x86, 0xe2, 0x4a, 0x4a, 0x4b, 0xfb, 0xbe, 0xfc, 0xf6, 0x7b, 0x87, 0x54, 0x54, 0x54, 0x28, 0xd9, 0xf9, 0xc, 0x68, 0x10, 0xe8, 0x64, 0x60, 0x3b, 0x1d, 0xfc, 0x1f, 0xe2, 0x7d, 0xa, 0xaf, 0xa2, 0xee, 0x98, 0x60, 0xd9, 0x8, 0x90, 0xcd, 0xb6, 0x4b, 0x8, 0xef, 0x15, 0xa7, 0x17, 0xdc, 0x11, 0x13, 0x92, 0x80, 0x15, 0x52, 0xac, 0xcb, 0xcf, 0x37, 0x6c, 0xee, 0x61, 0xd5, 0xa1, 0x98, 0xfa, 0x5e, 0x9d, 0x1e, 0x4f, 0xa0, 0x51, 0xc7, 0xad, 0x6e, 0x2f, 0x43, 0xe3, 0x46, 0xd, 0x65, 0xfc, 0xa4, 0xa9, 0x83, 0xbf, 0x9e, 0x3a, 0xa3, 0xbe, 0x92, 0x9d, 0xbf, 0x40, 0xab, 0xaa, 0xd3, 0x2d, 0xe3, 0xef, 0x1b, 0x79, 0x56, 0xa7, 0x27, 0x70, 0x2, 0x59, 0x60, 0x51, 0x3e, 0xc2, 0x48, 0x76, 0x6f, 0x89, 0xbf, 0x27, 0x5e, 0x64, 0x53, 0x99, 0x73, 0xa3, 0xbe, 0x2e, 0x3d, 0x5f, 0x81, 0x63, 0x93, 0x6c, 0xb1, 0xd1, 0x7f, 0x4b, 0xb8, 0x8e, 0x78, 0xa, 0x23, 0x50, 0x86, 0x30, 0xae, 0xa, 0xb, 0x96, 0x57, 0xf4, 0x5a, 0xb7, 0x7e, 0x43, 0x77, 0x25, 0x3b, 0xff, 0x80, 0xb6, 0x60, 0x23, 0x2c, 0xf3, 0x88, 0xf4, 0xd8, 0x28, 0x9e, 0xd8, 0x1c, 0x45, 0x4c, 0xb3, 0x8c, 0x6d, 0x1b, 0xb2, 0x7b, 0x44, 0xbd, 0xdd, 0xdd, 0x11, 0x9d, 0x5f, 0x9b, 0x67, 0x2, 0x87, 0xb7, 0x36, 0xd6, 0xa5, 0xe7, 0xb, 0x10, 0x5f, 0x3e, 0xd6, 0x32, 0x8e, 0xc2, 0xf1, 0xa7, 0x74, 0x7a, 0xaa, 0x5, 0xc2, 0x18, 0x55, 0x4a, 0x32, 0x8a, 0x8b, 0x8b, 0x1a, 0xff, 0xe7, 0xc5, 0xd7, 0x8f, 0x57, 0xb2, 0xf3, 0x7, 0x88, 0xd, 0x3d, 0x6c, 0x64, 0x2b, 0xcb, 0x35, 0xb8, 0xab, 0xbe, 0xd4, 0x29, 0xca, 0xa, 0x6c, 0xf5, 0x8b, 0x88, 0xa1, 0x16, 0x86, 0xe8, 0x1e, 0xdf, 0x95, 0xe8, 0xc5, 0xea, 0x92, 0xb0, 0xc5, 0x8b, 0x60, 0x85, 0x34, 0xd5, 0xa5, 0xe7, 0xb, 0xe0, 0x85, 0xe8, 0x65, 0x19, 0x7f, 0x43, 0xbc, 0x4f, 0xec, 0x56, 0x6c, 0x8a, 0x57, 0xdc, 0x73, 0x55, 0x2f, 0x91, 0x90, 0x1f, 0x57, 0xae, 0x3a, 0xe9, 0xb5, 0x51, 0x63, 0x37, 0x53, 0xb2, 0xab, 0x1b, 0x50, 0x3b, 0x5, 0x17, 0xe5, 0x9e, 0x96, 0x6b, 0x1f, 0x89, 0x73, 0x7c, 0xbc, 0x22, 0x3b, 0xb0, 0x6d, 0x8, 0xcd, 0xc4, 0x69, 0xdb, 0x16, 0x6, 0x20, 0xae, 0xf0, 0x5f, 0x89, 0x6e, 0xaa, 0x3e, 0xba, 0xce, 0x2f, 0x75, 0x8d, 0x41, 0x91, 0xe8, 0xa9, 0x4b, 0xcf, 0x17, 0xf4, 0x11, 0x7b, 0xf6, 0xf0, 0x23, 0x3a, 0x35, 0x19, 0x3, 0x2d, 0x4, 0x1f, 0x4b, 0x1d, 0x48, 0x18, 0xb2, 0x2b, 0x29, 0x29, 0x6d, 0x3d, 0x67, 0xfe, 0xb7, 0x7d, 0x95, 0xec, 0x6a, 0x8f, 0x2d, 0xb8, 0x79, 0x1d, 0x6c, 0xb9, 0x86, 0xae, 0xfc, 0xe8, 0xbe, 0x5f, 0xa2, 0xd3, 0x94, 0x35, 0xd8, 0x3a, 0xa1, 0xb7, 0xe, 0x91, 0xe5, 0x1, 0xcb, 0xe8, 0xf5, 0x8, 0xcf, 0xef, 0x4f, 0x1e, 0x73, 0xfc, 0x47, 0x5d, 0x7a, 0xbe, 0xe0, 0x78, 0xcb, 0xd8, 0x78, 0x8a, 0x22, 0x73, 0xe0, 0x1d, 0xdb, 0xa4, 0xd1, 0x41, 0xc3, 0xe2, 0x6, 0x32, 0x7d, 0xf6, 0xdc, 0xa3, 0xd, 0xe1, 0x29, 0xd9, 0xd5, 0x2, 0xb0, 0x18, 0x9e, 0xf7, 0x20, 0x3a, 0x10, 0xdc, 0x99, 0x62, 0x8f, 0x21, 0x29, 0x82, 0xc3, 0x5a, 0x8b, 0x72, 0x1, 0xa2, 0x6b, 0x10, 0x92, 0xfb, 0x1b, 0x49, 0xc2, 0x88, 0x2a, 0x56, 0x79, 0x6c, 0xbc, 0xb0, 0x48, 0x3a, 0xea, 0xf2, 0xab, 0x13, 0x76, 0x12, 0xfb, 0x39, 0x8c, 0x50, 0xa6, 0xb5, 0x8e, 0xb1, 0x66, 0xc0, 0xc9, 0x21, 0x9b, 0x84, 0xa, 0xa, 0xa, 0xa, 0x64, 0xc9, 0xd2, 0xe5, 0xfb, 0x2d, 0x5f, 0xf1, 0x53, 0x1b, 0x25, 0xbb, 0x9a, 0x1, 0xbe, 0xf5, 0xb7, 0x3c, 0x88, 0xe, 0x18, 0x2c, 0xe1, 0xef, 0x60, 0x1f, 0x47, 0xa0, 0x95, 0x92, 0x3b, 0x89, 0x2, 0xae, 0xc3, 0xb0, 0xa4, 0xf8, 0xc7, 0x21, 0x23, 0x77, 0xb4, 0x65, 0x3e, 0xe1, 0xca, 0xbf, 0x5c, 0x97, 0x5f, 0x9d, 0x80, 0x73, 0x2, 0xdd, 0xee, 0x76, 0xf4, 0x7c, 0xd4, 0xa3, 0xc0, 0x6a, 0xe, 0x24, 0xaa, 0x8c, 0x4a, 0x1d, 0xa8, 0xac, 0xac, 0x34, 0x84, 0x57, 0xbf, 0x5d, 0x79, 0x45, 0xc5, 0xee, 0x4a, 0x76, 0x35, 0x73, 0x35, 0xe0, 0x85, 0xef, 0xe1, 0x71, 0x1d, 0x7, 0x73, 0x3e, 0xa0, 0xd3, 0x94, 0x33, 0x94, 0xbb, 0xfe, 0x8d, 0x1a, 0xb0, 0x30, 0x74, 0x51, 0x81, 0xff, 0x64, 0x72, 0xc, 0xe6, 0xf7, 0x1d, 0x23, 0x73, 0x2d, 0xe3, 0x67, 0x88, 0x93, 0x36, 0xaf, 0xa8, 0x1d, 0xd0, 0x71, 0xc9, 0x5d, 0xda, 0x31, 0x4f, 0xc2, 0x7f, 0xbe, 0x61, 0x58, 0xf1, 0x86, 0x5b, 0x29, 0x6b, 0x58, 0x5c, 0x54, 0xef, 0xc9, 0x17, 0x5e, 0xdb, 0x7f, 0x43, 0x49, 0x89, 0x92, 0x5d, 0x35, 0xc0, 0xf9, 0x48, 0x48, 0x19, 0x47, 0x2f, 0xc3, 0x6d, 0x3c, 0x3e, 0x73, 0x83, 0x38, 0x8d, 0x7d, 0x15, 0xb9, 0x83, 0x7b, 0xc3, 0x40, 0x6, 0x56, 0x93, 0x10, 0xdc, 0xd7, 0xa7, 0x12, 0x8f, 0x3, 0x4e, 0x51, 0x4a, 0x73, 0xbf, 0xc7, 0xb5, 0xfb, 0x8c, 0x1c, 0xa6, 0x4b, 0xb0, 0xc6, 0x40, 0x48, 0xa4, 0x8b, 0x65, 0x1c, 0x56, 0x9d, 0x36, 0xd9, 0xae, 0x1d, 0x10, 0x42, 0x9a, 0xed, 0x1e, 0x2c, 0x2d, 0x2b, 0x3b, 0xa0, 0x41, 0x61, 0x61, 0x42, 0xc9, 0xce, 0xe, 0x6c, 0x94, 0x28, 0x14, 0x47, 0x3b, 0xaa, 0x41, 0x46, 0xa, 0x2c, 0x9f, 0x41, 0x76, 0x1d, 0x8e, 0xe3, 0xb8, 0x5a, 0xa7, 0x2b, 0x94, 0xa8, 0xc, 0xc1, 0x3d, 0x6c, 0x8, 0xc9, 0x7d, 0xf8, 0x81, 0xc7, 0xc4, 0x1e, 0x8f, 0xc6, 0xa6, 0x8d, 0x18, 0xd3, 0xa9, 0xba, 0xe4, 0x6a, 0x84, 0x76, 0x46, 0x3a, 0x59, 0xc6, 0xc7, 0xe8, 0xd4, 0xd4, 0x1a, 0x25, 0xee, 0xf9, 0xfb, 0x35, 0x2b, 0xb3, 0xb4, 0xb4, 0xfb, 0xec, 0x79, 0xb, 0x5a, 0x28, 0xd9, 0x6d, 0x8a, 0x86, 0xe2, 0xb4, 0xed, 0x81, 0xcb, 0x12, 0xa9, 0xbf, 0x3b, 0x78, 0x7c, 0xe, 0xda, 0xfa, 0x49, 0xd4, 0x6a, 0x15, 0xa, 0x2f, 0xc4, 0xe9, 0xfd, 0x5a, 0x2e, 0xce, 0xe1, 0x98, 0xb6, 0x12, 0x8a, 0xcd, 0xf8, 0xbe, 0xa0, 0x13, 0x7d, 0x2b, 0x7d, 0xec, 0x19, 0x61, 0x3b, 0xee, 0x37, 0x6e, 0x5, 0x4d, 0xeb, 0x73, 0xeb, 0x86, 0x8f, 0xdd, 0x64, 0xf7, 0xcb, 0x2f, 0x6b, 0x8b, 0x47, 0x8e, 0xf9, 0x68, 0x8f, 0x7a, 0x21, 0xd6, 0x8a, 0xb3, 0x5, 0xbc, 0xa8, 0xbd, 0xc4, 0xe9, 0x63, 0x9, 0x5f, 0xf9, 0xa3, 0x46, 0xf6, 0x49, 0xf3, 0xf9, 0x2f, 0x8c, 0x1c, 0x22, 0x7a, 0x6c, 0x8f, 0x22, 0xff, 0x80, 0xf4, 0xee, 0x6b, 0x3d, 0xae, 0xa1, 0x85, 0xd8, 0x5, 0xdc, 0xac, 0x71, 0x54, 0x4d, 0x6b, 0x9d, 0xae, 0xb4, 0xb0, 0x35, 0x2b, 0x47, 0x7c, 0x57, 0x9b, 0x3e, 0xd7, 0xd, 0xd3, 0xc5, 0x75, 0xb0, 0x2b, 0x8, 0xaf, 0xb8, 0xa8, 0xa8, 0x73, 0x41, 0x9a, 0x85, 0x8b, 0x6b, 0x89, 0x18, 0x4d, 0x42, 0x25, 0xbf, 0x53, 0x63, 0xba, 0xf, 0xba, 0x89, 0x73, 0x1c, 0xc, 0xfe, 0xbe, 0x67, 0x6, 0xdf, 0x15, 0x49, 0x10, 0x77, 0x8a, 0xd3, 0xf4, 0x79, 0xa5, 0xae, 0x29, 0x45, 0x9e, 0x2, 0xd, 0x13, 0xd0, 0x35, 0xe8, 0xaf, 0x69, 0x2c, 0x96, 0x7b, 0x48, 0x78, 0xaf, 0x89, 0xe3, 0xfe, 0x9c, 0x91, 0x67, 0xa, 0x74, 0x26, 0xb0, 0x95, 0x1c, 0xe0, 0x50, 0x52, 0x3d, 0xa0, 0xb5, 0x6e, 0x40, 0xad, 0xf3, 0x42, 0x71, 0xb9, 0x88, 0xcb, 0xca, 0xcb, 0x3d, 0xc9, 0xe, 0xf1, 0x2a, 0xa4, 0xd8, 0xc7, 0xc9, 0xd, 0x53, 0xc9, 0x97, 0x14, 0x49, 0x27, 0x45, 0x52, 0xb3, 0x66, 0xb6, 0x63, 0xc5, 0xc9, 0xb8, 0x1c, 0x9b, 0xa7, 0xb, 0x8, 0xf3, 0x85, 0x62, 0xfa, 0x86, 0x29, 0xf3, 0x57, 0xc9, 0xf5, 0xd1, 0x82, 0x73, 0x89, 0xf8, 0xd4, 0xa, 0xd7, 0x7c, 0xe3, 0xdf, 0xf0, 0xa3, 0xaf, 0xa1, 0x82, 0xa0, 0xc5, 0xf6, 0xd1, 0x47, 0x5, 0x2d, 0xb8, 0xf9, 0x7c, 0x27, 0xbc, 0x8a, 0xf7, 0x3b, 0x51, 0x40, 0x8a, 0xef, 0x19, 0x79, 0xc9, 0xc8, 0x67, 0xa2, 0x99, 0x86, 0x49, 0xd8, 0x1a, 0x3f, 0xcf, 0x54, 0xa5, 0xa0, 0xce, 0x58, 0x4a, 0xc2, 0xfb, 0x8d, 0xec, 0x1a, 0x35, 0x2c, 0x96, 0xcf, 0x27, 0x4c, 0xda, 0xda, 0x8b, 0xec, 0xb6, 0xa6, 0xe4, 0x3b, 0x92, 0xc7, 0xbf, 0x3f, 0x9d, 0x27, 0x1b, 0x35, 0xda, 0x40, 0xc1, 0xad, 0xbb, 0x87, 0x38, 0x6e, 0x96, 0x5d, 0xb8, 0xe, 0x70, 0x7a, 0x72, 0x33, 0x17, 0xd9, 0x55, 0x90, 0xec, 0x52, 0x8b, 0xb7, 0x93, 0x5a, 0x69, 0xc2, 0x45, 0x76, 0x70, 0x2b, 0xa0, 0x38, 0x19, 0x59, 0x7d, 0xc8, 0x34, 0x43, 0x8b, 0xaf, 0x6f, 0x29, 0xd8, 0x34, 0xe7, 0xf0, 0x73, 0x7a, 0xfa, 0x75, 0x74, 0x80, 0x6, 0xe8, 0xe3, 0xf8, 0x7e, 0xf4, 0x48, 0xf3, 0x39, 0x94, 0x81, 0xf4, 0xa7, 0x2c, 0xe3, 0xff, 0x41, 0x5c, 0xe5, 0x4d, 0x5a, 0x7c, 0xf9, 0xda, 0x2c, 0x7d, 0x7b, 0xf, 0xb2, 0x53, 0xd4, 0x1d, 0xdf, 0x18, 0xe9, 0xeb, 0xb2, 0xec, 0x5a, 0x16, 0xe8, 0xbc, 0x54, 0x1, 0x36, 0x5d, 0xf4, 0xb7, 0x7c, 0x88, 0xda, 0x68, 0xdc, 0xdd, 0xa, 0x70, 0xa7, 0xec, 0x26, 0x4e, 0xaf, 0x43, 0xd4, 0xfd, 0x20, 0x29, 0xa7, 0x71, 0x2d, 0xad, 0x7a, 0xf7, 0x19, 0x67, 0xdb, 0x64, 0xf0, 0x7f, 0x4a, 0x49, 0x80, 0x58, 0xa0, 0x13, 0xc5, 0xa9, 0xe7, 0x9a, 0x4c, 0x57, 0xc4, 0x7c, 0xd1, 0x53, 0xde, 0xc3, 0xc, 0xbc, 0x27, 0xbd, 0x8d, 0x5c, 0x22, 0x4e, 0xf7, 0xa0, 0xed, 0xab, 0xf9, 0x3c, 0x92, 0x57, 0xe, 0xa7, 0x5c, 0xc7, 0xe7, 0x8b, 0x42, 0xe0, 0x4f, 0x48, 0x7c, 0x33, 0xe8, 0x5, 0x88, 0x3b, 0xa0, 0x30, 0x36, 0xb1, 0xec, 0x3b, 0x7a, 0xf6, 0xa5, 0x3f, 0xa8, 0x52, 0x13, 0x9a, 0x48, 0x24, 0x36, 0x57, 0xb2, 0xdb, 0xb8, 0xd0, 0x90, 0x56, 0x8d, 0x93, 0x6f, 0xdf, 0xa7, 0xe6, 0x19, 0x57, 0x77, 0x2, 0x48, 0xac, 0x83, 0x91, 0xa3, 0x8d, 0x1c, 0x6a, 0x64, 0x57, 0x5a, 0x6e, 0xb9, 0xb4, 0x26, 0xb7, 0xa4, 0xec, 0x9d, 0x32, 0xe, 0xab, 0x70, 0x1e, 0x5, 0xee, 0xaf, 0xb1, 0x7c, 0x46, 0xeb, 0x74, 0xb9, 0x86, 0xa, 0x78, 0x1e, 0x48, 0xee, 0x42, 0xf9, 0x1, 0xce, 0x76, 0x1c, 0x28, 0x76, 0x17, 0x9d, 0xed, 0xb9, 0xef, 0x44, 0x39, 0x8f, 0x4a, 0xcd, 0xc, 0x3e, 0x63, 0xbc, 0x7f, 0x1f, 0x50, 0xe1, 0x89, 0xa3, 0xb2, 0x89, 0xee, 0x33, 0xee, 0xbd, 0x17, 0xdf, 0x7f, 0xb9, 0x2e, 0x27, 0x5f, 0x30, 0xdf, 0x32, 0xb6, 0x59, 0xbe, 0x91, 0x1d, 0x5c, 0x26, 0x70, 0xa5, 0xe1, 0x40, 0xc4, 0xa5, 0xdc, 0x48, 0x91, 0x3d, 0x86, 0xda, 0x8c, 0xd9, 0x12, 0xef, 0x7e, 0x74, 0xdb, 0xd0, 0xb4, 0x3f, 0xc5, 0xc8, 0xef, 0x24, 0x1c, 0x1d, 0x46, 0xd2, 0x21, 0x49, 0x80, 0x7b, 0x19, 0x39, 0x8e, 0xcf, 0x6, 0x9a, 0xef, 0x48, 0x12, 0xdf, 0x24, 0x5a, 0x82, 0x3f, 0x8b, 0xc6, 0x39, 0xc2, 0x80, 0x39, 0x24, 0xbd, 0xbb, 0x8c, 0x1c, 0x43, 0xe2, 0x43, 0x56, 0x73, 0xb3, 0xc, 0xff, 0x3f, 0x4e, 0xeb, 0xee, 0x41, 0x39, 0x9d, 0xef, 0xea, 0x12, 0x3e, 0xeb, 0xf, 0x69, 0xf9, 0xcf, 0x90, 0xaa, 0x27, 0x30, 0x44, 0x11, 0xb0, 0xea, 0xdc, 0x39, 0x3, 0x3f, 0xc7, 0xe4, 0xbb, 0x85, 0x1, 0xf3, 0xb8, 0x5f, 0xa4, 0x1e, 0xf3, 0xd5, 0xc8, 0x8b, 0xec, 0x5e, 0xa0, 0xa6, 0x16, 0x27, 0xac, 0xe5, 0x82, 0x4a, 0x92, 0xdd, 0xf7, 0x12, 0x9e, 0xfe, 0x89, 0x41, 0x2, 0xae, 0xa5, 0xb3, 0xb9, 0x1, 0xd5, 0xe5, 0x4, 0xef, 0x52, 0x4a, 0x32, 0x16, 0xb7, 0x58, 0xec, 0x49, 0x3e, 0xb8, 0x8e, 0x7e, 0x7f, 0xdb, 0x52, 0x7b, 0xad, 0xc7, 0x3f, 0xeb, 0x4b, 0xdd, 0x12, 0x9e, 0xa, 0x49, 0xd8, 0x7f, 0xa1, 0xac, 0xa0, 0xc5, 0x87, 0x26, 0xc5, 0xd, 0xf5, 0xfd, 0xe, 0xd, 0xf0, 0x7e, 0x3d, 0x46, 0x41, 0xec, 0xb7, 0x27, 0xd7, 0xde, 0x7e, 0x35, 0x7c, 0x4e, 0x50, 0xc6, 0xda, 0x89, 0x53, 0xf7, 0xa, 0x41, 0x36, 0xf4, 0x4c, 0x92, 0xea, 0x44, 0x92, 0xe0, 0x4, 0x5a, 0x44, 0x51, 0x53, 0x76, 0x90, 0xb1, 0x5a, 0x6c, 0xb1, 0x90, 0xb1, 0x1f, 0xe9, 0xa1, 0xb8, 0x75, 0xc7, 0x1a, 0xae, 0x97, 0x54, 0xb2, 0xdb, 0xc2, 0x8b, 0xec, 0xbe, 0x36, 0xf2, 0xa2, 0xce, 0x59, 0xa4, 0x81, 0xc4, 0x12, 0xc4, 0x51, 0x2e, 0x12, 0x27, 0x93, 0x32, 0x53, 0x20, 0x6b, 0x72, 0x1, 0x5d, 0x1, 0xb, 0x68, 0xf1, 0x22, 0x91, 0x64, 0x91, 0x38, 0x6e, 0xa5, 0xe4, 0x42, 0x42, 0x32, 0x49, 0xc2, 0x83, 0xec, 0xea, 0xa5, 0x2c, 0xb4, 0x26, 0x24, 0x3e, 0x64, 0xed, 0xa1, 0xfb, 0xf8, 0x56, 0xdc, 0xc4, 0xf0, 0xc2, 0xa3, 0x16, 0xab, 0x25, 0xc7, 0x8b, 0x6b, 0x61, 0xf9, 0x25, 0x13, 0x1f, 0x14, 0xe1, 0xc4, 0x57, 0x94, 0x7b, 0xb9, 0x1e, 0xf1, 0xac, 0x10, 0xe3, 0xeb, 0x4a, 0xc5, 0xab, 0x26, 0x9e, 0x25, 0x28, 0x4b, 0x9d, 0x29, 0x47, 0x1a, 0xb9, 0x4a, 0x9c, 0xd3, 0x24, 0xd0, 0xe5, 0xe8, 0x7d, 0x12, 0xdf, 0x2c, 0xb1, 0x1f, 0x47, 0x14, 0x36, 0x94, 0x5b, 0x8, 0x1a, 0xdf, 0x6b, 0xae, 0x2e, 0x19, 0x5f, 0x50, 0x29, 0x16, 0xcf, 0x95, 0xd7, 0x62, 0x2b, 0xd6, 0xf9, 0x8a, 0x34, 0xe0, 0xaa, 0x1c, 0x2a, 0xf6, 0x76, 0x44, 0x36, 0x8b, 0xd, 0xee, 0x21, 0xb8, 0x72, 0x3f, 0xe0, 0xb, 0xb7, 0x40, 0x36, 0x2d, 0x23, 0xa8, 0xd, 0x4a, 0x52, 0xb4, 0x2c, 0x2f, 0xf7, 0x4c, 0xa3, 0x14, 0xb2, 0x83, 0xd5, 0x86, 0x44, 0x19, 0x74, 0x28, 0xef, 0x2e, 0x4e, 0x10, 0xbf, 0x50, 0x1f, 0x65, 0x2c, 0x50, 0x41, 0x65, 0xe9, 0x41, 0x4a, 0x4b, 0xae, 0x4d, 0x3c, 0x6f, 0x34, 0x68, 0x40, 0xbd, 0x6b, 0xb3, 0x1a, 0x92, 0x1f, 0x14, 0xaa, 0xe6, 0x2e, 0x85, 0x7, 0xae, 0x4e, 0x14, 0x15, 0x23, 0xe6, 0x87, 0xd3, 0xe1, 0x91, 0xe8, 0x14, 0x95, 0x6c, 0xcf, 0x7a, 0x6a, 0xd5, 0x5, 0xb, 0x4d, 0x50, 0x89, 0x17, 0x60, 0x2d, 0xdd, 0x40, 0xb2, 0xab, 0x6e, 0xf3, 0x41, 0x6, 0x1c, 0x62, 0x21, 0x38, 0x9f, 0x6f, 0xaa, 0xe4, 0xa6, 0xb4, 0x62, 0x2d, 0x89, 0x35, 0x79, 0xda, 0xf8, 0xb, 0xfc, 0x13, 0xee, 0x2e, 0x24, 0x2e, 0xf4, 0x12, 0xc7, 0xd, 0x6, 0xad, 0xb7, 0x8b, 0xe8, 0x29, 0x1d, 0x71, 0xc1, 0xf, 0x14, 0x28, 0x57, 0xf7, 0xd0, 0xea, 0x7, 0xf9, 0xfd, 0x5e, 0x1c, 0x77, 0x27, 0xce, 0xc9, 0xdb, 0x41, 0x6a, 0x7e, 0xda, 0xfc, 0x8e, 0x94, 0x23, 0x8c, 0x5c, 0x2f, 0x4e, 0xec, 0xe6, 0x15, 0x92, 0xdf, 0x67, 0xa2, 0x31, 0x31, 0x25, 0x3b, 0x45, 0x2c, 0x80, 0xce, 0xf3, 0x48, 0xe, 0xe8, 0x50, 0xd, 0xb9, 0x3c, 0x45, 0xf9, 0x44, 0xc2, 0x9b, 0x90, 0x83, 0xf8, 0xc5, 0x24, 0xca, 0x5d, 0xb4, 0x4, 0x40, 0x76, 0xfb, 0xf3, 0x7b, 0x22, 0x6b, 0xb3, 0x81, 0x3e, 0xf2, 0xd8, 0x0, 0xa5, 0x27, 0x5f, 0x50, 0x80, 0x56, 0x24, 0xbb, 0xce, 0xb4, 0xfa, 0x90, 0xe8, 0x2, 0xb7, 0x67, 0x4d, 0x92, 0xaa, 0xa, 0x49, 0x9a, 0x97, 0x51, 0x90, 0xe5, 0x39, 0x8e, 0xa, 0xd5, 0x58, 0x71, 0xb5, 0x94, 0xca, 0x81, 0x15, 0x97, 0xd0, 0xc7, 0xae, 0x64, 0xa7, 0xa8, 0x39, 0xd0, 0xa5, 0xe2, 0x16, 0xf1, 0x76, 0x3f, 0x23, 0xa5, 0x19, 0x8d, 0x7a, 0x11, 0x3b, 0x99, 0x1f, 0x51, 0x4b, 0x60, 0x2c, 0xe5, 0x66, 0x6e, 0x62, 0x28, 0x9d, 0xe8, 0xc7, 0xcd, 0x50, 0xdd, 0x9d, 0xf1, 0xc2, 0x32, 0xca, 0x67, 0x5c, 0xb7, 0x78, 0xbe, 0x6d, 0xa9, 0xe4, 0xe0, 0x79, 0xef, 0x46, 0x4b, 0x70, 0xab, 0x1a, 0xfc, 0xcc, 0x64, 0xbc, 0xef, 0x34, 0x7a, 0x12, 0x90, 0x80, 0xf7, 0x32, 0x7f, 0x47, 0x2e, 0x3c, 0x1a, 0xe5, 0x2e, 0x4f, 0x5, 0xe2, 0x4c, 0x1b, 0xf4, 0xd1, 0xd7, 0xd, 0xe8, 0x83, 0xb9, 0x6e, 0xfd, 0x6, 0x29, 0x2f, 0xdf, 0xe4, 0x88, 0x4b, 0xc4, 0x7b, 0x57, 0x2a, 0xd9, 0x45, 0x1f, 0x68, 0xcc, 0x3b, 0x2c, 0xcd, 0x75, 0x58, 0x71, 0xb7, 0xd2, 0x4a, 0x8a, 0x3, 0xb0, 0x8a, 0xa7, 0x53, 0xf0, 0xbd, 0x10, 0xaf, 0x79, 0x58, 0x9c, 0x18, 0x9f, 0x22, 0x9e, 0x80, 0x7, 0x62, 0xe, 0xe5, 0x19, 0x92, 0xc4, 0x2e, 0x54, 0x7a, 0x50, 0xaa, 0x70, 0x8, 0x2d, 0xff, 0x4c, 0x2d, 0x3f, 0x10, 0x27, 0x4e, 0x70, 0x18, 0x2c, 0x4e, 0x6c, 0xf, 0xeb, 0xe7, 0xd, 0xa9, 0x7a, 0x8, 0x70, 0x50, 0x40, 0xfc, 0x72, 0xbd, 0x4b, 0x49, 0x83, 0xcb, 0xf5, 0x6c, 0x12, 0xa1, 0xa2, 0x96, 0x58, 0x6f, 0x88, 0xee, 0x98, 0xc3, 0xfa, 0x48, 0x87, 0xf6, 0x6d, 0xdd, 0x96, 0xb4, 0x92, 0x5d, 0xc4, 0x81, 0xb8, 0xc4, 0xdf, 0x3c, 0xae, 0xc1, 0x82, 0xbb, 0x9a, 0x64, 0x17, 0x57, 0x20, 0x23, 0x14, 0x7d, 0x17, 0xd7, 0x28, 0xd9, 0xe5, 0x15, 0x10, 0x73, 0x9e, 0x46, 0x81, 0x75, 0x76, 0x8d, 0x38, 0x25, 0x36, 0x7, 0x18, 0xe9, 0x43, 0xcb, 0x6f, 0xb7, 0xc, 0x7e, 0xe, 0x62, 0x82, 0x47, 0x52, 0xe0, 0x35, 0x18, 0x2e, 0x4e, 0xf3, 0xea, 0xc0, 0xf7, 0x64, 0xa9, 0x9a, 0x8d, 0x9, 0xeb, 0x3, 0x9, 0x35, 0x1a, 0x57, 0xac, 0x8b, 0x56, 0x54, 0x56, 0x26, 0x5d, 0x3a, 0x76, 0x90, 0x6e, 0x5d, 0x76, 0xae, 0x72, 0x4d, 0x3, 0xfe, 0xd1, 0xc5, 0xe0, 0x34, 0x44, 0x7, 0x2d, 0xf5, 0xa0, 0x98, 0x13, 0x5d, 0x12, 0x8d, 0x75, 0x1d, 0xeb, 0x1e, 0x27, 0x4e, 0x26, 0xe6, 0x63, 0xe2, 0x24, 0x67, 0x61, 0xed, 0xa3, 0x81, 0x2, 0x8a, 0xdc, 0x67, 0x65, 0x68, 0xb1, 0xf5, 0x12, 0x27, 0x99, 0xe5, 0x79, 0x5a, 0x8c, 0x41, 0x2, 0x8d, 0x8a, 0xdd, 0x2e, 0x4b, 0x94, 0xd2, 0xb4, 0xd7, 0x47, 0x59, 0x37, 0xc0, 0x8d, 0xb9, 0xa1, 0xc4, 0x9e, 0x6b, 0xa7, 0x9b, 0x44, 0x34, 0x81, 0x6c, 0xb3, 0x5b, 0x3c, 0xae, 0xa1, 0xa7, 0xe7, 0x51, 0xe2, 0xb8, 0x45, 0x14, 0x8a, 0x7c, 0x4, 0x9a, 0x46, 0xbc, 0x4b, 0x65, 0x10, 0x47, 0x79, 0x1d, 0x28, 0x4e, 0xa2, 0xd3, 0xe4, 0xea, 0xf6, 0x4a, 0x71, 0xba, 0xf5, 0x20, 0x4b, 0xf9, 0x1c, 0x9, 0x2e, 0x89, 0x4, 0xbb, 0xf1, 0x32, 0xd7, 0x18, 0xea, 0x51, 0xf5, 0xc, 0xc0, 0x0, 0xa1, 0x64, 0x17, 0x3d, 0x20, 0x28, 0x8f, 0x74, 0x6d, 0x5b, 0x37, 0xa, 0x74, 0xa0, 0x3f, 0x57, 0xf4, 0xf4, 0x0, 0x85, 0x22, 0x9, 0xb8, 0xc, 0x51, 0x7a, 0x70, 0x1, 0x2d, 0x3e, 0xb4, 0x31, 0x7b, 0xb3, 0x1a, 0x6b, 0xf, 0xd9, 0xa0, 0xf7, 0x52, 0x82, 0x6a, 0xab, 0xb7, 0xc0, 0x42, 0xb4, 0x3b, 0xe8, 0xe3, 0x52, 0xb2, 0x53, 0x6c, 0x7c, 0x5e, 0xb0, 0xe8, 0x6c, 0x8d, 0x76, 0x9f, 0x14, 0x27, 0xc5, 0x5a, 0x89, 0x4e, 0xa1, 0xb0, 0x3, 0x59, 0xc9, 0xcf, 0x8a, 0xe3, 0x19, 0x41, 0x6c, 0xef, 0x25, 0x49, 0x5f, 0x5f, 0x7a, 0x36, 0x3f, 0x13, 0x44, 0xa3, 0xf4, 0x19, 0x96, 0xb1, 0x1d, 0xf5, 0x11, 0x29, 0xd9, 0x29, 0x1c, 0xa0, 0xd5, 0xd2, 0x9f, 0x2d, 0xe3, 0x68, 0x97, 0x74, 0x8e, 0x4e, 0x8f, 0x42, 0x91, 0x11, 0x2a, 0xf9, 0xce, 0xa0, 0x67, 0x27, 0xea, 0x36, 0xdf, 0x4b, 0xf3, 0x59, 0x5c, 0x7f, 0x24, 0x0, 0xb, 0xcf, 0x46, 0x76, 0x28, 0xa8, 0xd7, 0xee, 0x55, 0x4a, 0x76, 0x79, 0xf, 0xb8, 0x39, 0x2e, 0x97, 0xaa, 0xc5, 0xd4, 0x88, 0x4f, 0xe0, 0x88, 0x14, 0x4d, 0x59, 0x56, 0x28, 0x6a, 0xe, 0x10, 0x1d, 0x8e, 0xba, 0xba, 0x50, 0x9c, 0x5e, 0x9b, 0x36, 0xc0, 0x12, 0xbc, 0x55, 0xfc, 0x8d, 0xe1, 0x81, 0xec, 0xdc, 0xae, 0x54, 0x94, 0x4f, 0x68, 0x56, 0xb1, 0x92, 0x5d, 0xde, 0x3, 0xf1, 0x86, 0x43, 0x2c, 0xe3, 0xc8, 0x38, 0x9b, 0xa6, 0xd3, 0xa3, 0x50, 0xd4, 0x1a, 0x70, 0xfd, 0xdf, 0x69, 0xe4, 0xf, 0xe2, 0x7d, 0x5a, 0x38, 0x14, 0xca, 0xa3, 0x7c, 0xfc, 0x9d, 0x68, 0xaa, 0xbe, 0xd8, 0x35, 0x6, 0x45, 0xb6, 0x87, 0x3e, 0xe, 0x25, 0xbb, 0x7c, 0xc7, 0xf9, 0x96, 0x31, 0xf4, 0xb4, 0x7c, 0x5c, 0xa7, 0x46, 0xa1, 0xf0, 0x5, 0x48, 0x64, 0x39, 0xc6, 0x83, 0xf0, 0xa, 0xa8, 0x58, 0x36, 0xf5, 0xe9, 0x77, 0x2d, 0xf2, 0x50, 0x52, 0x7b, 0xeb, 0x63, 0x50, 0xb2, 0xcb, 0x67, 0xa0, 0x29, 0xf2, 0xfe, 0x96, 0x71, 0x94, 0x19, 0xfc, 0xa4, 0xd3, 0xa3, 0x50, 0xf8, 0x6, 0x10, 0x10, 0x8a, 0xcc, 0x97, 0x58, 0xae, 0xa1, 0xdd, 0xd8, 0xa9, 0x3e, 0xfd, 0x1e, 0xd4, 0x6, 0x7e, 0x65, 0x19, 0x47, 0x1f, 0x50, 0x8d, 0xdb, 0x29, 0xd9, 0xe5, 0x2d, 0x10, 0xb8, 0x6e, 0xe5, 0x1a, 0x43, 0xbf, 0xc8, 0x67, 0x74, 0x6a, 0x14, 0xa, 0xdf, 0x81, 0x42, 0xf4, 0x81, 0x62, 0x8f, 0x83, 0x23, 0x11, 0xcc, 0xaf, 0xc3, 0x82, 0xd1, 0x8c, 0xdd, 0x7d, 0x80, 0x34, 0x7a, 0x7e, 0xee, 0xae, 0x8f, 0x40, 0xc9, 0x2e, 0x5f, 0xb1, 0x97, 0x65, 0xc, 0xd9, 0x64, 0xda, 0x5a, 0x48, 0xa1, 0x8, 0x6, 0xa8, 0xc5, 0x7b, 0xc9, 0x32, 0x8e, 0xee, 0x2a, 0x7, 0xf8, 0xf4, 0x3b, 0xf0, 0xe, 0xbb, 0x3d, 0x33, 0x4d, 0x7c, 0xfc, 0xf9, 0xa, 0x25, 0xbb, 0x48, 0x1, 0x2e, 0x8d, 0xee, 0x96, 0xf1, 0x51, 0x3a, 0x35, 0xa, 0x45, 0xa0, 0xb8, 0x4d, 0x9c, 0xbe, 0xab, 0xa9, 0x40, 0x12, 0x49, 0x2f, 0x9f, 0x7e, 0xfe, 0xcf, 0x46, 0x46, 0x5b, 0xc6, 0x4f, 0x11, 0x3d, 0xc2, 0x4a, 0xc9, 0x2e, 0xf, 0x81, 0xde, 0x8f, 0xee, 0x33, 0xea, 0x90, 0xb2, 0xfc, 0xb5, 0x4e, 0x8d, 0x42, 0x11, 0x28, 0x26, 0x8a, 0xd3, 0x3a, 0xcc, 0x8d, 0x1e, 0x3e, 0x92, 0xd1, 0x2b, 0x96, 0xb1, 0xae, 0xe2, 0x1c, 0x5a, 0xac, 0x50, 0xb2, 0xcb, 0x3b, 0xcb, 0xce, 0x1d, 0xaf, 0x43, 0x5f, 0xbd, 0xe5, 0x3a, 0x35, 0xa, 0x45, 0xe0, 0x78, 0xce, 0x32, 0x86, 0x98, 0xda, 0x66, 0x3e, 0xfd, 0xfc, 0x31, 0x46, 0xe6, 0x5a, 0xc6, 0x4f, 0xd7, 0xa9, 0x57, 0xb2, 0xcb, 0x37, 0xd8, 0x5a, 0x83, 0x81, 0xec, 0x56, 0xeb, 0xd4, 0x28, 0x14, 0x81, 0x3, 0x19, 0x93, 0xa5, 0xae, 0x31, 0x9c, 0x50, 0xb0, 0xb9, 0x4f, 0x3f, 0x1f, 0x59, 0x9f, 0xef, 0x58, 0xc6, 0x51, 0xe8, 0xae, 0xed, 0xc3, 0x94, 0xec, 0xf2, 0xa, 0x8d, 0x3d, 0x9e, 0x5b, 0x42, 0xa7, 0x46, 0xa1, 0x8, 0x1c, 0xe8, 0x50, 0xb4, 0xd0, 0x32, 0xde, 0xce, 0xc7, 0xdf, 0x81, 0xa3, 0xb8, 0xdc, 0x59, 0x99, 0x68, 0xf8, 0xfe, 0x27, 0x9d, 0x7e, 0x25, 0xbb, 0x7c, 0x42, 0xa5, 0x4e, 0x81, 0x42, 0x91, 0x33, 0xac, 0x12, 0x7b, 0xd6, 0xb3, 0x9f, 0xca, 0x26, 0x4a, 0x10, 0x6c, 0xb1, 0x41, 0x9c, 0x60, 0xd2, 0x5c, 0x1f, 0x81, 0x92, 0x5d, 0xbe, 0xa0, 0xc4, 0x83, 0x0, 0x95, 0x4, 0x37, 0xce, 0x45, 0x85, 0x4e, 0x83, 0x22, 0x20, 0xfc, 0x62, 0x64, 0x45, 0xc0, 0xbf, 0x3, 0xeb, 0xf7, 0x7e, 0xcb, 0x78, 0x1b, 0x12, 0x9e, 0x42, 0xc9, 0x2e, 0x2f, 0xb0, 0xc0, 0x32, 0x6, 0xd7, 0x66, 0x91, 0x4e, 0xcd, 0xaf, 0x40, 0x81, 0x6f, 0x2b, 0x9d, 0x6, 0x45, 0xc0, 0xa, 0x55, 0xd0, 0x78, 0xd5, 0xc8, 0x78, 0xcb, 0xf8, 0x59, 0x46, 0xb6, 0xd7, 0x47, 0xa0, 0x64, 0x97, 0xf, 0x40, 0x17, 0x7, 0x77, 0xad, 0xcf, 0xd6, 0xe2, 0x4, 0xc9, 0x15, 0x4e, 0x9a, 0x76, 0x43, 0x9d, 0x6, 0x45, 0x40, 0x48, 0x64, 0x69, 0x9f, 0xc4, 0x3b, 0x7e, 0xa7, 0x65, 0x7c, 0x3b, 0x23, 0x97, 0xea, 0x63, 0x50, 0xb2, 0xcb, 0x7, 0xac, 0x33, 0xf2, 0x8d, 0x6b, 0xac, 0x91, 0x5a, 0x33, 0xbf, 0xe1, 0x8f, 0x3a, 0x5, 0x8a, 0x0, 0x81, 0xc6, 0xcf, 0xb6, 0xb8, 0x59, 0x10, 0xae, 0x73, 0x94, 0x39, 0x4c, 0xb4, 0x8c, 0xe3, 0x10, 0x59, 0x3d, 0xd, 0xa1, 0x2a, 0xba, 0x89, 0x93, 0xad, 0x9e, 0x11, 0x8f, 0x29, 0xd9, 0x45, 0x83, 0xec, 0xe6, 0x58, 0xc6, 0xf7, 0xd4, 0xa9, 0x91, 0xd6, 0xe2, 0x1c, 0xae, 0xa9, 0x50, 0x4, 0x85, 0x26, 0x16, 0xb2, 0x83, 0x5b, 0x73, 0x56, 0x0, 0xbf, 0x6b, 0x83, 0x91, 0x9b, 0xa5, 0xea, 0x39, 0x77, 0x28, 0x60, 0xbf, 0x4b, 0xfc, 0xab, 0xed, 0x8b, 0xcb, 0xbb, 0xff, 0x82, 0x38, 0xe7, 0x2, 0xbe, 0x6b, 0xe4, 0xa, 0xb1, 0x77, 0x9a, 0x52, 0xb2, 0x8b, 0x10, 0xb0, 0xf0, 0xa7, 0x5a, 0xc6, 0xf, 0xd5, 0xa9, 0xf9, 0x35, 0x9e, 0xd1, 0x46, 0xa7, 0x41, 0x11, 0xf0, 0xa6, 0xda, 0xde, 0x35, 0x86, 0xe3, 0x79, 0xd6, 0x4, 0xf4, 0xfb, 0x5e, 0x34, 0x32, 0xd2, 0x32, 0x8e, 0xd3, 0x10, 0x2e, 0xd6, 0xc7, 0xf1, 0x1b, 0xfe, 0x4f, 0x9c, 0xce, 0x52, 0x68, 0xba, 0x81, 0x63, 0x91, 0x6e, 0xe2, 0xbc, 0x15, 0x2b, 0xd9, 0x45, 0x1b, 0x68, 0xd, 0x56, 0x61, 0xb1, 0xec, 0xb6, 0xcd, 0xe3, 0x39, 0xc1, 0xa9, 0xce, 0x7f, 0xd5, 0xa5, 0xa1, 0x8, 0x18, 0xbb, 0x18, 0xa9, 0xef, 0x1a, 0x9b, 0x2c, 0x4e, 0x96, 0x66, 0x10, 0x40, 0x1, 0xfb, 0x95, 0x62, 0x6f, 0x1a, 0x31, 0xd4, 0xc8, 0xef, 0xf4, 0x91, 0xfc, 0x5a, 0x83, 0x78, 0xa5, 0x65, 0x1c, 0x46, 0x41, 0x99, 0x92, 0x5d, 0xb4, 0x31, 0x9e, 0xda, 0x64, 0x2a, 0xd0, 0xc1, 0xe1, 0xc8, 0x3c, 0x9d, 0xf, 0x24, 0xd, 0xdc, 0x2a, 0x5a, 0x83, 0xa4, 0x8, 0x1e, 0xfd, 0x3c, 0x94, 0xcf, 0xd2, 0x0, 0x7f, 0xe7, 0x24, 0x23, 0x77, 0x58, 0xc6, 0xe1, 0xce, 0xbc, 0xcf, 0xc8, 0x36, 0x79, 0xfe, 0x4c, 0xae, 0x15, 0x7b, 0xce, 0xc2, 0xbf, 0x94, 0xec, 0xa2, 0xf, 0x94, 0x1f, 0x7c, 0x62, 0xd9, 0xf0, 0x8f, 0x95, 0xfc, 0xec, 0x8e, 0x7e, 0x89, 0x91, 0xfe, 0xba, 0x2c, 0x14, 0x1, 0x63, 0x4b, 0xb, 0xd9, 0xc1, 0xc3, 0xf2, 0x65, 0x16, 0x7e, 0xf7, 0x70, 0xb1, 0x17, 0x9a, 0xc3, 0xa3, 0x71, 0xaf, 0xe4, 0x6f, 0xe9, 0x11, 0x14, 0xfc, 0xb3, 0x2c, 0xe3, 0x98, 0xab, 0x37, 0xd3, 0xfd, 0x47, 0x25, 0xbb, 0xe8, 0xc0, 0xd6, 0x1d, 0x1d, 0x2e, 0x8d, 0xdf, 0xe7, 0xd9, 0x3c, 0xc0, 0x3f, 0xff, 0x37, 0x5d, 0xe, 0x59, 0xc1, 0xbe, 0x92, 0xdf, 0x49, 0x11, 0xc7, 0x19, 0x69, 0xe6, 0x1a, 0x83, 0x87, 0x65, 0x42, 0x16, 0x7e, 0x37, 0xdc, 0x98, 0x70, 0xd3, 0xff, 0xe4, 0xb1, 0xe1, 0xff, 0x23, 0xf, 0x9f, 0x7, 0x2c, 0x5a, 0x94, 0x67, 0xd4, 0xb7, 0x5c, 0xbb, 0x41, 0xaa, 0x71, 0x2d, 0x2b, 0xd9, 0x45, 0x7, 0xaf, 0x4b, 0xd5, 0xee, 0xe8, 0xb0, 0xea, 0x2e, 0xcf, 0xa3, 0x39, 0xc0, 0x29, 0xce, 0xf, 0x8b, 0x66, 0xa5, 0x65, 0x3, 0x97, 0x51, 0x5b, 0x7e, 0x44, 0x9c, 0x8c, 0xc4, 0x7c, 0x3, 0x12, 0x1d, 0x4e, 0xb7, 0xec, 0x91, 0xef, 0x19, 0x99, 0x9f, 0xa5, 0x7b, 0x80, 0xbb, 0x14, 0x59, 0x86, 0x36, 0xd7, 0x1c, 0x6a, 0xef, 0x86, 0xe6, 0xd1, 0xf3, 0x68, 0xcc, 0xb5, 0xd8, 0xce, 0x72, 0xed, 0x49, 0x23, 0x6f, 0x57, 0xf7, 0x3, 0x94, 0xec, 0xa2, 0x83, 0xd5, 0xdc, 0xe8, 0xdd, 0x38, 0x58, 0x1c, 0x77, 0x66, 0x3e, 0x68, 0x75, 0xcf, 0x48, 0xd5, 0xcc, 0x38, 0x85, 0xbf, 0x80, 0x7b, 0xc, 0x87, 0x96, 0x22, 0x26, 0x5a, 0xc0, 0xb5, 0x95, 0x8f, 0x84, 0x77, 0x2a, 0x2d, 0x5b, 0x37, 0x1e, 0xcf, 0xf2, 0x7d, 0x3c, 0x64, 0xe4, 0x41, 0x8f, 0x6b, 0xd7, 0x1b, 0x39, 0x39, 0x4f, 0x9e, 0x7, 0xd6, 0xa4, 0x2d, 0x3, 0x1d, 0x8a, 0x47, 0x46, 0x9e, 0x1e, 0x25, 0xbb, 0x68, 0xe1, 0x9, 0xa9, 0xda, 0x81, 0x1d, 0xb1, 0xbb, 0x1b, 0xc5, 0x49, 0x91, 0x8e, 0x2b, 0x90, 0x62, 0x8c, 0x9a, 0x9a, 0x6e, 0x96, 0x6b, 0x3f, 0x48, 0xf0, 0xbd, 0xb, 0xf3, 0x9, 0x37, 0x4a, 0xd5, 0x8e, 0x1d, 0xc7, 0x8b, 0xe3, 0x46, 0xdf, 0x2a, 0x4f, 0xe6, 0xa0, 0x2d, 0x89, 0xc4, 0x8d, 0xb7, 0xc4, 0x1e, 0x47, 0xb, 0x12, 0x88, 0x11, 0x5e, 0xe8, 0x61, 0xb9, 0x14, 0x90, 0x8, 0x4f, 0x8d, 0xf1, 0xb3, 0xc0, 0x77, 0x1c, 0x21, 0xf6, 0x1e, 0xa1, 0x65, 0xf4, 0x40, 0x2c, 0x50, 0xb2, 0x8b, 0x1f, 0xbe, 0x13, 0x27, 0x1b, 0xcb, 0x8d, 0x8e, 0x62, 0xcf, 0xde, 0x8a, 0x3, 0xd0, 0x39, 0x2, 0x45, 0xa3, 0xfb, 0x59, 0xae, 0x7d, 0x6b, 0x64, 0xa0, 0xe8, 0x41, 0xb6, 0x7e, 0xc2, 0x6b, 0x4f, 0x38, 0x88, 0xcf, 0x61, 0xf7, 0x98, 0x7f, 0x7f, 0xc4, 0x83, 0x86, 0x5b, 0x88, 0x1d, 0xd9, 0x97, 0x77, 0x49, 0x9a, 0x6c, 0xbf, 0x0, 0x81, 0x66, 0xf0, 0x3, 0xc4, 0x39, 0x5b, 0xcf, 0x8d, 0x62, 0xee, 0x9, 0x43, 0x62, 0xfa, 0x3c, 0x6e, 0x25, 0xd9, 0xdb, 0x30, 0x82, 0x4a, 0x70, 0x9d, 0x16, 0xb6, 0x22, 0xbc, 0xf8, 0xa7, 0xd8, 0x5b, 0xa, 0x9d, 0x98, 0x66, 0x51, 0x44, 0x15, 0x28, 0x1c, 0x7d, 0x5d, 0xec, 0x7, 0xd8, 0x7e, 0x6f, 0xe4, 0x4, 0x23, 0xa3, 0x44, 0x7b, 0x63, 0xfa, 0x9, 0x58, 0x34, 0x5e, 0x59, 0x6d, 0xbb, 0xf2, 0x79, 0x1c, 0x17, 0xe3, 0xef, 0x7f, 0x9d, 0x91, 0x63, 0x2c, 0xe3, 0x2f, 0x89, 0xbd, 0xd8, 0x3b, 0x5b, 0xc0, 0x7a, 0x87, 0xcb, 0x72, 0xb6, 0xe5, 0x1a, 0xd6, 0x3f, 0x3a, 0xaf, 0xdc, 0x46, 0x4b, 0x28, 0xe, 0x80, 0xdb, 0xfc, 0x1, 0x23, 0x17, 0x79, 0x5c, 0x47, 0x48, 0xa3, 0x46, 0x31, 0x4b, 0x25, 0xbb, 0xe8, 0x61, 0x2d, 0x1f, 0xf2, 0x7a, 0xcb, 0x35, 0x64, 0x68, 0x9d, 0x12, 0x93, 0x85, 0xe, 0x52, 0xc7, 0xa1, 0x96, 0x2d, 0x2c, 0xd7, 0x91, 0x11, 0x7, 0xd7, 0xda, 0xe7, 0xa2, 0xc9, 0x2a, 0x7e, 0xe3, 0x27, 0x6e, 0xaa, 0x5e, 0x1b, 0x3b, 0x3a, 0xd6, 0xfc, 0x87, 0xa4, 0x10, 0xb7, 0xb2, 0x97, 0xab, 0x8d, 0x5c, 0xe5, 0x31, 0x27, 0x57, 0x87, 0xe0, 0xfe, 0xa6, 0x19, 0x39, 0xda, 0xc8, 0x4c, 0x8f, 0xeb, 0x97, 0xf2, 0xd9, 0xb4, 0x8c, 0xf8, 0x73, 0xc0, 0x29, 0xf, 0xe8, 0x13, 0x7a, 0xa6, 0xc7, 0x75, 0x9c, 0x10, 0x1, 0xb7, 0x66, 0xb9, 0x92, 0x5d, 0xfc, 0x81, 0xd8, 0xc1, 0x70, 0xcb, 0x38, 0x32, 0x96, 0x90, 0xc4, 0x12, 0x65, 0x1f, 0x3e, 0xdc, 0x65, 0x63, 0x8c, 0x5c, 0x20, 0xf6, 0x14, 0xe3, 0xe9, 0xd4, 0xbc, 0x3f, 0xd2, 0x65, 0x10, 0x28, 0xe1, 0xc1, 0x53, 0xe0, 0xe5, 0x22, 0x42, 0x12, 0xcb, 0x35, 0x46, 0xde, 0x31, 0xb2, 0x47, 0xc, 0xbe, 0x2f, 0xd6, 0xd9, 0x30, 0x23, 0x7f, 0xb7, 0x5c, 0xc3, 0x86, 0x3a, 0xd8, 0xc3, 0xa2, 0xca, 0x5, 0xa6, 0xd2, 0xb2, 0x9e, 0x93, 0xc6, 0x1b, 0x32, 0x8a, 0xef, 0x51, 0x14, 0x81, 0xfa, 0xd9, 0xb1, 0xe2, 0xdd, 0xf3, 0xf6, 0x25, 0x2a, 0x63, 0xab, 0x6a, 0xfa, 0x83, 0x95, 0xec, 0xa2, 0xb, 0xd4, 0x95, 0xd8, 0xdc, 0x4d, 0x85, 0xe2, 0x14, 0x9d, 0xe, 0x8c, 0xd8, 0xf7, 0xd9, 0x41, 0x9c, 0x60, 0x3b, 0x2c, 0xa, 0xaf, 0x86, 0xae, 0x78, 0x89, 0xf, 0x31, 0xf2, 0x85, 0x3e, 0xfe, 0xac, 0x59, 0x78, 0xf7, 0xa6, 0xf9, 0xcc, 0x81, 0xe2, 0x24, 0x4e, 0xa0, 0x75, 0x53, 0x71, 0x44, 0xbf, 0x27, 0xa, 0xc7, 0x91, 0x6d, 0x7a, 0xad, 0xc7, 0xf5, 0x11, 0xf4, 0x30, 0x84, 0x9, 0x53, 0x8c, 0x1c, 0x2e, 0x55, 0x1b, 0x4d, 0x24, 0xd1, 0x8d, 0xd6, 0xcf, 0xb5, 0x12, 0x9d, 0x2c, 0x5a, 0x3c, 0x87, 0xdb, 0xa9, 0x60, 0xb5, 0x4f, 0x63, 0xd1, 0xd, 0x10, 0x7b, 0x2b, 0x35, 0x25, 0xbb, 0x18, 0x63, 0x2d, 0x9, 0xcd, 0x16, 0xb4, 0x6e, 0x44, 0xe2, 0x80, 0xf5, 0xd7, 0x34, 0xe4, 0xdf, 0x63, 0x3b, 0x5a, 0x9, 0xe3, 0xf9, 0x7d, 0xa, 0x3d, 0x3e, 0x87, 0x56, 0x40, 0x28, 0xa6, 0xfd, 0x4e, 0x1f, 0x7d, 0xd6, 0x80, 0x2e, 0xfc, 0xe7, 0x89, 0x13, 0xb, 0x5e, 0xef, 0xf1, 0x99, 0x96, 0x54, 0xbc, 0x90, 0xa5, 0xf8, 0x87, 0x88, 0x7d, 0x3f, 0x28, 0x4e, 0xef, 0xa6, 0xf1, 0x84, 0x20, 0xfb, 0x39, 0xac, 0xb5, 0x6c, 0x38, 0x75, 0x1, 0x2e, 0xcd, 0xb7, 0x3c, 0xae, 0x37, 0xa6, 0xb5, 0x8a, 0xba, 0xc0, 0x7e, 0x21, 0x7e, 0x6, 0xc8, 0x26, 0x47, 0x48, 0x2, 0x9e, 0x1a, 0x74, 0x46, 0xf2, 0x8a, 0xbf, 0xa3, 0x4, 0x3, 0x21, 0x9a, 0x9f, 0x6b, 0xfb, 0x8b, 0x94, 0xec, 0xa2, 0x8d, 0x25, 0xd4, 0xbe, 0x67, 0x78, 0x5c, 0x47, 0x70, 0x17, 0xae, 0xa6, 0x7d, 0x43, 0x78, 0xef, 0xd0, 0xde, 0x90, 0x41, 0x3a, 0x5a, 0x9c, 0xf8, 0xcf, 0x16, 0x69, 0xbe, 0xe3, 0x69, 0x46, 0x6, 0xa5, 0xd9, 0x70, 0x13, 0x96, 0xb1, 0x72, 0x5d, 0x1e, 0xbe, 0x1, 0x5d, 0x2b, 0xe0, 0xd6, 0xfc, 0x36, 0xcd, 0x67, 0x60, 0x8d, 0xc3, 0xc5, 0xf4, 0x9a, 0x84, 0xdf, 0x85, 0xb6, 0x13, 0xad, 0x39, 0x24, 0xdb, 0x78, 0xb9, 0x61, 0x51, 0xa8, 0x7c, 0x8e, 0xe4, 0x26, 0xfb, 0x32, 0x53, 0x2c, 0x13, 0xa7, 0xe, 0xf2, 0x9f, 0x69, 0x3e, 0xb3, 0x37, 0xbf, 0xe7, 0xb3, 0x46, 0x76, 0xb, 0x19, 0xc9, 0xf5, 0x25, 0x59, 0x23, 0x3e, 0xd7, 0xc9, 0xe3, 0x73, 0xc8, 0x44, 0x45, 0x1c, 0xf5, 0xec, 0xba, 0x10, 0x9d, 0x92, 0x5d, 0x3c, 0x80, 0xa0, 0x35, 0x7c, 0xf8, 0x5e, 0x41, 0xeb, 0x7d, 0x49, 0x28, 0xc8, 0xd4, 0xca, 0xf5, 0x29, 0x9, 0x2d, 0x68, 0x9d, 0xe1, 0xc5, 0x43, 0xb3, 0xdb, 0x8b, 0xb9, 0xf1, 0x78, 0xe1, 0x79, 0x71, 0x5a, 0xa2, 0x3d, 0x91, 0xe6, 0x33, 0x78, 0x19, 0x56, 0x5a, 0xc6, 0x5b, 0xeb, 0xd2, 0xf0, 0x15, 0x20, 0x32, 0x34, 0x30, 0x78, 0x35, 0xcd, 0x67, 0x10, 0xfb, 0x3a, 0x42, 0x1c, 0x77, 0x33, 0x48, 0xef, 0xa8, 0x34, 0x4a, 0x4c, 0x2e, 0xb0, 0x97, 0x38, 0x47, 0xc1, 0x7c, 0x26, 0x4e, 0x77, 0x14, 0x2f, 0x2f, 0xc2, 0xfd, 0x46, 0xce, 0x10, 0xe7, 0x2c, 0xc9, 0xb0, 0x63, 0x1d, 0x95, 0x5a, 0x28, 0xbd, 0xdf, 0xa7, 0x79, 0x2e, 0x27, 0xf0, 0x7b, 0xa3, 0x4c, 0x21, 0x97, 0x2d, 0x6, 0x1b, 0x73, 0xf, 0x0, 0x1, 0x23, 0x64, 0x71, 0x68, 0x35, 0xd6, 0x2b, 0xbc, 0x5, 0xa8, 0xfd, 0xac, 0xf3, 0x61, 0xb9, 0x4a, 0x76, 0xf1, 0x0, 0x82, 0xd6, 0x8, 0xec, 0xbe, 0xeb, 0x71, 0x1d, 0x6e, 0xcd, 0x4b, 0xe9, 0xd2, 0x80, 0x6b, 0x63, 0xfb, 0x2c, 0xde, 0x5b, 0x23, 0x2e, 0xe8, 0xbb, 0x49, 0xba, 0xaf, 0xf0, 0xc5, 0x6b, 0x52, 0xcd, 0x22, 0x3f, 0x85, 0x9f, 0x9b, 0x5b, 0xcd, 0xcf, 0x5f, 0xe5, 0x61, 0xd9, 0x9e, 0x2f, 0xd1, 0x8d, 0x23, 0x85, 0x15, 0x48, 0xd2, 0x80, 0xcb, 0x9, 0x6e, 0xcd, 0xe5, 0xd5, 0xec, 0x2b, 0x47, 0x90, 0x20, 0xf1, 0xcc, 0x6f, 0xa1, 0xe6, 0x5e, 0x98, 0x83, 0x7b, 0xde, 0x92, 0x44, 0xf0, 0x3c, 0xd7, 0xff, 0x15, 0x1c, 0xb3, 0x1, 0xb5, 0x74, 0x70, 0xa5, 0x9d, 0x2b, 0xc1, 0x9e, 0x6a, 0x10, 0x4, 0x10, 0x57, 0xec, 0x43, 0x12, 0xf1, 0x42, 0x43, 0x5a, 0x48, 0xa3, 0x68, 0x51, 0xd, 0xc8, 0x92, 0x32, 0x2, 0x2b, 0x6e, 0x47, 0x71, 0xc2, 0x15, 0xc9, 0x3d, 0xa0, 0x7f, 0x35, 0xfc, 0xf3, 0x0, 0x3d, 0x4, 0xef, 0xf8, 0x75, 0x13, 0x5, 0xfa, 0xfe, 0xc6, 0x6, 0x20, 0x85, 0xa3, 0xb9, 0xb1, 0x9c, 0xe7, 0xf1, 0x19, 0x58, 0x51, 0x8, 0x5a, 0x23, 0xd3, 0xf1, 0x65, 0x71, 0x82, 0xc1, 0xe8, 0xbf, 0xb7, 0xc8, 0xc7, 0xfb, 0xd8, 0x8e, 0xb, 0xbb, 0x2b, 0x35, 0xc8, 0x9e, 0x46, 0xb6, 0x16, 0xbb, 0xab, 0xd1, 0xd, 0xb8, 0xc9, 0x1e, 0x13, 0xc7, 0xbd, 0x99, 0xa9, 0xcb, 0xa2, 0x82, 0x1a, 0xab, 0xbb, 0xf6, 0xb, 0x1a, 0xe1, 0x4, 0x6e, 0x2, 0xb7, 0xd1, 0x2, 0x54, 0xd4, 0x1d, 0x98, 0xc7, 0x3b, 0xb9, 0x9, 0x5d, 0x4d, 0x85, 0x24, 0xdd, 0x3e, 0xb2, 0x27, 0x5, 0x4d, 0x8d, 0x91, 0x58, 0x81, 0xa4, 0xaa, 0x4f, 0xc5, 0xc9, 0xaa, 0x5d, 0xe8, 0x87, 0xc6, 0xee, 0x2, 0x36, 0xef, 0x9d, 0x8d, 0x74, 0xe6, 0xe6, 0x7f, 0xa8, 0xd8, 0xcb, 0x57, 0xdc, 0x98, 0x44, 0x12, 0x1f, 0x13, 0x71, 0x2f, 0xcf, 0x91, 0x24, 0xeb, 0x2b, 0xf8, 0x2e, 0xda, 0x80, 0x92, 0x91, 0x7e, 0x94, 0xdb, 0x68, 0x85, 0xc3, 0xca, 0x9a, 0x4c, 0xc5, 0xb1, 0xd2, 0x87, 0x7b, 0x69, 0xce, 0xe7, 0x0, 0xcf, 0x12, 0x62, 0xa3, 0x7, 0x66, 0xa8, 0x7c, 0x8e, 0x13, 0x27, 0x6, 0xfc, 0x8a, 0xdf, 0x93, 0xa3, 0x64, 0x17, 0x2f, 0xfc, 0x42, 0x8b, 0x6, 0xc9, 0x1e, 0x28, 0x32, 0x6d, 0x99, 0x66, 0x43, 0x18, 0x40, 0x99, 0xc5, 0x17, 0x7d, 0xa, 0x17, 0xda, 0x54, 0x6a, 0xed, 0xa5, 0xdc, 0x88, 0x52, 0x49, 0xaa, 0x92, 0x6b, 0xa6, 0x3e, 0xb5, 0x63, 0xf4, 0xab, 0x44, 0xc1, 0x37, 0x32, 0x29, 0xd1, 0xc5, 0x5, 0x35, 0x58, 0xed, 0x49, 0x76, 0x35, 0xf1, 0x1a, 0xfc, 0x40, 0x4d, 0xe, 0x44, 0x37, 0xa7, 0x16, 0xdf, 0x1b, 0xc4, 0x3d, 0x54, 0xaa, 0x9e, 0x6f, 0x7, 0x6b, 0x62, 0x8, 0x7f, 0xee, 0x22, 0x5d, 0x1e, 0xbe, 0x2, 0x64, 0x75, 0x12, 0xe7, 0x16, 0x73, 0xdf, 0xbb, 0x9a, 0xcf, 0x63, 0xa3, 0xeb, 0x2e, 0x1b, 0x33, 0x6d, 0xe7, 0x92, 0xec, 0xe6, 0x71, 0xed, 0xc1, 0xd, 0xbf, 0x98, 0xe3, 0xa5, 0x24, 0xd5, 0x4a, 0xcb, 0xfa, 0x4b, 0x70, 0xd, 0xd6, 0xe3, 0xfa, 0x83, 0x22, 0xd5, 0x81, 0x8a, 0x5c, 0x27, 0x7a, 0x2d, 0x76, 0xa6, 0x47, 0x21, 0x13, 0xac, 0xa6, 0x72, 0xf5, 0x6f, 0xae, 0xc3, 0xa8, 0xa3, 0x92, 0xdf, 0x5, 0xd6, 0xdb, 0x20, 0x12, 0x5f, 0x3a, 0x8b, 0x1a, 0x8a, 0xc0, 0xe9, 0x94, 0xef, 0xf9, 0x5c, 0xe7, 0x90, 0xf8, 0xb0, 0x17, 0x7c, 0x93, 0x66, 0x3f, 0x10, 0xfe, 0xec, 0x62, 0xce, 0x3f, 0xf6, 0x82, 0x3d, 0x38, 0xff, 0x3b, 0x72, 0x4f, 0xc8, 0xd4, 0xbb, 0xf2, 0x1d, 0x15, 0xf5, 0x27, 0xa5, 0x16, 0x65, 0x5, 0x4a, 0x76, 0xf9, 0x8b, 0x47, 0xe8, 0xb2, 0xb9, 0x96, 0x1b, 0x52, 0xba, 0xc5, 0xde, 0x91, 0x72, 0x1c, 0x5f, 0x94, 0xd, 0xdc, 0x68, 0xd0, 0x6f, 0x6e, 0xbd, 0x6b, 0x71, 0x57, 0x90, 0x40, 0x5b, 0x91, 0xf0, 0xa, 0xea, 0xb8, 0x86, 0xd0, 0x9, 0xe6, 0x7f, 0xe2, 0xd4, 0x6, 0xd6, 0x85, 0x8c, 0xf0, 0x42, 0xc2, 0x4d, 0x3a, 0xcc, 0x72, 0x6d, 0xad, 0xd8, 0xeb, 0xf5, 0x14, 0xfe, 0x0, 0x9b, 0xea, 0x68, 0x5a, 0xd2, 0x83, 0xa8, 0xc1, 0x67, 0xe2, 0xae, 0xdc, 0x81, 0x72, 0x60, 0xca, 0x58, 0x69, 0x8a, 0x5, 0x3e, 0x87, 0x7f, 0xb7, 0x79, 0x4, 0x10, 0x7b, 0x6e, 0x9a, 0xb2, 0xfe, 0x6a, 0xf3, 0x7c, 0x57, 0x71, 0xed, 0xdd, 0x29, 0xf6, 0x8e, 0x44, 0x51, 0xc7, 0x6c, 0x7a, 0x70, 0x1e, 0x15, 0x27, 0x36, 0x7e, 0x94, 0x54, 0x9f, 0x99, 0xdd, 0x9a, 0xd2, 0x3b, 0xe5, 0x7d, 0xc7, 0x33, 0x28, 0xe7, 0x7e, 0xb0, 0xc6, 0xf2, 0x3c, 0xda, 0x51, 0xb1, 0x68, 0x50, 0xcb, 0xbd, 0x60, 0x3a, 0x9f, 0x3, 0xde, 0xdf, 0xa5, 0x41, 0x4e, 0x88, 0xd7, 0x42, 0xd1, 0x58, 0x5e, 0xf4, 0x31, 0x9f, 0xda, 0x1a, 0x88, 0xef, 0x12, 0x6e, 0x46, 0xd5, 0x3d, 0xd7, 0x4, 0x35, 0x31, 0x48, 0xd7, 0x80, 0xee, 0xb, 0x2f, 0xc, 0xe2, 0xa, 0x88, 0xa1, 0x8c, 0x35, 0xf2, 0xa3, 0x4f, 0x3f, 0x17, 0x41, 0xec, 0x5d, 0xa5, 0xaa, 0x3b, 0x33, 0x91, 0xa5, 0xf9, 0xae, 0x9f, 0xe1, 0x58, 0x1c, 0x81, 0x4d, 0x11, 0x6e, 0x27, 0x24, 0xaf, 0x1c, 0x60, 0xe4, 0xcf, 0xe2, 0xc4, 0xf6, 0x6a, 0x7a, 0x92, 0x7c, 0x61, 0xa, 0x51, 0x76, 0xb, 0xe8, 0x5e, 0x57, 0x90, 0x0, 0x9e, 0xa1, 0x7, 0x24, 0xee, 0x40, 0x98, 0x2, 0xa5, 0x15, 0x7b, 0xf3, 0xb9, 0x9c, 0x26, 0xde, 0x31, 0x4b, 0x1b, 0xf, 0x24, 0x2d, 0xb3, 0xce, 0x3e, 0xde, 0x13, 0xc8, 0xf3, 0xb, 0x7a, 0x5, 0x5e, 0x15, 0xef, 0xc4, 0x1a, 0xdf, 0xc9, 0x6e, 0x83, 0x54, 0x6d, 0xfb, 0x53, 0x2a, 0x8a, 0xb8, 0xe0, 0x43, 0xa, 0xb4, 0xb5, 0xf3, 0xb8, 0x19, 0x65, 0xbb, 0x7b, 0x3d, 0x5c, 0x53, 0x53, 0x48, 0x72, 0x6f, 0x4a, 0x30, 0x2e, 0x45, 0xac, 0xd9, 0x93, 0xa9, 0x29, 0x9e, 0x23, 0x1b, 0x5d, 0xb8, 0xd, 0x24, 0x3b, 0xf1, 0x3a, 0x5b, 0x46, 0xe8, 0xea, 0x3c, 0x5b, 0x6b, 0xf0, 0xc, 0x7c, 0x40, 0x41, 0x3c, 0xf, 0x9d, 0x6e, 0x8e, 0xa4, 0xe2, 0xd4, 0x36, 0x87, 0xf7, 0x5, 0x8b, 0xe1, 0x4b, 0xae, 0x3d, 0xa4, 0xb9, 0xe7, 0x63, 0xe3, 0xf0, 0x71, 0x94, 0x9b, 0xf9, 0x9e, 0x20, 0x81, 0xa8, 0xbb, 0x64, 0xb7, 0xe, 0x17, 0x7b, 0xc0, 0xc7, 0x46, 0x9e, 0x16, 0xa7, 0x20, 0x3e, 0xab, 0x65, 0x1d, 0x5, 0x34, 0x71, 0xfb, 0xa4, 0x30, 0x78, 0x5, 0x6f, 0x46, 0x11, 0x2f, 0x8c, 0xa1, 0x40, 0x43, 0xeb, 0xcb, 0x4d, 0x68, 0x1f, 0xf1, 0xbf, 0xc3, 0x42, 0x19, 0x37, 0xf9, 0x9, 0xb4, 0xdc, 0xf0, 0xe7, 0x34, 0xc9, 0xce, 0x81, 0x97, 0x50, 0xdc, 0xae, 0xe1, 0x86, 0x96, 0x4c, 0x8c, 0x81, 0x3b, 0x67, 0x59, 0x16, 0x7e, 0xf7, 0x53, 0xd4, 0x84, 0x1b, 0xf3, 0xdf, 0x20, 0xd8, 0x17, 0xf3, 0x78, 0xbd, 0xc1, 0x62, 0x7f, 0x90, 0x82, 0xf8, 0x4d, 0x17, 0x71, 0x12, 0x96, 0xb0, 0xd7, 0x20, 0xbe, 0xd3, 0x28, 0x40, 0xab, 0x7b, 0x3d, 0x15, 0x2a, 0x28, 0x79, 0xa3, 0x53, 0xd6, 0xa0, 0xc2, 0x79, 0x17, 0x86, 0x53, 0x60, 0xed, 0xe1, 0x34, 0x11, 0x94, 0x94, 0xa0, 0xc4, 0x67, 0x73, 0xf1, 0xd7, 0xab, 0xb7, 0x8e, 0x96, 0x25, 0xba, 0xec, 0x7c, 0xca, 0xbf, 0x2f, 0xcb, 0xd5, 0x17, 0x4f, 0x9c, 0x34, 0x68, 0x88, 0x3e, 0xfe, 0xfc, 0x44, 0x3d, 0x5a, 0x3f, 0xfb, 0x8b, 0x73, 0x8c, 0xe, 0x12, 0x4b, 0x5a, 0xd3, 0xc5, 0xd1, 0x9c, 0x1b, 0x11, 0x12, 0x59, 0x8a, 0x52, 0x88, 0xe4, 0x27, 0x8e, 0x63, 0x33, 0x41, 0xcc, 0x63, 0xd, 0xc7, 0x20, 0xf3, 0x68, 0xc1, 0x21, 0xb0, 0x3d, 0x93, 0xd7, 0x2a, 0x74, 0x9a, 0x15, 0x2e, 0x14, 0x72, 0x7d, 0x81, 0xfc, 0x76, 0x11, 0x27, 0x99, 0xa1, 0xd, 0xd7, 0x5d, 0x33, 0x71, 0xd2, 0xe3, 0x37, 0xe7, 0xda, 0x81, 0xe2, 0x90, 0xda, 0xe8, 0xbb, 0x84, 0x6b, 0x2d, 0xf9, 0xf7, 0x1f, 0xb9, 0xce, 0xf0, 0xe7, 0xf, 0x5c, 0x7f, 0xd3, 0x69, 0xc5, 0x2d, 0xe3, 0x9a, 0x55, 0x64, 0x6, 0xcc, 0x39, 0x92, 0x4b, 0xe0, 0x3e, 0xee, 0x44, 0x45, 0xb1, 0x15, 0xc7, 0x93, 0xe5, 0x9, 0x5b, 0xc8, 0xc6, 0xe, 0x27, 0x6b, 0x52, 0x3c, 0x17, 0x2b, 0xb9, 0x1f, 0x2c, 0xa3, 0x15, 0x8d, 0x78, 0x2b, 0xe2, 0xa0, 0x70, 0x13, 0xc3, 0x6d, 0x9c, 0xb5, 0x6, 0xf, 0x6b, 0xd6, 0xae, 0x93, 0xa1, 0x83, 0x6, 0xca, 0x3e, 0x7b, 0x54, 0x8d, 0xc2, 0xfc, 0xbf, 0x0, 0x3, 0x0, 0x73, 0x78, 0xf7, 0xf2, 0x7e, 0x74, 0x3a, 0x48, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)parse_logo2x_png { - return [NSData dataWithBytes:parse_logo2x_png length:sizeof(parse_logo2x_png)]; - } - - static const unsigned char parse_logo3x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x2, 0x99, 0x0, 0x0, 0x0, 0xcc, 0x8, 0x6, 0x0, 0x0, 0x0, 0x38, 0x73, 0xb8, 0x3f, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x41, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x42, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x38, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x39, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0x66, 0x5f, 0x10, 0x71, 0x0, 0x0, 0x22, 0xe8, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x9d, 0x4d, 0x72, 0x1b, 0xbd, 0x11, 0x86, 0x3b, 0x29, 0xef, 0xa3, 0xef, 0x4, 0xdf, 0xf8, 0x4, 0xa6, 0x4f, 0xa0, 0xd1, 0x9, 0x4c, 0xaf, 0x93, 0x2a, 0x53, 0xfb, 0xa4, 0x2c, 0xad, 0x92, 0x9d, 0xc8, 0x5d, 0x76, 0x92, 0x2b, 0x7, 0x10, 0x5d, 0x95, 0xbd, 0xe8, 0x13, 0x68, 0x74, 0x2, 0x53, 0x27, 0xf0, 0xf8, 0x4, 0x56, 0x6e, 0x10, 0x21, 0x2, 0x22, 0x98, 0xa6, 0x8, 0x60, 0x7e, 0x31, 0xc0, 0xf3, 0x54, 0x4d, 0x49, 0x32, 0x29, 0x99, 0x83, 0x1, 0xba, 0xdf, 0x6e, 0x0, 0x8d, 0x3f, 0xfc, 0xf9, 0xaf, 0x7f, 0x3f, 0x12, 0x91, 0x8f, 0x2, 0x7d, 0x70, 0xa7, 0xbf, 0x6e, 0x1f, 0xaf, 0x7, 0x9a, 0x3, 0x0, 0x0, 0x0, 0x52, 0xe0, 0xdf, 0xff, 0xfa, 0xa7, 0xf3, 0x3d, 0xaf, 0x1e, 0xaf, 0xeb, 0xc7, 0x6b, 0x4e, 0x73, 0xd, 0x42, 0xa5, 0x5, 0xe7, 0xbd, 0xfe, 0xba, 0xa5, 0x49, 0x0, 0x0, 0x0, 0x20, 0x45, 0x94, 0xc8, 0x3c, 0xa2, 0x19, 0x6, 0xa3, 0xd4, 0x97, 0x41, 0x65, 0x37, 0x37, 0xf2, 0x94, 0xf1, 0xdc, 0x8, 0xd9, 0x4e, 0x0, 0x0, 0x0, 0x48, 0x84, 0x3f, 0xd2, 0x4, 0xa3, 0xa2, 0x4, 0xfe, 0x42, 0x9e, 0xb2, 0xc9, 0x3f, 0x1e, 0xaf, 0x1b, 0xfd, 0x33, 0x0, 0x0, 0x0, 0x0, 0x22, 0x13, 0x3a, 0x63, 0x6e, 0x9, 0xce, 0xcb, 0xc7, 0xab, 0xa0, 0x49, 0x0, 0x0, 0x0, 0x0, 0x91, 0x9, 0x5d, 0xa1, 0x32, 0x9c, 0x67, 0x8f, 0xd7, 0x37, 0x2d, 0x3a, 0x11, 0x9b, 0x0, 0x0, 0x0, 0x80, 0xc8, 0x84, 0x4e, 0x59, 0x20, 0x36, 0x1, 0x0, 0x0, 0x0, 0x91, 0x9, 0x7d, 0x8b, 0x4d, 0x35, 0x8d, 0xce, 0x66, 0x2d, 0x0, 0x0, 0x0, 0x88, 0x9a, 0x57, 0x8e, 0xd7, 0xab, 0xc7, 0xeb, 0x84, 0x66, 0xa, 0xa6, 0xd4, 0x5f, 0x8b, 0xc7, 0xeb, 0xf7, 0xc7, 0x6b, 0xa6, 0xbf, 0x9f, 0x75, 0xf0, 0xb7, 0xcf, 0xb4, 0xe0, 0x3c, 0x7f, 0xbc, 0xd6, 0x34, 0x35, 0x0, 0x0, 0x0, 0x4c, 0x51, 0x64, 0x42, 0x33, 0xaa, 0x17, 0xfe, 0xfd, 0x48, 0xb, 0xd0, 0x63, 0xfd, 0xb5, 0xa9, 0xe8, 0x54, 0x7f, 0x47, 0x4d, 0x9f, 0x7f, 0x78, 0xbc, 0x4e, 0x1f, 0xaf, 0x9a, 0x26, 0x7, 0x0, 0x0, 0x80, 0x98, 0x60, 0xba, 0x7c, 0x58, 0x4c, 0x5d, 0x4c, 0x95, 0x85, 0x7c, 0xfb, 0x78, 0xbd, 0xd6, 0xdf, 0x37, 0x2d, 0xca, 0xae, 0x84, 0xea, 0x57, 0xa1, 0x98, 0x3e, 0x0, 0x0, 0x0, 0x20, 0x32, 0xc1, 0xa2, 0x7e, 0xbc, 0xae, 0xb4, 0xe0, 0x54, 0xd7, 0xba, 0xc1, 0xdf, 0x50, 0x59, 0x4d, 0x55, 0x5f, 0xf3, 0x92, 0xe6, 0x4, 0x0, 0x0, 0x0, 0x44, 0x26, 0xec, 0xa2, 0xb2, 0x99, 0x6a, 0xea, 0x5b, 0x65, 0x37, 0x97, 0x12, 0x7e, 0xfa, 0x8f, 0x5a, 0xab, 0xf9, 0x55, 0xd8, 0x14, 0x4, 0x0, 0x0, 0x0, 0x88, 0x4c, 0xd8, 0x43, 0xfd, 0x78, 0xad, 0xb4, 0xd8, 0xbc, 0xa, 0xfc, 0x5d, 0xb5, 0xc6, 0xf3, 0x9b, 0x74, 0xb3, 0xc1, 0x8, 0x0, 0x0, 0x0, 0x0, 0x91, 0x99, 0x20, 0x2a, 0x93, 0x79, 0xae, 0xc5, 0x66, 0x15, 0xf0, 0x7b, 0x2a, 0x93, 0x79, 0x2b, 0x3f, 0x9f, 0x91, 0xe, 0x0, 0x0, 0x0, 0x80, 0xc8, 0x84, 0x9f, 0xa8, 0xe5, 0xa9, 0x8c, 0xd4, 0x7b, 0xf1, 0x9f, 0x42, 0x37, 0x42, 0x73, 0x41, 0xf3, 0x1, 0x0, 0x0, 0x0, 0x22, 0x13, 0xe, 0xa1, 0x76, 0xa5, 0xbf, 0xd6, 0x5f, 0x7d, 0xb9, 0x46, 0x68, 0x2, 0x0, 0x0, 0x0, 0x22, 0x13, 0x5c, 0xa8, 0x4c, 0xa6, 0xca, 0x68, 0x9e, 0x23, 0x34, 0x1, 0x0, 0x0, 0x0, 0x91, 0x9, 0x5d, 0x63, 0xca, 0x1e, 0xf9, 0x4e, 0x9f, 0x23, 0x34, 0x1, 0x0, 0x0, 0x0, 0x91, 0x9, 0x5e, 0xa8, 0x92, 0x47, 0xaf, 0xc5, 0xbf, 0x90, 0xbb, 0xaa, 0xa3, 0xc9, 0xae, 0x73, 0x0, 0x0, 0x0, 0x40, 0x64, 0x82, 0x13, 0x95, 0xc9, 0x54, 0x9b, 0x82, 0x7c, 0xd6, 0x69, 0x9a, 0xcd, 0x40, 0x5, 0xcd, 0x6, 0x0, 0x0, 0x0, 0x88, 0x4c, 0xf0, 0x11, 0x9a, 0x6a, 0x9d, 0xe6, 0xda, 0x53, 0x68, 0xde, 0x8, 0x5, 0xdb, 0x1, 0x0, 0x0, 0x0, 0x91, 0x9, 0x9e, 0x9c, 0x7a, 0xa, 0x4d, 0x35, 0x65, 0x7e, 0x4d, 0x73, 0x1, 0x0, 0x0, 0x0, 0x22, 0x13, 0xba, 0x16, 0x9a, 0x73, 0x79, 0x3a, 0x86, 0x12, 0x0, 0x0, 0x0, 0x0, 0x91, 0x9, 0xde, 0x42, 0xb3, 0xf2, 0x78, 0x1f, 0x1b, 0x81, 0x0, 0x0, 0x0, 0x0, 0x91, 0x9, 0x41, 0xa8, 0x35, 0x9a, 0x3e, 0xbb, 0xce, 0xd5, 0xb4, 0x39, 0xeb, 0x33, 0x1, 0x0, 0x0, 0x0, 0x91, 0x9, 0x5e, 0x98, 0xcd, 0x40, 0xae, 0x3a, 0x9a, 0x2a, 0x93, 0x79, 0x41, 0x73, 0x1, 0x0, 0x0, 0x0, 0x22, 0x13, 0x7c, 0xa9, 0xb5, 0xd0, 0x74, 0x71, 0x26, 0x4c, 0x9b, 0x3, 0x0, 0x0, 0x0, 0x22, 0x13, 0x2, 0xa8, 0x1e, 0xaf, 0xa5, 0xc7, 0xfb, 0xd8, 0x6d, 0xe, 0x0, 0x0, 0x0, 0x88, 0x4c, 0x8, 0x62, 0x25, 0xee, 0x8d, 0x40, 0x2a, 0x93, 0xc9, 0x6e, 0x73, 0x0, 0x0, 0x0, 0x40, 0x64, 0x42, 0x10, 0x6a, 0xc7, 0xb9, 0x6b, 0x7d, 0xa6, 0x5a, 0x9b, 0xc9, 0x26, 0x20, 0x0, 0x0, 0x0, 0x40, 0x64, 0x82, 0x37, 0xb5, 0x3c, 0x65, 0x34, 0xf, 0xa1, 0x4, 0xe6, 0x47, 0x9a, 0xa, 0x0, 0x0, 0x0, 0x10, 0x99, 0x10, 0xc2, 0x95, 0xb8, 0xa7, 0xcd, 0x97, 0xc2, 0xd9, 0xe6, 0x0, 0x0, 0x0, 0x80, 0xc8, 0x84, 0x40, 0x4e, 0x3d, 0xde, 0x43, 0x49, 0x23, 0x0, 0x0, 0x0, 0x40, 0x64, 0x42, 0x10, 0xb5, 0x3c, 0x65, 0x34, 0xf, 0xb1, 0x10, 0xb2, 0x99, 0x0, 0x0, 0x0, 0x80, 0xc8, 0x84, 0x40, 0xd4, 0xda, 0x4c, 0xd7, 0x26, 0xa0, 0xf, 0x34, 0x13, 0x0, 0x0, 0x0, 0x20, 0x32, 0x21, 0x4, 0x25, 0x30, 0x5d, 0xd9, 0x4c, 0x55, 0xce, 0x88, 0x9d, 0xe6, 0x0, 0x0, 0x0, 0x80, 0xc8, 0x84, 0x20, 0x3e, 0xc9, 0xe1, 0x6c, 0xa6, 0x12, 0x98, 0x73, 0x9a, 0x9, 0x0, 0x0, 0x0, 0x10, 0x99, 0x10, 0x82, 0x4f, 0x36, 0x93, 0x72, 0x46, 0x0, 0x0, 0x0, 0x80, 0xc8, 0x84, 0x60, 0x3e, 0x39, 0x5e, 0x9f, 0x9, 0x67, 0x9a, 0x3, 0x0, 0x0, 0x0, 0x22, 0x13, 0x2, 0x51, 0xd9, 0xcc, 0xb5, 0xe3, 0x3d, 0x64, 0x33, 0x1, 0x0, 0x0, 0x0, 0x91, 0x9, 0xc1, 0xb8, 0xb2, 0x99, 0xac, 0xcb, 0x4, 0x0, 0x0, 0x0, 0x44, 0x26, 0x4, 0xb3, 0x95, 0xa7, 0xda, 0x99, 0x2f, 0xc1, 0x6, 0x20, 0x0, 0x0, 0x0, 0x40, 0x64, 0x42, 0x23, 0x5c, 0xd9, 0xcc, 0x63, 0x9a, 0x8, 0x0, 0x0, 0x0, 0x10, 0x99, 0x10, 0xca, 0xc6, 0xf1, 0x3a, 0x99, 0x4c, 0x0, 0x0, 0x0, 0x40, 0x64, 0x42, 0x30, 0xb5, 0x3c, 0x4d, 0x9b, 0xbf, 0x44, 0x21, 0x1c, 0x33, 0x9, 0x0, 0x0, 0x0, 0x88, 0x4c, 0x68, 0x0, 0xd9, 0x4c, 0x0, 0x0, 0x0, 0x40, 0x64, 0x42, 0xe7, 0x7c, 0x71, 0xbc, 0xce, 0xba, 0x4c, 0x0, 0x0, 0x0, 0x40, 0x64, 0x42, 0x30, 0x6a, 0xba, 0xfc, 0xd0, 0x31, 0x93, 0x14, 0x65, 0x7, 0x0, 0x0, 0x0, 0x44, 0x26, 0x34, 0x16, 0x9a, 0x2f, 0x51, 0x8, 0xeb, 0x32, 0x1, 0x0, 0x0, 0x0, 0x91, 0x9, 0xd, 0xa8, 0x1c, 0xaf, 0x23, 0x32, 0x1, 0x0, 0x0, 0xc0, 0x9b, 0x57, 0x34, 0x1, 0x68, 0xee, 0x1c, 0xaf, 0x1f, 0x7b, 0x8, 0x51, 0x78, 0x42, 0x15, 0xb1, 0xf7, 0x5d, 0x62, 0x50, 0xcb, 0xe1, 0x82, 0xf8, 0x0, 0xd0, 0x9e, 0xa2, 0x41, 0xa0, 0xec, 0x5a, 0x46, 0x4, 0xf4, 0x23, 0x6c, 0x3b, 0x22, 0x13, 0x2, 0xc, 0xaa, 0x6b, 0x70, 0xc1, 0xaf, 0x42, 0xf2, 0xd8, 0x32, 0x3c, 0x33, 0xfd, 0xef, 0x4d, 0xa9, 0xb4, 0x53, 0x53, 0xcf, 0xe2, 0x5e, 0xdc, 0xe5, 0xa5, 0x0, 0xe0, 0x89, 0x99, 0x1e, 0x83, 0x6f, 0xac, 0xf1, 0x18, 0x12, 0xec, 0xf9, 0xa, 0x4e, 0xf3, 0xf5, 0xce, 0xfa, 0x19, 0xd2, 0xed, 0x4b, 0xc6, 0xa6, 0x97, 0x2d, 0xff, 0x66, 0x65, 0x7d, 0xfd, 0xae, 0x6d, 0x7b, 0x85, 0xc8, 0x84, 0x9c, 0x70, 0x45, 0xec, 0xb9, 0x8b, 0xcc, 0x42, 0x1b, 0x9a, 0x63, 0xfd, 0xb5, 0x8f, 0xf6, 0x30, 0x86, 0x6c, 0xbe, 0xc7, 0x40, 0x55, 0xda, 0xb1, 0x55, 0x74, 0xd5, 0x5e, 0x32, 0x11, 0x29, 0x67, 0xad, 0x8c, 0xe0, 0x4a, 0x45, 0x10, 0x1d, 0x59, 0x63, 0x71, 0xd6, 0x81, 0x0, 0xf0, 0x15, 0x1e, 0xf2, 0xc2, 0xff, 0x55, 0x59, 0x81, 0x61, 0x25, 0x64, 0xaf, 0xa6, 0x86, 0x6d, 0xd7, 0xcb, 0x1e, 0xff, 0x8f, 0x7d, 0xfd, 0xc7, 0xf4, 0x9d, 0x3b, 0x2b, 0xc9, 0x80, 0xc8, 0x84, 0x64, 0xa9, 0xe, 0xc, 0xb2, 0x1c, 0x77, 0x98, 0x2b, 0xb1, 0xf7, 0xae, 0x47, 0x51, 0x19, 0x62, 0xa0, 0x4a, 0x2b, 0x18, 0x50, 0x75, 0x4d, 0xbf, 0x88, 0xbb, 0xbe, 0x29, 0xfc, 0xda, 0x87, 0x6f, 0x65, 0x7f, 0xb6, 0x59, 0x19, 0xfa, 0x93, 0x9, 0x19, 0x79, 0x3b, 0xdb, 0xb2, 0x9b, 0xb1, 0x7b, 0x69, 0xc, 0x9f, 0x3e, 0x5e, 0xeb, 0x9, 0xb, 0x1, 0x33, 0x16, 0x67, 0x11, 0x7e, 0x36, 0xbb, 0xcd, 0x6b, 0x6d, 0x4b, 0x19, 0xa3, 0xf1, 0x6, 0x5d, 0x73, 0x2d, 0x2c, 0xe7, 0x91, 0xf4, 0x9d, 0x33, 0xcb, 0xe, 0x19, 0xfb, 0x9e, 0x44, 0x50, 0x88, 0xc8, 0x4, 0x9b, 0x7, 0x47, 0xf6, 0x20, 0x27, 0x61, 0x39, 0x8f, 0xf4, 0x9e, 0xd5, 0x67, 0x5a, 0xe8, 0xcb, 0x8, 0xce, 0xcf, 0x42, 0x86, 0xd3, 0x87, 0x77, 0x7, 0x9e, 0xe9, 0x4c, 0x5f, 0x55, 0xa4, 0xcf, 0xbc, 0x94, 0xf6, 0x99, 0xbb, 0xf, 0x13, 0x13, 0x99, 0xea, 0x5e, 0x3f, 0x46, 0x3c, 0x16, 0xf, 0x89, 0x18, 0x33, 0x46, 0xc5, 0x12, 0xd, 0x6b, 0x86, 0xe0, 0xa8, 0x63, 0x68, 0xae, 0xfb, 0xd3, 0x2c, 0xf2, 0x3e, 0xaf, 0xae, 0xa5, 0xe, 0x56, 0x54, 0xdf, 0xf9, 0x24, 0x13, 0xce, 0x8e, 0xb3, 0xbb, 0x1c, 0x6c, 0xb6, 0x1e, 0x3, 0x35, 0x45, 0xd4, 0xa0, 0xbe, 0x7e, 0xbc, 0x7e, 0x3c, 0x5e, 0x37, 0xda, 0x39, 0x4c, 0xe1, 0x5e, 0x8d, 0xe0, 0x54, 0xd9, 0xb9, 0xaf, 0x96, 0x53, 0x83, 0x34, 0x9c, 0xe2, 0x42, 0xf7, 0x47, 0xd3, 0x2f, 0xcf, 0x64, 0x98, 0xa9, 0xe1, 0xb1, 0xef, 0x5b, 0xdd, 0xe7, 0x37, 0xab, 0x4f, 0x4f, 0xdd, 0xee, 0xcc, 0x2d, 0xfb, 0x72, 0x2d, 0xd4, 0x1d, 0x1e, 0x92, 0x72, 0xc2, 0x6d, 0x5f, 0x58, 0x63, 0xe1, 0x76, 0xaa, 0xf6, 0x1d, 0x91, 0x9, 0xa1, 0x62, 0x2c, 0x35, 0x27, 0xfe, 0x35, 0x11, 0x67, 0x66, 0x84, 0xf2, 0x37, 0xc4, 0xe6, 0xe4, 0x5, 0xc9, 0x8d, 0xe5, 0x14, 0x73, 0x39, 0xd2, 0xb5, 0xb0, 0xfa, 0xef, 0xa5, 0xa4, 0xb9, 0x6, 0xdc, 0xb6, 0x39, 0xb7, 0x8c, 0xd3, 0x5e, 0x49, 0xad, 0x9d, 0x6d, 0xb1, 0x7c, 0x31, 0x25, 0x5f, 0x85, 0xc8, 0x4, 0x9b, 0xff, 0x64, 0xe2, 0xcc, 0x2e, 0xb5, 0x33, 0x4b, 0x31, 0xab, 0x60, 0x3b, 0x6b, 0xce, 0x9c, 0x9f, 0x8e, 0xf8, 0xb8, 0xd0, 0xcf, 0xec, 0x26, 0xb3, 0xe7, 0x76, 0xb4, 0x13, 0x1c, 0xe5, 0xb2, 0x2c, 0xa7, 0x24, 0x28, 0xec, 0x4d, 0x5c, 0xa6, 0x6a, 0xdb, 0xcd, 0x78, 0x59, 0x5a, 0x41, 0x68, 0xf4, 0xc1, 0x18, 0x6b, 0x32, 0xc1, 0x26, 0xe5, 0x72, 0x1c, 0x66, 0x7d, 0xd7, 0xa2, 0xe7, 0xf6, 0x53, 0xeb, 0x24, 0x2b, 0x4b, 0xb4, 0xbf, 0xd4, 0xa6, 0xc7, 0x3b, 0xe, 0xa7, 0xcb, 0x72, 0x2b, 0x46, 0x6c, 0xde, 0xe8, 0xcf, 0xa2, 0x36, 0x7c, 0xd4, 0x74, 0xef, 0x28, 0x1d, 0x86, 0xea, 0x93, 0x67, 0x19, 0x89, 0x2b, 0x9b, 0x8b, 0x1e, 0xef, 0xdd, 0x8c, 0xc5, 0x7a, 0xa7, 0xef, 0xfb, 0xd4, 0x3, 0xb6, 0x6d, 0xc6, 0x91, 0xf4, 0x7b, 0xe2, 0x99, 0x9, 0xa, 0x55, 0x3f, 0x38, 0x17, 0xd6, 0x56, 0xb7, 0x11, 0x97, 0x17, 0x3d, 0x3e, 0xa7, 0x4a, 0x7e, 0x2e, 0x59, 0x75, 0xc8, 0xb6, 0xab, 0x3e, 0xf3, 0xc6, 0xfa, 0x7e, 0xd6, 0x83, 0x7d, 0x37, 0xf7, 0xac, 0xae, 0xab, 0xc7, 0x6b, 0x25, 0x91, 0x6e, 0x5a, 0x44, 0x64, 0x42, 0xe, 0x19, 0x83, 0xb, 0xe9, 0x7e, 0x2d, 0xdb, 0x56, 0x1b, 0x9e, 0x7b, 0xfd, 0x7d, 0xa8, 0x40, 0xb7, 0x9d, 0xc9, 0x6a, 0xc7, 0xb1, 0x15, 0xf2, 0x5c, 0x52, 0x63, 0xd6, 0xc1, 0xfd, 0x7f, 0xd3, 0xd1, 0xef, 0x8a, 0xee, 0x80, 0xb8, 0x8c, 0x64, 0x4c, 0x76, 0x95, 0x85, 0xa9, 0xad, 0xf1, 0x77, 0x27, 0xed, 0xb, 0x60, 0x57, 0xe, 0x41, 0x68, 0xc6, 0xe6, 0xcc, 0x1a, 0xab, 0x5d, 0x5, 0xc1, 0x6a, 0x6a, 0x77, 0xa3, 0xc5, 0x26, 0x41, 0xe1, 0x38, 0xf6, 0xdd, 0x24, 0x9, 0x4c, 0x7f, 0x6a, 0x5a, 0xda, 0x6c, 0x73, 0xe0, 0x39, 0x17, 0x5a, 0x84, 0x96, 0x1d, 0x7d, 0xee, 0xb3, 0x1d, 0xb1, 0x89, 0xc8, 0x4, 0x98, 0xa0, 0xf1, 0xa9, 0xb5, 0xe1, 0xe8, 0xbb, 0x9e, 0x99, 0x71, 0x98, 0x1b, 0x4b, 0x90, 0xd8, 0xe5, 0x36, 0x9a, 0x8a, 0x92, 0xa5, 0x6e, 0xb, 0xb2, 0x9a, 0xe3, 0xa2, 0x9c, 0xc1, 0xe5, 0x40, 0xe2, 0xb2, 0xda, 0xe9, 0x57, 0xf7, 0x11, 0xdc, 0xff, 0xa5, 0x3c, 0x97, 0x6b, 0x69, 0x23, 0x2, 0xbe, 0xc8, 0xf0, 0x35, 0x29, 0x8d, 0x80, 0xad, 0x76, 0x2, 0x86, 0xb2, 0xc3, 0xa0, 0x70, 0xae, 0xff, 0xce, 0x4a, 0x8b, 0x6, 0x78, 0x39, 0x50, 0xbb, 0x94, 0x6e, 0x66, 0xa6, 0x6c, 0xbb, 0xde, 0xf7, 0x6c, 0x9e, 0x6d, 0xdf, 0x57, 0x96, 0xaf, 0x32, 0xf6, 0x7d, 0xd6, 0xa2, 0x3d, 0x96, 0xba, 0x3d, 0x4e, 0x25, 0xa2, 0x8c, 0x38, 0x22, 0x13, 0x52, 0xa3, 0xd0, 0xe2, 0x72, 0xd1, 0x91, 0x41, 0xf8, 0xac, 0xd, 0xc2, 0x58, 0xc2, 0x4c, 0x39, 0xd5, 0xb5, 0xbe, 0x4e, 0xf5, 0x7d, 0x7d, 0x68, 0x28, 0x9e, 0xd5, 0xef, 0xa8, 0xc5, 0xf0, 0xef, 0x85, 0x69, 0xb9, 0xa1, 0x99, 0x69, 0xa7, 0x58, 0x76, 0xfc, 0x77, 0x6b, 0xcb, 0x71, 0xc5, 0x7c, 0x4a, 0x94, 0x1a, 0x97, 0x37, 0xd, 0x9d, 0x68, 0xcc, 0xb5, 0x61, 0xcd, 0x67, 0xdb, 0x58, 0xf7, 0xa9, 0x9e, 0xb1, 0x29, 0x83, 0xd6, 0x46, 0x40, 0x1d, 0xeb, 0x31, 0xcf, 0xd1, 0x96, 0xbf, 0xa, 0xf1, 0xeb, 0x96, 0x81, 0x9a, 0xdd, 0x9f, 0xc6, 0x6e, 0xdf, 0x4a, 0x5f, 0x2b, 0x79, 0xae, 0xe1, 0xf9, 0xa1, 0xe1, 0x58, 0x51, 0xbf, 0x6f, 0x32, 0xe2, 0x51, 0xf4, 0x1d, 0x36, 0xfe, 0x40, 0x6a, 0x91, 0x6d, 0xdb, 0x85, 0xf4, 0xb5, 0xce, 0x20, 0xbc, 0x7e, 0xbc, 0xde, 0xea, 0xef, 0xeb, 0x88, 0xee, 0x53, 0x89, 0xcd, 0x13, 0xfd, 0xf9, 0xd6, 0xd, 0xdb, 0x49, 0x19, 0xa1, 0x33, 0xba, 0xcc, 0x60, 0x5c, 0x68, 0x71, 0xdf, 0x85, 0xc0, 0x34, 0xfd, 0x53, 0x5, 0xa, 0xbf, 0xe9, 0x7e, 0xf0, 0x5e, 0x3b, 0xa8, 0x4d, 0xa4, 0x2, 0x73, 0xa6, 0xef, 0x3f, 0xd4, 0x69, 0x6e, 0xb5, 0xa3, 0x7c, 0xad, 0xbf, 0x4e, 0xa1, 0xb0, 0x79, 0xad, 0xc7, 0xa5, 0x79, 0x3e, 0xa7, 0x2d, 0x9e, 0xc9, 0xbc, 0x61, 0xbb, 0xa5, 0x6c, 0xe3, 0x6f, 0xf4, 0x75, 0xd4, 0xf0, 0xd9, 0x2c, 0xad, 0x31, 0xb3, 0x8e, 0x50, 0xc0, 0x9b, 0xf1, 0xfd, 0x56, 0x5f, 0x4d, 0x3f, 0xe3, 0x5c, 0x22, 0xd9, 0xfc, 0x89, 0xc8, 0x84, 0xdd, 0x28, 0x68, 0x8a, 0x98, 0x5a, 0x62, 0x6d, 0x84, 0xd3, 0x46, 0x1b, 0x1e, 0x65, 0x80, 0xa6, 0xb0, 0x26, 0xaa, 0xd6, 0xe, 0xec, 0x37, 0x69, 0x36, 0xad, 0x76, 0xa9, 0xb3, 0x1, 0xd0, 0xbf, 0xb8, 0x5a, 0xb6, 0xfc, 0x3b, 0x5b, 0xdd, 0x27, 0x5f, 0x5b, 0xfd, 0x33, 0x86, 0xc, 0x8c, 0xf, 0xb, 0x79, 0xf9, 0x94, 0xa5, 0x97, 0xa8, 0x74, 0x20, 0xd5, 0xc6, 0xc9, 0xc6, 0x80, 0x99, 0x85, 0xb0, 0x5, 0x43, 0x13, 0x9b, 0x7c, 0x2b, 0xe9, 0xd7, 0x47, 0x75, 0x51, 0xb6, 0x10, 0x4d, 0x95, 0x15, 0xac, 0xac, 0x64, 0x3a, 0xcb, 0x85, 0x76, 0x83, 0xac, 0xd0, 0xcf, 0x6d, 0x44, 0x79, 0xdb, 0xac, 0x2f, 0x22, 0x13, 0x3a, 0xe3, 0xf7, 0x9, 0x1a, 0x9e, 0xaf, 0xd2, 0x7c, 0x8d, 0xdb, 0xc3, 0x4e, 0x64, 0x3b, 0xc5, 0x23, 0xe0, 0x1e, 0x2c, 0x1, 0x12, 0xfa, 0xf9, 0x17, 0x8, 0xcd, 0xde, 0xc5, 0xd5, 0xac, 0xc5, 0x73, 0x8d, 0x39, 0xa3, 0x1e, 0xd2, 0xbf, 0x7c, 0xc7, 0xa6, 0x39, 0xda, 0xf3, 0x44, 0xd2, 0x5b, 0xce, 0x61, 0xb, 0x86, 0x50, 0xb1, 0x69, 0x66, 0x1f, 0x16, 0x99, 0x8e, 0xa5, 0x8b, 0x6, 0x81, 0x8a, 0x1d, 0xac, 0x9c, 0xc8, 0xb4, 0x4f, 0x5b, 0x32, 0xc1, 0x4a, 0x53, 0xb1, 0xd9, 0xd6, 0x16, 0x21, 0x32, 0x61, 0xd0, 0xce, 0x1e, 0x3, 0xa6, 0xb6, 0x5e, 0xd3, 0x81, 0x53, 0x5b, 0xc2, 0x6c, 0x4a, 0x91, 0xad, 0xeb, 0x9e, 0xde, 0xeb, 0x2b, 0xe4, 0x7e, 0x10, 0x9a, 0xdd, 0x73, 0xdd, 0x22, 0x7b, 0x60, 0xc4, 0xc8, 0x6f, 0x32, 0xed, 0x5d, 0xc6, 0x21, 0xfd, 0xca, 0x4, 0x4a, 0x6f, 0x25, 0xfd, 0xb5, 0xc2, 0x75, 0xb, 0xb1, 0x79, 0x9d, 0x99, 0xd0, 0x34, 0x99, 0xb8, 0x65, 0x83, 0x36, 0x4e, 0x35, 0x58, 0x31, 0x62, 0xf3, 0x3c, 0xd0, 0x1f, 0xcf, 0xc6, 0xa, 0x54, 0x10, 0x99, 0xb0, 0x3b, 0xa8, 0x5d, 0xe, 0x70, 0x6c, 0xcc, 0xd4, 0x78, 0x93, 0xc1, 0x62, 0x1b, 0xf8, 0x2b, 0x49, 0x73, 0x41, 0xfd, 0x46, 0x3b, 0xeb, 0x90, 0xac, 0x26, 0x42, 0xb3, 0xbb, 0xf1, 0xd3, 0xf4, 0x78, 0xcf, 0x4a, 0x7e, 0x9e, 0x22, 0x9e, 0x32, 0xb3, 0x80, 0xfe, 0xb4, 0x95, 0xe7, 0x4c, 0x6d, 0x4e, 0x18, 0x5b, 0x74, 0x12, 0x68, 0x57, 0x55, 0xbb, 0x96, 0x19, 0xb4, 0x4f, 0xa1, 0x45, 0x51, 0xc8, 0xf4, 0xb8, 0x3d, 0xab, 0x93, 0x7a, 0xb0, 0x72, 0x65, 0xf9, 0xb1, 0x10, 0xfb, 0xa4, 0xfa, 0xcf, 0x25, 0x22, 0x13, 0xc6, 0x74, 0xe, 0xb1, 0x1b, 0x9d, 0x26, 0x53, 0xe3, 0x6d, 0xb2, 0x7, 0x53, 0x44, 0x19, 0xdb, 0xf7, 0xfa, 0x9e, 0x43, 0x84, 0xe6, 0x25, 0x43, 0xa0, 0xd5, 0xd8, 0x69, 0xb2, 0x49, 0xa3, 0x96, 0xb4, 0xb2, 0x2e, 0x66, 0x9c, 0xfa, 0x3a, 0xca, 0xb7, 0x92, 0x77, 0x49, 0xad, 0x4a, 0xb7, 0xc1, 0x32, 0xe0, 0x77, 0x9a, 0xee, 0xd2, 0x4f, 0x79, 0x2c, 0x6d, 0x32, 0xc, 0x56, 0xec, 0x19, 0x80, 0x90, 0x40, 0xe5, 0x4c, 0x6, 0x5c, 0xa7, 0x89, 0xc8, 0x84, 0xdd, 0x48, 0xe7, 0x50, 0xc6, 0x61, 0x2c, 0xce, 0xa4, 0xd9, 0xee, 0x5c, 0xb3, 0xe6, 0x32, 0x85, 0xec, 0x50, 0x13, 0xd6, 0xfa, 0xde, 0x1f, 0x2, 0xda, 0x79, 0xc1, 0x30, 0x68, 0xe4, 0x14, 0x6f, 0x25, 0x6c, 0xe3, 0x5c, 0xaa, 0x59, 0x17, 0xdf, 0x9d, 0xbf, 0xa7, 0xfa, 0xfe, 0xe1, 0x89, 0x95, 0xe, 0x34, 0x7c, 0xc6, 0xea, 0x91, 0x8c, 0xbc, 0x99, 0xa3, 0x47, 0x4a, 0x9, 0x5b, 0x7f, 0x69, 0x2, 0xea, 0xd0, 0x65, 0x42, 0x29, 0xb1, 0x6d, 0x10, 0xa8, 0x2c, 0xa4, 0xd9, 0x3a, 0x57, 0x44, 0x26, 0xb4, 0x76, 0x96, 0x87, 0x6, 0xf3, 0x18, 0xa2, 0xb7, 0x69, 0xf6, 0x72, 0x2d, 0xcf, 0x6b, 0x2e, 0x73, 0xae, 0x33, 0xb7, 0xd, 0x8c, 0x74, 0x53, 0x3d, 0xf3, 0x37, 0x16, 0xa7, 0xa8, 0xd8, 0x48, 0xf8, 0x54, 0xd7, 0x14, 0xb8, 0xf4, 0xec, 0x3b, 0xa7, 0x99, 0x6, 0x7d, 0x2e, 0x2a, 0xdd, 0x2f, 0x7c, 0xc6, 0xaa, 0x6a, 0xe7, 0x8b, 0xc4, 0xee, 0x3f, 0x54, 0xf8, 0x54, 0x12, 0xbe, 0x34, 0x28, 0xf5, 0x40, 0x25, 0x64, 0x66, 0x60, 0x36, 0x84, 0xd0, 0x44, 0x64, 0x82, 0x8f, 0xc0, 0x14, 0x19, 0x27, 0x93, 0xb9, 0x90, 0xf0, 0xec, 0xa5, 0x31, 0x3c, 0x14, 0x31, 0x7e, 0x46, 0x19, 0x9d, 0x90, 0xb5, 0x5f, 0x4d, 0xeb, 0xd0, 0xe5, 0x46, 0xa8, 0x53, 0xb4, 0xb3, 0x2e, 0xa9, 0xf5, 0x4d, 0x35, 0x4e, 0x7d, 0x4a, 0x88, 0x21, 0x30, 0xdd, 0x7d, 0xc4, 0x77, 0xac, 0x9e, 0x49, 0x3a, 0xeb, 0x33, 0x17, 0x12, 0xb6, 0x2e, 0xfc, 0x4a, 0xb7, 0x53, 0x4d, 0x97, 0xd9, 0x9b, 0x54, 0xf0, 0x1d, 0x63, 0xbd, 0xb, 0x4d, 0x44, 0x26, 0x18, 0xa, 0xc7, 0xeb, 0xdf, 0x47, 0x32, 0xb8, 0x21, 0xef, 0x6d, 0xb2, 0x90, 0x1e, 0xe7, 0xb5, 0xbf, 0x2f, 0xb0, 0x11, 0xe8, 0x30, 0xf3, 0xc0, 0x36, 0x52, 0xc1, 0x4f, 0x93, 0x32, 0x53, 0x53, 0xc1, 0x67, 0x3d, 0x2f, 0x2, 0xb3, 0xfb, 0xb1, 0x9a, 0xc2, 0x38, 0xd, 0x11, 0x98, 0x26, 0x50, 0x63, 0xa9, 0x85, 0xdb, 0x17, 0xfa, 0xb6, 0x51, 0xaf, 0x42, 0x13, 0x91, 0x9, 0x86, 0x37, 0x1e, 0x11, 0xd2, 0xd0, 0xac, 0x3d, 0x9d, 0xf2, 0x5a, 0xf2, 0xd9, 0xd4, 0x33, 0x94, 0xf3, 0x9a, 0x4b, 0x4, 0xa7, 0x45, 0x44, 0x4a, 0xc8, 0xee, 0x69, 0xc5, 0x52, 0xfc, 0xd7, 0xdb, 0x4d, 0x91, 0x33, 0x71, 0xcf, 0x84, 0x5c, 0x31, 0x3e, 0x7b, 0x19, 0xab, 0x85, 0x4c, 0x7b, 0xd6, 0x21, 0x64, 0x2c, 0x99, 0x36, 0x61, 0x7a, 0xdc, 0xf, 0x73, 0x32, 0xd8, 0x83, 0xe7, 0x73, 0xe8, 0x45, 0x68, 0x22, 0x32, 0xc1, 0x50, 0x46, 0x28, 0x32, 0x45, 0xe, 0x17, 0x9f, 0xad, 0xb5, 0xd1, 0x61, 0x6a, 0x3c, 0x3c, 0xca, 0xf5, 0x69, 0xaf, 0x54, 0x37, 0x17, 0xb4, 0x75, 0x8a, 0xbe, 0xc6, 0xd8, 0x64, 0x5d, 0x56, 0x9, 0xb7, 0x87, 0x6a, 0x7, 0xd7, 0xda, 0x40, 0x73, 0x62, 0x11, 0x74, 0x3f, 0x56, 0x97, 0x13, 0xb6, 0x7d, 0x66, 0x2c, 0xf9, 0xb0, 0x15, 0xff, 0xf5, 0xaa, 0xf0, 0xcc, 0x26, 0x20, 0xc0, 0xed, 0x45, 0x68, 0x22, 0x32, 0xc1, 0x47, 0x64, 0xd6, 0x23, 0x1a, 0x32, 0xe3, 0xa8, 0xf7, 0x45, 0x69, 0x39, 0x14, 0x6f, 0xee, 0x83, 0xed, 0xb, 0x6d, 0xba, 0x4f, 0x40, 0x50, 0xd6, 0xe8, 0x99, 0x22, 0x50, 0x60, 0xe6, 0x90, 0x75, 0xf9, 0xe8, 0xd1, 0x1e, 0xa7, 0x74, 0x9d, 0x56, 0x63, 0xf5, 0x7c, 0x4f, 0xdf, 0x32, 0x75, 0x12, 0x57, 0x19, 0x8c, 0xa5, 0xad, 0xa4, 0x3d, 0x13, 0x30, 0x44, 0x1f, 0xf2, 0x5d, 0xbf, 0x1a, 0x22, 0xfc, 0x11, 0x99, 0x10, 0x14, 0x51, 0xba, 0x3a, 0x69, 0x2c, 0x86, 0xd6, 0x5e, 0x93, 0x83, 0xd1, 0x69, 0x8e, 0x12, 0xe7, 0x4b, 0x8f, 0xf7, 0x2d, 0x84, 0x73, 0x93, 0x8d, 0xe0, 0xf6, 0xdd, 0x10, 0x95, 0x53, 0xd6, 0x65, 0xe1, 0x78, 0x7d, 0x29, 0x64, 0x9f, 0xda, 0xb2, 0xd6, 0xe3, 0xb5, 0x96, 0xe7, 0x63, 0x70, 0xa7, 0x7c, 0x1a, 0x54, 0xe8, 0x58, 0x42, 0x60, 0x76, 0xe3, 0x43, 0x7d, 0xab, 0x8c, 0x84, 0x2e, 0x7, 0x3a, 0xc8, 0x2b, 0xda, 0x1e, 0x1e, 0x79, 0xe7, 0x78, 0xfd, 0x2e, 0x82, 0xcf, 0x78, 0x65, 0x19, 0x5c, 0xc, 0x4e, 0x37, 0xac, 0xb4, 0x80, 0x74, 0x89, 0xc8, 0xb, 0x21, 0x63, 0xec, 0x5b, 0xda, 0x29, 0x27, 0xa7, 0xa8, 0x4, 0x66, 0x71, 0xe0, 0x75, 0xd5, 0x6, 0x9f, 0x18, 0x66, 0x9d, 0x90, 0x52, 0x45, 0x82, 0x4b, 0xc6, 0xd2, 0x28, 0x98, 0xd9, 0x95, 0xaf, 0xe2, 0xde, 0xe8, 0xab, 0xc6, 0xf6, 0xbd, 0x74, 0x50, 0x66, 0x8d, 0x4c, 0x26, 0x28, 0x5c, 0x1b, 0x3c, 0x62, 0x11, 0x18, 0xa9, 0x1e, 0x5, 0x39, 0x26, 0x3e, 0xeb, 0x33, 0x7d, 0x84, 0x68, 0xca, 0x5c, 0x88, 0xdf, 0x26, 0xa8, 0xdc, 0x9c, 0xe2, 0x3b, 0xc6, 0xeb, 0xa0, 0x2, 0x21, 0x5, 0x7c, 0xf, 0x7c, 0x40, 0x60, 0xf6, 0xd7, 0x8f, 0x7c, 0x3, 0x96, 0xcb, 0x2e, 0xec, 0x3e, 0x22, 0x13, 0x8e, 0xc4, 0x5d, 0x84, 0x9d, 0xe9, 0xae, 0x74, 0xa9, 0xc5, 0x6f, 0x5d, 0xd7, 0x45, 0xa6, 0xed, 0xa3, 0x8c, 0xec, 0x12, 0xa7, 0xb8, 0xd7, 0x6e, 0xcc, 0x1d, 0x76, 0x83, 0x2c, 0x26, 0xec, 0x8e, 0x25, 0x9f, 0x35, 0xde, 0xf, 0x8, 0xcc, 0x5e, 0x9, 0xb1, 0x55, 0x6a, 0x59, 0x43, 0x81, 0xc8, 0x84, 0x36, 0xb8, 0x32, 0x34, 0x94, 0x8b, 0x48, 0x9f, 0x2b, 0x8f, 0x40, 0xa2, 0x94, 0xfc, 0xb2, 0x99, 0x66, 0xed, 0x18, 0x4e, 0x31, 0xdc, 0x6e, 0xac, 0x11, 0x9, 0xb0, 0x33, 0x96, 0xae, 0x19, 0x4b, 0x51, 0x9, 0x4d, 0xdf, 0xcd, 0x9f, 0x37, 0x6d, 0xfe, 0x23, 0x44, 0x26, 0x4c, 0x61, 0x3d, 0x26, 0xf4, 0x8f, 0x4f, 0x89, 0x99, 0x8f, 0x99, 0xb5, 0x89, 0xcf, 0xe6, 0x84, 0x5c, 0x9d, 0xa2, 0xcb, 0x6e, 0x7c, 0x66, 0x48, 0x81, 0x85, 0x12, 0x98, 0x85, 0xc7, 0xfb, 0x4e, 0x85, 0x99, 0xb3, 0xa1, 0xa8, 0xc4, 0xaf, 0xf2, 0x43, 0xab, 0x23, 0x4c, 0x11, 0x99, 0x79, 0xa3, 0x6, 0x3d, 0x99, 0x4c, 0x30, 0x6, 0xa7, 0x72, 0xbc, 0x67, 0x2e, 0x2d, 0xa7, 0x4e, 0x26, 0x84, 0xef, 0x91, 0x7d, 0xb9, 0x3a, 0xc5, 0x43, 0x6d, 0x53, 0x23, 0x14, 0x60, 0xc7, 0x6e, 0xf8, 0xac, 0x69, 0x5e, 0xe2, 0x6f, 0x6, 0x67, 0x2d, 0x7e, 0x87, 0x24, 0x2c, 0xa5, 0xe1, 0x4c, 0x16, 0x22, 0x93, 0xc1, 0xef, 0x12, 0x98, 0x4c, 0x5b, 0xe4, 0x83, 0xcf, 0xda, 0xcc, 0xf, 0x99, 0x4, 0x5f, 0x3e, 0x91, 0x7b, 0xae, 0x4e, 0x51, 0x65, 0x36, 0x8e, 0x8, 0x4c, 0xc1, 0x3, 0xdf, 0x69, 0xf2, 0x8d, 0xa4, 0x7d, 0x68, 0x41, 0xcc, 0x9c, 0x8b, 0xff, 0x11, 0xa6, 0xc1, 0x85, 0xda, 0x11, 0x99, 0x79, 0xe3, 0x9a, 0xfe, 0xfc, 0x42, 0x13, 0x65, 0x45, 0x25, 0xee, 0x6c, 0xe6, 0x22, 0x83, 0x76, 0xf0, 0x31, 0xa6, 0x39, 0x3b, 0xc5, 0xd2, 0xf1, 0x3a, 0x4b, 0x6c, 0xc0, 0x70, 0x29, 0x7e, 0x4b, 0x4e, 0x28, 0xd8, 0x3f, 0x1e, 0xbe, 0xa7, 0xc0, 0x15, 0xd2, 0x60, 0xc9, 0x14, 0x22, 0x33, 0x5f, 0x5c, 0x53, 0x9f, 0xaa, 0xc3, 0xad, 0x69, 0xa6, 0xec, 0x70, 0x9, 0xa7, 0x42, 0xd2, 0xde, 0x0, 0x34, 0xf7, 0xb8, 0xbf, 0xdc, 0x9d, 0xe2, 0xef, 0x1e, 0xc1, 0xa, 0x40, 0xe9, 0x19, 0x94, 0xa6, 0x54, 0x3, 0x74, 0xaa, 0x6c, 0x3d, 0x83, 0xe6, 0xa5, 0xf8, 0xd5, 0x38, 0x45, 0x64, 0x82, 0x33, 0x22, 0x61, 0xca, 0x2b, 0x4f, 0x94, 0x40, 0xa8, 0x1d, 0xef, 0x49, 0x75, 0xca, 0xdc, 0x77, 0x6a, 0x2f, 0x77, 0xa7, 0xe8, 0x2a, 0x79, 0x86, 0x60, 0x0, 0xf1, 0x1c, 0x4b, 0x57, 0x4, 0x25, 0xd1, 0x70, 0xe5, 0xe9, 0xf7, 0x83, 0x8e, 0x1a, 0x46, 0x64, 0xe6, 0x1b, 0x61, 0x96, 0x8e, 0xf7, 0x50, 0xe3, 0x2e, 0x5f, 0x3e, 0x79, 0xf4, 0x9f, 0x54, 0x3, 0x2f, 0xd7, 0xd4, 0x1e, 0x4e, 0xf1, 0xf0, 0xc, 0x8, 0x1b, 0x7e, 0x40, 0x71, 0x26, 0xee, 0x4d, 0x82, 0x2a, 0x98, 0x65, 0x1d, 0x66, 0x5c, 0xf8, 0x1e, 0xce, 0xb1, 0x40, 0x64, 0xc2, 0x21, 0x5c, 0x9b, 0x1a, 0x2a, 0x9c, 0x45, 0xd6, 0xb8, 0xa2, 0x59, 0xe5, 0x3c, 0x66, 0x9, 0xde, 0xb7, 0x4b, 0x3c, 0xe3, 0x14, 0x11, 0x99, 0xe0, 0xe6, 0x48, 0xfc, 0x36, 0xce, 0xf9, 0x8, 0x1a, 0x18, 0x96, 0x7, 0xf1, 0x3f, 0x9c, 0xc3, 0x6b, 0x13, 0x10, 0x22, 0x33, 0x3f, 0x4a, 0xf, 0x67, 0x4a, 0x8d, 0xbb, 0xbc, 0xa9, 0x3d, 0x84, 0xe6, 0xbb, 0xc, 0xdb, 0xe5, 0x1c, 0xa7, 0xe8, 0xb5, 0x89, 0x3, 0xf2, 0xc6, 0x67, 0x46, 0x40, 0xd9, 0x97, 0x8a, 0xa6, 0x8a, 0x12, 0x9f, 0xd9, 0x9a, 0x42, 0x3c, 0x37, 0x1, 0x21, 0x32, 0xf3, 0xc3, 0x15, 0x61, 0x2a, 0x81, 0xb1, 0xa6, 0x99, 0xb2, 0xc7, 0x55, 0x59, 0xa0, 0xcc, 0xac, 0x3d, 0x2a, 0x61, 0x9d, 0xb2, 0x62, 0x46, 0x13, 0x80, 0x23, 0x8, 0x39, 0xf3, 0x8, 0x44, 0xce, 0x69, 0xaa, 0xa8, 0xf1, 0xc9, 0x66, 0x9e, 0xfd, 0xe5, 0x6f, 0xff, 0x70, 0x66, 0x33, 0x11, 0x99, 0x79, 0xe1, 0xb3, 0x73, 0x96, 0xe9, 0x40, 0x10, 0x8f, 0x48, 0x36, 0x37, 0x91, 0x49, 0x89, 0x15, 0x3f, 0xbe, 0xd3, 0x4, 0x59, 0xe3, 0xbb, 0xae, 0xb9, 0xa6, 0xa9, 0xa2, 0xb7, 0xff, 0x6b, 0x8f, 0x80, 0xc2, 0x99, 0xcd, 0x44, 0x64, 0xe6, 0x15, 0x61, 0xba, 0x76, 0x85, 0xd5, 0x42, 0x16, 0x13, 0x9e, 0xfb, 0x82, 0xcf, 0x79, 0xe6, 0x39, 0xb0, 0xc6, 0x29, 0x6, 0xf5, 0x1b, 0xc8, 0xd7, 0xc7, 0xf8, 0x64, 0x31, 0xd9, 0x54, 0x3a, 0xd, 0x3a, 0xc9, 0x66, 0x22, 0x32, 0xf3, 0x8a, 0x30, 0x8b, 0xe, 0x3a, 0x15, 0xe4, 0x15, 0xcd, 0x1e, 0x22, 0x87, 0xa9, 0x53, 0xa6, 0xf6, 0x0, 0xfc, 0x7d, 0x8c, 0x4f, 0x16, 0x93, 0x75, 0xbb, 0xd3, 0x9, 0x18, 0x97, 0x1e, 0x81, 0xc5, 0x47, 0x44, 0x26, 0xcc, 0x3c, 0x3a, 0x8b, 0x12, 0x14, 0x6b, 0x9a, 0xa, 0x2c, 0x5c, 0x27, 0xb7, 0xbc, 0xc9, 0xa0, 0xd, 0x70, 0x8a, 0x61, 0x1c, 0xd3, 0x4, 0xd9, 0xb2, 0xf0, 0x8, 0xd8, 0xc8, 0x62, 0x4e, 0x8b, 0x4f, 0x1e, 0xf6, 0xef, 0x60, 0x36, 0x13, 0x91, 0x99, 0x3e, 0xbe, 0x5, 0xa6, 0xc9, 0x62, 0xc2, 0xbe, 0xc0, 0xc3, 0x15, 0xbc, 0xa4, 0xc, 0x4e, 0x11, 0xc0, 0x5f, 0x60, 0x16, 0x4, 0x6c, 0x49, 0xda, 0xc0, 0xb5, 0x87, 0xc6, 0x98, 0x23, 0x32, 0xf3, 0xe5, 0xc2, 0x43, 0xc, 0xac, 0x85, 0x72, 0x12, 0xb0, 0xdf, 0xc0, 0xd4, 0x19, 0x8b, 0xcc, 0xd, 0x4e, 0x11, 0xc0, 0xb, 0xd7, 0x29, 0x60, 0x4, 0x6c, 0xd3, 0xc5, 0xe7, 0xb9, 0x5d, 0x20, 0x32, 0xf3, 0x8d, 0x2e, 0x29, 0x27, 0x1, 0x6d, 0xa8, 0x1d, 0xaf, 0x17, 0x9, 0xdf, 0x3b, 0xd9, 0xfd, 0xfd, 0xf6, 0x42, 0x32, 0xe, 0x3c, 0x60, 0xbf, 0xd, 0x28, 0x1d, 0xef, 0x59, 0x13, 0xb0, 0x4d, 0xda, 0x7, 0xac, 0x5d, 0x7d, 0xe0, 0x2f, 0x7f, 0xfb, 0x47, 0x89, 0xc8, 0xcc, 0xb, 0x65, 0xec, 0x7d, 0xce, 0x18, 0xe5, 0xd4, 0x5, 0x38, 0x44, 0x95, 0xa9, 0xc8, 0xdc, 0x8, 0x3b, 0xa5, 0xf7, 0xb1, 0xcd, 0xb4, 0x3f, 0xc0, 0xcb, 0xf8, 0x14, 0xe5, 0x26, 0x8b, 0x39, 0x6d, 0x7c, 0x9e, 0xdf, 0x7, 0x44, 0x66, 0x3e, 0xa8, 0x35, 0x12, 0x37, 0xe2, 0x77, 0xea, 0x2, 0x5, 0xa6, 0xe1, 0x10, 0xae, 0xba, 0x87, 0xa9, 0x8a, 0xa, 0x9c, 0x62, 0xf3, 0xe0, 0x16, 0xf2, 0x62, 0x4e, 0xc0, 0x96, 0x45, 0x70, 0xe9, 0xa, 0x30, 0x17, 0xfb, 0x36, 0x0, 0x21, 0x32, 0xd3, 0x14, 0x98, 0xb7, 0x1e, 0xce, 0x5f, 0x65, 0x2f, 0x29, 0x30, 0xd, 0x2e, 0x5c, 0xce, 0xe1, 0xf7, 0x44, 0xef, 0xb9, 0xe2, 0xd1, 0xbf, 0x88, 0xab, 0x6d, 0x4a, 0x9a, 0x28, 0xab, 0xa0, 0xc2, 0xe5, 0x6b, 0x38, 0xa6, 0x38, 0x9f, 0xc0, 0x7b, 0x8e, 0xc8, 0xcc, 0x43, 0x60, 0xfa, 0x64, 0x13, 0xde, 0xb, 0xd3, 0xe4, 0xd0, 0x5e, 0x64, 0xe6, 0x6a, 0x4c, 0xe9, 0x13, 0x2f, 0xf3, 0x8e, 0x26, 0xca, 0x6, 0x9f, 0xd, 0x3f, 0xcc, 0x96, 0xa5, 0x81, 0xcf, 0x46, 0xc8, 0x77, 0x88, 0x4c, 0x4, 0xa6, 0x62, 0x29, 0x64, 0x6a, 0xa0, 0x1b, 0x41, 0x51, 0x26, 0x6a, 0x4c, 0xe1, 0x65, 0xee, 0x1d, 0xaf, 0xcf, 0x69, 0xa2, 0x6c, 0x70, 0x3d, 0xeb, 0x35, 0x4d, 0x94, 0xc, 0x3e, 0x1, 0xc3, 0x7c, 0x77, 0xca, 0x1c, 0x91, 0x99, 0x9f, 0xc0, 0x54, 0x83, 0x9e, 0x5d, 0xb3, 0x0, 0xfb, 0xa9, 0x84, 0xf5, 0x63, 0x3e, 0x6d, 0x74, 0x88, 0x2, 0xa1, 0x99, 0x5, 0x4c, 0x95, 0xe7, 0xc7, 0x97, 0xd0, 0xc0, 0x3, 0x91, 0x99, 0x97, 0xc0, 0x54, 0xb, 0x77, 0x29, 0x57, 0x4, 0xa1, 0x6c, 0x33, 0xba, 0x57, 0x9c, 0xa2, 0x5f, 0x7f, 0x70, 0x9, 0xf1, 0x8f, 0x34, 0x53, 0xf2, 0x94, 0x8e, 0xd7, 0xeb, 0xcc, 0x6c, 0x47, 0xe, 0x4, 0x4f, 0x99, 0x23, 0x32, 0xa7, 0x1f, 0x49, 0x7e, 0xb, 0x10, 0x98, 0x27, 0xc2, 0x3a, 0x4c, 0x8, 0x27, 0xa7, 0x3e, 0xc3, 0x54, 0x79, 0x37, 0xed, 0xa4, 0x4, 0xc8, 0x19, 0xcd, 0x94, 0x34, 0xef, 0x18, 0x4b, 0x8c, 0xfd, 0x3d, 0x90, 0xc9, 0x4c, 0x4, 0x65, 0xc0, 0xbf, 0x8a, 0xbb, 0x4c, 0x91, 0x11, 0x9, 0xd4, 0xc3, 0x4, 0x70, 0x7, 0x62, 0x8c, 0x11, 0x3f, 0x7c, 0x32, 0xbe, 0xea, 0x14, 0x90, 0x82, 0xa6, 0x4a, 0x96, 0xd2, 0xf1, 0xfa, 0x1d, 0x4d, 0x94, 0x24, 0xce, 0x29, 0x73, 0xbb, 0x30, 0x3b, 0x22, 0x73, 0x7a, 0x98, 0x1a, 0x98, 0x97, 0x9e, 0xef, 0x57, 0x4e, 0xf3, 0x44, 0x98, 0xb6, 0x80, 0x71, 0x1c, 0x4d, 0x6a, 0xc2, 0x9, 0x9e, 0x5, 0x79, 0xe5, 0x69, 0xab, 0x8e, 0x68, 0xae, 0x2c, 0xc7, 0x3d, 0x99, 0xcc, 0x34, 0xa9, 0x3c, 0xde, 0x73, 0x8c, 0xc8, 0x9c, 0x26, 0x2a, 0xd, 0xfd, 0x4d, 0xfc, 0x17, 0xd5, 0x23, 0x30, 0x1, 0xc2, 0x84, 0x13, 0xf8, 0xe3, 0xb3, 0x81, 0x50, 0x2d, 0xe5, 0xb9, 0x45, 0x68, 0x26, 0xc7, 0x31, 0x2, 0x33, 0x5b, 0x1e, 0x24, 0xa0, 0x56, 0x2e, 0x22, 0x73, 0x1a, 0x14, 0xda, 0x50, 0x87, 0x64, 0x5, 0x94, 0xc3, 0x7c, 0x8b, 0xe3, 0x4, 0x80, 0x9e, 0xa8, 0xc4, 0x2f, 0xab, 0x61, 0x84, 0x66, 0x41, 0x93, 0x25, 0x43, 0xe9, 0x78, 0x9d, 0xa9, 0xf2, 0xf4, 0xc7, 0x3e, 0x22, 0x33, 0x11, 0x71, 0x79, 0x2d, 0x4f, 0xd9, 0xcb, 0x32, 0xe0, 0xf7, 0xcc, 0x26, 0x9f, 0x9a, 0x26, 0x4, 0x80, 0x1e, 0xf1, 0x5d, 0xeb, 0xad, 0x84, 0xe6, 0x57, 0xe1, 0x34, 0xa0, 0x54, 0x70, 0x6d, 0x36, 0x25, 0xb9, 0x91, 0x36, 0xce, 0x20, 0xc2, 0xac, 0xcb, 0x44, 0x64, 0xc6, 0x2f, 0x2e, 0x17, 0x81, 0xbf, 0xbb, 0x96, 0xa7, 0xc, 0x26, 0x1b, 0x18, 0x0, 0xa0, 0x6f, 0x54, 0x20, 0xeb, 0x5b, 0x77, 0xd7, 0x94, 0x5b, 0xbb, 0x14, 0xa6, 0xcf, 0xa7, 0xee, 0x9f, 0x5c, 0xcf, 0xaf, 0xa2, 0x99, 0x92, 0xc6, 0xe7, 0xf9, 0xce, 0x10, 0x99, 0x71, 0x71, 0xa4, 0x5, 0xe5, 0x6d, 0x43, 0x71, 0x69, 0xb2, 0xa, 0x9c, 0x47, 0xe, 0x0, 0x43, 0x72, 0x25, 0x61, 0x27, 0xbb, 0x9c, 0x69, 0x1b, 0x47, 0x89, 0xa3, 0xe9, 0x8a, 0x4c, 0x4, 0x26, 0xb8, 0x9e, 0xf3, 0x1b, 0x44, 0x66, 0x1c, 0x83, 0x55, 0x89, 0x49, 0xb5, 0xd6, 0xf2, 0x87, 0x3c, 0x65, 0x2f, 0xcb, 0x6, 0x7f, 0xc7, 0xac, 0xbf, 0x5c, 0xd3, 0xa4, 0x0, 0x30, 0x2, 0xa7, 0x81, 0xe2, 0x42, 0x5, 0xd5, 0x97, 0x96, 0xd8, 0x24, 0xb3, 0x39, 0x1d, 0x5c, 0x9b, 0x7e, 0x98, 0x2a, 0xcf, 0x3, 0xd7, 0x73, 0x26, 0x93, 0x39, 0x30, 0x47, 0xf2, 0x5c, 0xa0, 0xd8, 0x4c, 0x85, 0x7f, 0xd3, 0xdf, 0xb7, 0x39, 0x82, 0x4d, 0x65, 0x11, 0xd8, 0x41, 0xe, 0x0, 0x63, 0xf3, 0x5e, 0xc2, 0xb3, 0x58, 0x85, 0x25, 0x36, 0xaf, 0xc5, 0xef, 0x60, 0x9, 0x18, 0x97, 0xc2, 0xf1, 0xfa, 0x3d, 0x4d, 0x94, 0x5, 0xae, 0xe7, 0xfc, 0xbf, 0xb1, 0xfc, 0xca, 0xe3, 0x4d, 0xb7, 0xb4, 0x65, 0x6b, 0x71, 0xd9, 0x87, 0xe1, 0xdc, 0xea, 0xec, 0x1, 0xe2, 0x12, 0x0, 0x62, 0xc0, 0x94, 0x4c, 0x53, 0x62, 0x71, 0xd1, 0xc0, 0x4e, 0x2e, 0xf4, 0xa5, 0x6c, 0x9a, 0xaa, 0x59, 0xaa, 0xca, 0xe0, 0xd4, 0x34, 0xeb, 0xe4, 0x44, 0x26, 0xcf, 0x2c, 0xf, 0x9c, 0xda, 0xe3, 0x2f, 0x7f, 0xfb, 0xc7, 0xec, 0x95, 0xc7, 0xc0, 0x2f, 0x69, 0xcb, 0xa8, 0x50, 0x3, 0x58, 0x2d, 0xb4, 0x5f, 0xd3, 0x14, 0xa3, 0x51, 0x5a, 0x41, 0xd8, 0x9f, 0x76, 0xfe, 0xed, 0x50, 0x80, 0xf1, 0x70, 0x60, 0x60, 0xd6, 0x3b, 0xc6, 0xf9, 0xce, 0xe3, 0x77, 0x0, 0x62, 0xe4, 0x54, 0xf7, 0xdf, 0xa6, 0x1b, 0x7c, 0x66, 0xfa, 0xba, 0x44, 0x70, 0x4e, 0x52, 0x64, 0x56, 0x34, 0x11, 0x22, 0xd3, 0xf8, 0xc0, 0x57, 0xb4, 0xd3, 0xa4, 0xb2, 0x4, 0x6a, 0x6a, 0xfc, 0x93, 0xb0, 0x73, 0x7c, 0x8, 0x8c, 0x40, 0x3c, 0xd6, 0x46, 0xb5, 0xe8, 0x20, 0xe0, 0x6a, 0x1b, 0xb4, 0x6d, 0x2d, 0xd1, 0xa9, 0xbe, 0xde, 0x8b, 0x5f, 0x61, 0x5c, 0x80, 0xa1, 0x59, 0xeb, 0x7e, 0x79, 0xdd, 0xb2, 0xcf, 0xef, 0xa, 0x4e, 0xf5, 0x37, 0xbf, 0xd0, 0xe7, 0xa3, 0x15, 0x99, 0x4, 0x2, 0xf9, 0x9, 0xcd, 0x43, 0x33, 0xb5, 0xc7, 0x88, 0xcc, 0xf8, 0x51, 0x83, 0x76, 0xa5, 0x23, 0x79, 0xc4, 0x65, 0x7f, 0xcc, 0xb4, 0x33, 0x3c, 0xd6, 0xdf, 0x17, 0x91, 0x7e, 0x46, 0x79, 0xc1, 0x69, 0xd7, 0xfa, 0x52, 0xce, 0xf7, 0xbb, 0xf5, 0x3d, 0xc0, 0x98, 0xb6, 0x4b, 0x4d, 0x9f, 0x2f, 0xa4, 0x9b, 0xb2, 0x45, 0x46, 0x70, 0x9a, 0x5d, 0xe9, 0xca, 0x26, 0xde, 0xe9, 0x7e, 0x4e, 0xb6, 0x7f, 0xb8, 0xe0, 0xdb, 0xf5, 0xcc, 0x21, 0x1f, 0x9c, 0x9a, 0x4, 0x91, 0x19, 0x2f, 0xca, 0x80, 0x9a, 0x69, 0x22, 0xe8, 0xc7, 0x58, 0xce, 0xb5, 0xa8, 0x9c, 0xcb, 0xf4, 0x77, 0xb7, 0x16, 0xb2, 0x3f, 0xdb, 0xba, 0xd5, 0xd7, 0x3d, 0xce, 0x18, 0x46, 0x62, 0xad, 0xed, 0xd8, 0x47, 0xe9, 0x76, 0x27, 0xf9, 0x5c, 0x9e, 0x37, 0x4d, 0x9a, 0x8c, 0x3e, 0xa2, 0x73, 0x98, 0x40, 0x17, 0x91, 0x9, 0xa2, 0xc7, 0x5a, 0x79, 0xa8, 0xbf, 0x20, 0x32, 0xe3, 0x13, 0x96, 0x5f, 0x84, 0xac, 0x65, 0xdf, 0xc2, 0xf2, 0x9d, 0xb4, 0xdb, 0xd1, 0x3f, 0x35, 0xa7, 0x30, 0xdb, 0x63, 0x18, 0x6c, 0x87, 0xc, 0xd0, 0x37, 0xca, 0x9e, 0xa9, 0x19, 0x19, 0xb5, 0xdc, 0x67, 0xa1, 0x5, 0x67, 0xd1, 0xc3, 0xd8, 0x46, 0x74, 0x8e, 0xb, 0x22, 0x13, 0x7e, 0x1a, 0x97, 0x88, 0xcc, 0xf1, 0xa3, 0x80, 0xad, 0x36, 0x84, 0x64, 0x2c, 0xfb, 0x43, 0x39, 0x9e, 0xf, 0x19, 0x9, 0x4b, 0x17, 0xe5, 0x4e, 0xf4, 0x59, 0xc9, 0xf3, 0x3a, 0x37, 0x9c, 0x31, 0xf4, 0x2d, 0x36, 0xaf, 0xf4, 0xd5, 0xe7, 0xb8, 0xdc, 0x15, 0x9d, 0x4, 0x57, 0xc3, 0xf0, 0x1f, 0x9a, 0x20, 0x2b, 0x9c, 0xc7, 0x4b, 0x22, 0x32, 0xfb, 0x8f, 0xea, 0x4c, 0x64, 0x67, 0x6f, 0xd6, 0xa8, 0x71, 0xe6, 0xfd, 0x47, 0x50, 0xf2, 0x94, 0x2d, 0x59, 0x48, 0x9c, 0xeb, 0x2b, 0x63, 0x15, 0x9d, 0xb5, 0x25, 0x3a, 0x9, 0x7c, 0xa0, 0x4f, 0x36, 0xfa, 0x2a, 0x2c, 0xc1, 0x39, 0x1b, 0xa8, 0x9f, 0x1b, 0x9b, 0x6c, 0x8b, 0x4e, 0x66, 0x8f, 0xdc, 0x50, 0x88, 0x1d, 0x82, 0xc6, 0x9c, 0x4b, 0x64, 0xaa, 0x81, 0x77, 0x42, 0x3b, 0xc1, 0x84, 0x50, 0xe, 0xeb, 0x42, 0xc6, 0x5b, 0x67, 0x59, 0x35, 0xf8, 0xbc, 0x45, 0x64, 0xed, 0xb7, 0xd0, 0xd7, 0x83, 0x25, 0x2, 0x0, 0xfa, 0xc, 0xc6, 0x4d, 0x76, 0x73, 0x28, 0xc1, 0x29, 0xf2, 0xeb, 0x46, 0xa2, 0x7a, 0x47, 0x74, 0xd6, 0x3c, 0x1a, 0x80, 0x76, 0x41, 0x5, 0x99, 0x4c, 0x48, 0x5, 0x73, 0x4c, 0xdd, 0xa2, 0x47, 0x47, 0x58, 0xcb, 0xaf, 0xe5, 0x83, 0xea, 0x8e, 0x9d, 0x91, 0x5d, 0x5b, 0x53, 0x7d, 0xff, 0xc6, 0x72, 0x88, 0x47, 0xd6, 0xd7, 0xa1, 0xda, 0x74, 0x41, 0xd7, 0x82, 0x91, 0x4, 0xa7, 0xbd, 0x86, 0xba, 0x1c, 0xa0, 0xdf, 0xdb, 0x1, 0x16, 0xa2, 0xb3, 0x19, 0x1c, 0xde, 0x2, 0x88, 0x4c, 0x48, 0xe, 0x95, 0xb9, 0xec, 0x72, 0xd7, 0xaa, 0x71, 0x2e, 0xf7, 0xf2, 0x3c, 0xa5, 0x36, 0x14, 0xbb, 0x75, 0x2f, 0x5f, 0x9a, 0xb2, 0x2e, 0x2d, 0x11, 0x6a, 0x4a, 0x2e, 0x71, 0x24, 0x1f, 0xa4, 0x84, 0x1a, 0xb, 0x6b, 0x79, 0x3e, 0x78, 0x42, 0xf5, 0xf9, 0x63, 0xf9, 0x75, 0xda, 0x1b, 0xd1, 0x9, 0x80, 0xc8, 0x4, 0xe8, 0x1c, 0xe5, 0x68, 0xae, 0xa5, 0xfd, 0x74, 0xae, 0xed, 0x3c, 0xa6, 0xb2, 0xb3, 0xbf, 0x7a, 0x41, 0x84, 0x96, 0xba, 0x3d, 0x4c, 0xbd, 0x4f, 0x84, 0x27, 0xa4, 0x42, 0xa5, 0xaf, 0x95, 0xfe, 0x79, 0x6e, 0x89, 0xce, 0x21, 0xfa, 0xf9, 0xae, 0xe8, 0xdc, 0xee, 0xd8, 0xd, 0x0, 0x40, 0x64, 0x42, 0x2, 0xa8, 0xc, 0x9e, 0xc9, 0x5e, 0xb6, 0x11, 0x96, 0xa6, 0x16, 0x69, 0x4a, 0x8b, 0xd5, 0x8d, 0xf8, 0x5c, 0xef, 0x8, 0xcf, 0x21, 0x33, 0x40, 0x0, 0x43, 0xb0, 0xb1, 0xc4, 0x9d, 0x7d, 0x42, 0xd7, 0x50, 0xfd, 0x7c, 0x5f, 0x71, 0x78, 0x53, 0xa5, 0xa1, 0xe6, 0xf1, 0x0, 0x20, 0x32, 0x61, 0x7a, 0x28, 0xa3, 0x7e, 0x23, 0xcd, 0xb2, 0x97, 0x66, 0xfa, 0x2d, 0x35, 0x61, 0xe9, 0x23, 0x3c, 0xd5, 0xb5, 0xb2, 0x44, 0xa7, 0x59, 0xe7, 0x46, 0xa6, 0x13, 0x52, 0xe0, 0xe1, 0x85, 0x7e, 0x6e, 0x32, 0xfa, 0xa5, 0xf4, 0xbf, 0xa6, 0xd3, 0x2e, 0x99, 0xc4, 0x99, 0xeb, 0x0, 0x88, 0x4c, 0x98, 0x18, 0x2a, 0x63, 0x70, 0xd9, 0xe0, 0xf7, 0x6a, 0xed, 0x78, 0xd6, 0x34, 0xe1, 0x4f, 0xa2, 0x53, 0xe4, 0x79, 0x37, 0xef, 0xb1, 0x50, 0x47, 0x14, 0xd2, 0xed, 0xe7, 0x62, 0x89, 0xcd, 0x37, 0xf2, 0xbc, 0xac, 0xa4, 0xcf, 0x60, 0xd8, 0x3e, 0x73, 0x1d, 0xc1, 0x9, 0x88, 0x4c, 0x80, 0x88, 0x51, 0x6b, 0x2f, 0x17, 0xd, 0x9c, 0xcc, 0x4a, 0x28, 0xbc, 0xec, 0x12, 0xe0, 0xfb, 0x76, 0xf3, 0x22, 0x38, 0x21, 0x35, 0xcc, 0x11, 0xab, 0x62, 0x5, 0x58, 0xb6, 0xe8, 0xec, 0x2b, 0xab, 0x6f, 0xb, 0xce, 0xca, 0x12, 0x9c, 0xd4, 0xe5, 0x4, 0x44, 0x26, 0xc0, 0xc8, 0x28, 0xe1, 0x73, 0x1b, 0xe8, 0x0, 0x94, 0x70, 0x3a, 0x45, 0x5c, 0x6, 0x63, 0xef, 0xe6, 0x35, 0xe5, 0x8b, 0x86, 0xa8, 0x57, 0x8, 0x30, 0x56, 0x80, 0xb5, 0xde, 0xb1, 0x35, 0x4a, 0x6c, 0xf6, 0xb9, 0x99, 0xa8, 0xd4, 0xd7, 0xa5, 0xfe, 0xbf, 0x3f, 0xc9, 0xb4, 0xb2, 0x9b, 0xf7, 0x1e, 0x42, 0x1e, 0xf1, 0xc, 0x86, 0xcf, 0x88, 0x4c, 0x48, 0x49, 0x60, 0x9a, 0xf3, 0x91, 0xaf, 0x68, 0xba, 0x4e, 0x4, 0xa7, 0xc9, 0x70, 0xde, 0xa, 0x1b, 0x86, 0x20, 0x8f, 0x3e, 0xbf, 0xbb, 0x99, 0xc8, 0x88, 0x4e, 0x95, 0xd9, 0x2f, 0x3a, 0xb6, 0x6d, 0x67, 0xfa, 0xda, 0x68, 0xb1, 0x59, 0x4d, 0xa4, 0x8d, 0xe, 0x71, 0x4e, 0x70, 0x9f, 0xf, 0xff, 0xfe, 0xd7, 0x3f, 0x9d, 0xef, 0xf9, 0x23, 0xcd, 0x4, 0x89, 0x8, 0x4c, 0x65, 0xd8, 0xde, 0x22, 0x30, 0x1, 0xa0, 0x63, 0xd1, 0xa9, 0x84, 0xd3, 0x6b, 0x7d, 0xa9, 0x19, 0x92, 0xb5, 0x74, 0x9b, 0xad, 0x9b, 0x6b, 0x5b, 0x97, 0x42, 0x30, 0xc7, 0xac, 0x7, 0x20, 0x32, 0x21, 0x29, 0x81, 0xf9, 0xa0, 0x9d, 0x80, 0x3a, 0xfe, 0xb4, 0xa6, 0xe9, 0x0, 0xa0, 0x27, 0x6a, 0x2d, 0x30, 0x95, 0xd0, 0xfc, 0x4d, 0x7, 0xb5, 0x4b, 0xe9, 0xae, 0x52, 0x45, 0xa9, 0xed, 0x5e, 0xd3, 0xea, 0x19, 0x43, 0xb5, 0xc1, 0x21, 0xfe, 0x44, 0x37, 0x1, 0x44, 0x26, 0xc4, 0xce, 0xb5, 0xa7, 0xc0, 0xac, 0xb5, 0xb8, 0x24, 0x7b, 0x9, 0x0, 0x43, 0xa3, 0xc4, 0xe5, 0x4a, 0x8b, 0xcd, 0xd7, 0x3a, 0xd8, 0xed, 0x42, 0x70, 0xaa, 0xcc, 0xe6, 0x37, 0x79, 0xaa, 0x5, 0x3c, 0x35, 0x91, 0x49, 0x26, 0x13, 0x10, 0x99, 0x10, 0x35, 0x97, 0xe2, 0xb7, 0xb3, 0x79, 0xab, 0x8d, 0xfb, 0x96, 0x26, 0x3, 0x80, 0x8, 0xc4, 0xd7, 0x55, 0xc7, 0x82, 0x73, 0xf9, 0x78, 0x7d, 0x8d, 0x50, 0xb8, 0x1d, 0x5a, 0x2a, 0x70, 0x44, 0x57, 0x0, 0x44, 0x26, 0xc4, 0x8a, 0x12, 0x97, 0x3e, 0xa7, 0xf8, 0xa8, 0x75, 0x52, 0x27, 0xc2, 0x2e, 0x46, 0x0, 0x88, 0x5f, 0x70, 0x5e, 0xb5, 0xb0, 0x55, 0x33, 0x2d, 0x34, 0xcf, 0x22, 0xba, 0xbf, 0x43, 0xe2, 0xb9, 0xe4, 0xf1, 0x3, 0x22, 0x13, 0x62, 0x44, 0x45, 0xc0, 0xd7, 0x9e, 0x2, 0xf3, 0x3d, 0x2, 0x13, 0x0, 0x26, 0x22, 0x38, 0x55, 0x56, 0x53, 0xad, 0xe1, 0x6c, 0x53, 0x56, 0xed, 0xd2, 0xd3, 0x3e, 0xe, 0x81, 0xcb, 0xf6, 0x16, 0x3c, 0x76, 0x40, 0x64, 0x42, 0x6c, 0x5c, 0x8b, 0x7b, 0xaa, 0x65, 0xab, 0xd, 0x35, 0x0, 0xc0, 0xd4, 0x58, 0xcb, 0xd3, 0xc, 0xcc, 0x49, 0x43, 0xb1, 0xb9, 0x90, 0xa7, 0x8d, 0x41, 0x63, 0x4f, 0x49, 0xbb, 0x96, 0x1, 0x20, 0x32, 0x1, 0x91, 0x9, 0x51, 0x61, 0x9f, 0xf9, 0x7b, 0x28, 0x23, 0xc0, 0x14, 0x39, 0x0, 0x4c, 0x9d, 0xaa, 0x85, 0xd8, 0x2c, 0x23, 0x10, 0x9a, 0xae, 0x82, 0xec, 0xc7, 0x3c, 0x62, 0x40, 0x64, 0x42, 0x4c, 0xb8, 0xce, 0x23, 0x57, 0xc2, 0x92, 0x29, 0x72, 0x0, 0x48, 0x51, 0x6c, 0xbe, 0x97, 0xb0, 0xf2, 0x6b, 0x6a, 0x9d, 0xe6, 0x98, 0x53, 0xe7, 0xae, 0xcf, 0x5a, 0xf2, 0x68, 0x1, 0x91, 0x9, 0xb1, 0xb0, 0x10, 0xf7, 0xf4, 0x8a, 0x2a, 0x13, 0xc2, 0x2e, 0x72, 0x0, 0x48, 0x11, 0xb5, 0xce, 0x3c, 0xf4, 0x20, 0x89, 0xb9, 0x47, 0x70, 0xde, 0x17, 0x2e, 0x5b, 0x4c, 0x19, 0x23, 0x40, 0x64, 0x42, 0x34, 0xb8, 0x6a, 0xc1, 0x55, 0x42, 0x1d, 0x4c, 0x0, 0x48, 0x1b, 0xfb, 0x50, 0x9, 0xdf, 0x19, 0x9b, 0x33, 0xf1, 0x2b, 0xf7, 0xd6, 0x7, 0xd5, 0x81, 0xd7, 0x8e, 0x10, 0x9a, 0x80, 0xc8, 0x84, 0x18, 0x58, 0x88, 0x3b, 0x8b, 0xc9, 0x46, 0x1f, 0x0, 0xc8, 0x5, 0x25, 0xde, 0x42, 0xea, 0xff, 0xfa, 0x6c, 0x98, 0xec, 0x3, 0xd7, 0xe7, 0x2b, 0x79, 0x94, 0x80, 0xc8, 0x84, 0xb1, 0xf9, 0xe8, 0x78, 0x7d, 0x2d, 0x1c, 0x15, 0x9, 0x0, 0x79, 0xa1, 0x6c, 0xde, 0x89, 0xa7, 0xd0, 0x54, 0x2, 0x73, 0x8c, 0x93, 0x81, 0xee, 0x1c, 0xaf, 0xb3, 0xf9, 0x7, 0x10, 0x99, 0x30, 0x2a, 0x33, 0x71, 0x4f, 0xa9, 0xac, 0x68, 0x26, 0x0, 0xc8, 0x90, 0x87, 0x0, 0xa1, 0xa9, 0xa6, 0xcd, 0x8b, 0x81, 0x3f, 0x5f, 0xe5, 0x78, 0xbd, 0xe4, 0x11, 0x2, 0x22, 0x13, 0xc6, 0xe4, 0x83, 0xe3, 0xf5, 0xb5, 0x90, 0xc5, 0x4, 0x0, 0x84, 0xa6, 0xcf, 0x1a, 0xcd, 0x8b, 0x11, 0x3e, 0xdb, 0x21, 0x1, 0x7c, 0x84, 0xd0, 0x4, 0x44, 0x26, 0x8c, 0x89, 0xcb, 0x0, 0x7d, 0xa6, 0x89, 0x0, 0x0, 0xa1, 0xf9, 0x3f, 0xa1, 0xe9, 0x62, 0x21, 0xf1, 0x65, 0x33, 0xdf, 0xf1, 0xf8, 0x0, 0x91, 0x9, 0x63, 0xa0, 0x8c, 0xe1, 0xa1, 0xa9, 0xf2, 0x5a, 0x9a, 0x1f, 0xbf, 0x6, 0x0, 0x90, 0x12, 0x2a, 0x63, 0xb8, 0xf4, 0x78, 0xdf, 0xd0, 0x3b, 0xcd, 0xef, 0x22, 0xfb, 0x3c, 0x80, 0xc8, 0x4, 0xf8, 0x1f, 0xae, 0xb5, 0x98, 0x1b, 0x9a, 0x8, 0x0, 0xe0, 0xff, 0x7c, 0x12, 0xf7, 0xb4, 0xf9, 0x87, 0x81, 0x3f, 0x93, 0xcb, 0x4e, 0x17, 0x42, 0x29, 0x23, 0x44, 0x26, 0x4d, 0x0, 0x23, 0xe0, 0xda, 0x79, 0x78, 0x47, 0x13, 0x1, 0x0, 0xfc, 0x1f, 0x25, 0x30, 0x5d, 0x1b, 0x21, 0x67, 0x32, 0xfc, 0x94, 0xb9, 0x4b, 0x68, 0x7e, 0xe4, 0xd1, 0x21, 0x32, 0x1, 0x86, 0xc6, 0x15, 0xdd, 0x56, 0x34, 0x11, 0x0, 0xc0, 0x4f, 0xac, 0xc5, 0x9d, 0xcd, 0x2c, 0x7, 0xfe, 0x4c, 0x5f, 0x1c, 0xaf, 0x33, 0x65, 0x8e, 0xc8, 0x4, 0x18, 0x9c, 0x43, 0xd1, 0xf6, 0x56, 0x38, 0xa3, 0x1c, 0x0, 0x60, 0x17, 0x65, 0x17, 0x5d, 0x99, 0xc3, 0xa1, 0xeb, 0x53, 0xba, 0x3e, 0x8f, 0xda, 0x65, 0xbe, 0xe0, 0xd1, 0x21, 0x32, 0x1, 0x62, 0x11, 0x99, 0x8, 0x4c, 0x0, 0x80, 0xfd, 0xb8, 0x32, 0x87, 0x43, 0xaf, 0x81, 0x54, 0xf6, 0x7a, 0xed, 0x78, 0xcf, 0x7, 0x1e, 0x1b, 0x22, 0x13, 0x60, 0x28, 0x5c, 0x47, 0xa0, 0x55, 0x34, 0x11, 0x0, 0xc0, 0x5e, 0x5c, 0x99, 0xc3, 0x31, 0x36, 0xda, 0xb8, 0x84, 0x6f, 0x29, 0xc3, 0xaf, 0x15, 0x5, 0x44, 0x26, 0x64, 0xa, 0xbb, 0xd, 0x1, 0x0, 0x9a, 0xe3, 0x3a, 0x5, 0x68, 0xe8, 0xb3, 0xcc, 0x95, 0xf0, 0xad, 0x1d, 0xef, 0xb9, 0xe0, 0xb1, 0x21, 0x32, 0x1, 0x0, 0x0, 0x60, 0xda, 0x22, 0x73, 0x8c, 0x40, 0x7e, 0xed, 0x78, 0x7d, 0x3e, 0x82, 0xf8, 0x5, 0x44, 0x26, 0x0, 0x0, 0x0, 0x4, 0x50, 0x47, 0xf8, 0x99, 0x5c, 0x27, 0xb4, 0x29, 0x81, 0x49, 0x39, 0x23, 0x44, 0x26, 0x0, 0x0, 0x0, 0x44, 0xcc, 0xf7, 0x48, 0x85, 0xef, 0xda, 0xf1, 0x9e, 0x33, 0x21, 0x9b, 0x89, 0xc8, 0x4, 0x0, 0x0, 0x80, 0x68, 0xa9, 0x23, 0xfd, 0x5c, 0x64, 0x33, 0x1, 0x91, 0x9, 0x18, 0x48, 0x0, 0x0, 0xe8, 0x9c, 0x4a, 0xdc, 0xd5, 0x41, 0xc8, 0x66, 0x22, 0x32, 0x1, 0x46, 0x15, 0x99, 0x5, 0x4d, 0x14, 0x1d, 0x25, 0x4d, 0x0, 0x0, 0x1e, 0xb8, 0x8e, 0xbe, 0x54, 0x2, 0x93, 0x9d, 0xe6, 0x88, 0x4c, 0x80, 0xd1, 0x40, 0x64, 0xc6, 0x5, 0x25, 0xa7, 0x0, 0xc0, 0x97, 0x4a, 0xfc, 0xb2, 0x99, 0xd8, 0x79, 0x44, 0x26, 0x40, 0xaf, 0x86, 0x8, 0x51, 0x33, 0xd, 0x4a, 0x9a, 0x0, 0x20, 0x2a, 0x62, 0x9f, 0x6e, 0x5e, 0x79, 0xbc, 0xe7, 0x9a, 0xc7, 0x88, 0xc8, 0x4, 0xe8, 0x8b, 0x7, 0x87, 0x1, 0x65, 0xcd, 0x4e, 0x3c, 0x70, 0x24, 0x1c, 0x40, 0x5c, 0xbc, 0x89, 0xfc, 0xf3, 0x55, 0xe2, 0xce, 0x66, 0xaa, 0xe0, 0x75, 0xce, 0xa3, 0x8c, 0x9a, 0x85, 0x74, 0x90, 0x71, 0x46, 0x64, 0xc2, 0x18, 0xc4, 0x58, 0x4c, 0x18, 0xf6, 0x3f, 0x7, 0x9e, 0x5, 0xc0, 0xb4, 0xa8, 0x22, 0xf8, 0xc, 0xbe, 0xd9, 0x4c, 0x12, 0xa, 0xf1, 0xa, 0x4c, 0xf5, 0x7c, 0xbe, 0xe9, 0xeb, 0x52, 0x1a, 0x16, 0xd4, 0x47, 0x64, 0xc2, 0x18, 0xdc, 0x3b, 0x5e, 0x7f, 0x47, 0x13, 0x45, 0x1, 0xe5, 0x46, 0x0, 0xe2, 0xa3, 0x3c, 0xf0, 0xda, 0x43, 0x44, 0x42, 0x77, 0xed, 0x78, 0xcf, 0x91, 0x30, 0x6d, 0x1e, 0x2b, 0xf6, 0xc, 0x56, 0x21, 0x4f, 0xeb, 0x68, 0x6f, 0x1e, 0xaf, 0x1f, 0x5a, 0x70, 0x22, 0x32, 0x21, 0x6a, 0x5c, 0x99, 0xcc, 0x92, 0x26, 0x1a, 0x9d, 0x99, 0x8e, 0x66, 0x1, 0x20, 0xbe, 0xb1, 0xd9, 0xd4, 0xb6, 0xe, 0xc9, 0xca, 0x43, 0xf4, 0xce, 0x85, 0x69, 0xf3, 0xd8, 0x98, 0x3b, 0x7c, 0xf0, 0x19, 0x22, 0x13, 0x62, 0xa7, 0x96, 0xc3, 0xa5, 0x8c, 0x66, 0xc2, 0xee, 0xc3, 0xb1, 0xb9, 0xa4, 0x9, 0x0, 0xa2, 0x43, 0xd9, 0xc5, 0xa3, 0x89, 0x88, 0xcc, 0x5a, 0x98, 0x36, 0x4f, 0xd1, 0xf6, 0x57, 0x88, 0x4c, 0x98, 0x2, 0xae, 0x8e, 0x4a, 0x74, 0x3b, 0x1e, 0x67, 0x42, 0x36, 0x19, 0x20, 0x46, 0x5c, 0xe3, 0xf2, 0x3e, 0xb2, 0xcf, 0x7b, 0xe5, 0x21, 0x7c, 0x95, 0xc0, 0xbc, 0xe1, 0xd1, 0x46, 0x63, 0xfb, 0xb, 0xc7, 0x7b, 0x3e, 0x21, 0x32, 0x61, 0xa, 0x7c, 0x71, 0xbc, 0xce, 0xae, 0xe6, 0x71, 0x50, 0x6, 0x86, 0x62, 0xc9, 0x0, 0x71, 0xe2, 0x5a, 0xaf, 0x5e, 0x45, 0xf8, 0x99, 0x4f, 0x3d, 0xc5, 0x33, 0x76, 0x27, 0x7e, 0xdb, 0x5f, 0x3f, 0x5e, 0x1b, 0x44, 0x26, 0x4c, 0x1, 0xd5, 0x51, 0xf, 0xad, 0xd7, 0x61, 0x67, 0xf3, 0x38, 0xa8, 0x8c, 0x2, 0x53, 0x57, 0x0, 0xf1, 0xa1, 0xc6, 0xe5, 0xdc, 0x21, 0x0, 0xea, 0x8, 0x3f, 0xb7, 0xca, 0x64, 0x2e, 0x3d, 0xde, 0xb7, 0x14, 0x66, 0xb0, 0xc6, 0xc4, 0x67, 0xd9, 0xc2, 0x2a, 0xf4, 0x8f, 0x22, 0x32, 0x61, 0x6c, 0xa1, 0x79, 0x8, 0x76, 0x37, 0xf, 0xcb, 0x5, 0xc2, 0x1e, 0x20, 0x5a, 0x5c, 0x2, 0xac, 0x8a, 0xf8, 0xb3, 0xaf, 0xc4, 0x6f, 0xbd, 0xe8, 0x35, 0x36, 0x68, 0x14, 0x7c, 0x96, 0x48, 0xa9, 0xfe, 0xb5, 0x46, 0x64, 0xc2, 0x94, 0x70, 0x4d, 0x99, 0x2f, 0x84, 0xd, 0x40, 0x43, 0x3a, 0xb0, 0x25, 0xcd, 0x0, 0x2f, 0x70, 0x24, 0x81, 0xbb, 0x4a, 0xa1, 0x73, 0x5c, 0x41, 0xf7, 0x97, 0xc8, 0x3f, 0xff, 0x7b, 0x71, 0xef, 0x36, 0x37, 0xeb, 0x33, 0x99, 0x4d, 0x19, 0xe, 0x25, 0xea, 0x7d, 0x36, 0x7a, 0xae, 0x9a, 0xfc, 0x71, 0x44, 0x26, 0x8c, 0x89, 0xca, 0x64, 0xd6, 0x8e, 0xf7, 0xb0, 0x4e, 0x67, 0x18, 0x23, 0x43, 0xbd, 0x3a, 0x38, 0xd4, 0x3f, 0xbe, 0x6a, 0x47, 0x44, 0x3f, 0x19, 0x87, 0x52, 0xe, 0x67, 0xf8, 0x6a, 0x9, 0x5c, 0x2b, 0x37, 0x2, 0xea, 0x33, 0x9e, 0x7b, 0xbc, 0xaf, 0x78, 0xbc, 0x6e, 0x11, 0x9a, 0x83, 0x5, 0x8f, 0x3e, 0x9b, 0xae, 0xd6, 0xd2, 0x30, 0x53, 0x8e, 0xc8, 0x84, 0xb1, 0x71, 0xed, 0x54, 0x5b, 0x8, 0xd9, 0xcc, 0x3e, 0xc1, 0xa0, 0x83, 0x4b, 0xdc, 0xdc, 0x5a, 0x63, 0x70, 0x81, 0xd0, 0x1c, 0x5, 0x57, 0xb0, 0xbd, 0x99, 0xc8, 0x7d, 0x28, 0xb1, 0x72, 0xe5, 0x19, 0xd8, 0xb0, 0xe3, 0xbc, 0x7f, 0x6e, 0x3d, 0xfc, 0xeb, 0x83, 0x67, 0x70, 0x80, 0xc8, 0x84, 0x68, 0x8d, 0x8e, 0x6b, 0xa, 0x5, 0xa7, 0xd6, 0x6f, 0x14, 0x8b, 0xc0, 0x84, 0x97, 0x2, 0xbc, 0x7d, 0x1, 0x8, 0x42, 0x73, 0xf8, 0xe7, 0x50, 0xb6, 0xc, 0xd6, 0x63, 0x42, 0x9, 0x16, 0x9f, 0xf5, 0x99, 0x25, 0xfd, 0xac, 0x57, 0x7c, 0xd7, 0xbf, 0x9e, 0x4a, 0x8b, 0x93, 0xa4, 0x10, 0x99, 0x30, 0x36, 0xf, 0x1e, 0x91, 0x6d, 0x29, 0x9c, 0x3e, 0xd3, 0x87, 0xc0, 0xbc, 0xf5, 0x34, 0x32, 0xf, 0x34, 0x57, 0x76, 0x9c, 0x39, 0x1c, 0xfc, 0x4b, 0x2, 0x14, 0xba, 0x1f, 0xa7, 0xae, 0xf5, 0x72, 0x2a, 0x50, 0xaf, 0x27, 0x76, 0x5f, 0x27, 0x9e, 0x9f, 0x99, 0x80, 0xa6, 0x3f, 0x81, 0xe9, 0xe3, 0x53, 0x55, 0xdf, 0x6a, 0x95, 0x25, 0x47, 0x64, 0x42, 0xc, 0x7c, 0xf2, 0x10, 0x32, 0xca, 0xd0, 0x16, 0x34, 0x55, 0x27, 0x28, 0x61, 0xf9, 0xcd, 0x53, 0x60, 0xfa, 0x14, 0x53, 0x86, 0xf4, 0x78, 0xe7, 0xf1, 0x9e, 0x12, 0xa1, 0x39, 0x88, 0x18, 0xe8, 0xbc, 0xac, 0x4c, 0x24, 0xc9, 0x5, 0x9f, 0x8d, 0x40, 0xb6, 0xd0, 0xa4, 0x9f, 0xd, 0x2b, 0x30, 0x95, 0xdd, 0x3f, 0x6f, 0xfb, 0x9f, 0x21, 0x32, 0x21, 0x16, 0x83, 0xe3, 0x32, 0x94, 0x9c, 0xa, 0xd1, 0xd, 0x21, 0xc2, 0x60, 0xdd, 0x85, 0x91, 0x81, 0x49, 0xe2, 0xbb, 0x53, 0x39, 0x24, 0x60, 0x81, 0x30, 0x94, 0x10, 0x98, 0x7b, 0x8c, 0xd1, 0x7a, 0xa2, 0xf7, 0xb7, 0xd5, 0x42, 0xd3, 0xb7, 0x2d, 0x8, 0x68, 0x86, 0x13, 0x98, 0xca, 0x27, 0xb7, 0x9a, 0x26, 0x47, 0x64, 0x42, 0x6c, 0xf8, 0x64, 0xcc, 0x7c, 0x4b, 0x2d, 0x40, 0x7b, 0x43, 0xbd, 0x16, 0xbf, 0x93, 0x3a, 0x20, 0xdd, 0xf1, 0xb8, 0xf6, 0x7c, 0xaf, 0x59, 0x7a, 0xb1, 0xa0, 0xd9, 0x3a, 0xc3, 0xa7, 0xe2, 0x83, 0x4f, 0x70, 0x1e, 0x3b, 0x55, 0x80, 0x9d, 0x99, 0x89, 0xdf, 0x46, 0x15, 0xd8, 0x3f, 0x46, 0xaf, 0x3, 0xc6, 0xe8, 0x7b, 0xe9, 0x68, 0x6, 0xb, 0x91, 0x9, 0x31, 0xe1, 0x93, 0x35, 0x3b, 0xc3, 0x99, 0x35, 0x36, 0x30, 0xbe, 0x6b, 0x9b, 0x10, 0x98, 0x20, 0xba, 0xf, 0xac, 0x3, 0xfb, 0x18, 0x41, 0x60, 0x37, 0x2, 0xf3, 0xd6, 0xe3, 0x7d, 0x4a, 0x60, 0xd6, 0x9, 0xdc, 0x6f, 0x88, 0xbd, 0x31, 0xe5, 0xb4, 0xc8, 0x9c, 0x87, 0xd9, 0xff, 0x90, 0x20, 0xf0, 0x54, 0x3a, 0x2c, 0xec, 0x8f, 0xc8, 0x84, 0xd8, 0xa2, 0x5a, 0x9f, 0xf2, 0x16, 0x21, 0x11, 0x19, 0xe, 0xeb, 0xc9, 0x28, 0xfb, 0xb6, 0x17, 0x2, 0x13, 0x9a, 0xa, 0x4d, 0x13, 0x4, 0xaa, 0xfe, 0x56, 0xd0, 0x74, 0xad, 0x4, 0xa6, 0x6b, 0xb6, 0x61, 0xeb, 0x69, 0x2b, 0x53, 0x14, 0x9a, 0x47, 0x81, 0x36, 0xd, 0xfb, 0xef, 0x2f, 0xca, 0x43, 0xc7, 0x3b, 0x22, 0x13, 0x26, 0x87, 0x6f, 0x79, 0xb, 0x84, 0xa6, 0x9b, 0x8b, 0x40, 0x87, 0x7f, 0x85, 0xc0, 0x84, 0xe, 0x1c, 0x8f, 0x71, 0x6c, 0x9c, 0x10, 0xd4, 0x8f, 0xc0, 0x34, 0x9b, 0x66, 0x52, 0x23, 0x34, 0xc0, 0x35, 0xb3, 0x33, 0xac, 0xd3, 0xec, 0x26, 0xe0, 0xeb, 0x5c, 0x60, 0x22, 0x32, 0x21, 0x66, 0xa7, 0xe6, 0xb3, 0xe0, 0x18, 0xa1, 0xb9, 0x9f, 0x52, 0x9e, 0x36, 0x63, 0x2c, 0x3, 0xdb, 0x9c, 0x4d, 0x3e, 0xd0, 0x55, 0xff, 0x30, 0xa5, 0x77, 0x6e, 0x84, 0xac, 0xa6, 0xf, 0x73, 0xf1, 0x5f, 0x2f, 0xad, 0x9e, 0x45, 0x9d, 0x68, 0x3b, 0x84, 0xa, 0xcd, 0x85, 0x16, 0x52, 0x25, 0x5d, 0xe8, 0xa7, 0xb1, 0x77, 0x23, 0x61, 0x4b, 0x57, 0x7a, 0x11, 0x98, 0x88, 0x4c, 0x88, 0x95, 0x6d, 0x80, 0xa1, 0xb9, 0x16, 0x32, 0x26, 0x86, 0x42, 0x1b, 0x97, 0x90, 0xc5, 0xf1, 0x4a, 0xcc, 0x9f, 0xf4, 0x65, 0x60, 0x20, 0x29, 0x9a, 0x64, 0xba, 0xe7, 0x42, 0x56, 0xd3, 0xc5, 0x85, 0xf8, 0x1f, 0x8a, 0xa0, 0x2, 0xc7, 0x4d, 0xe2, 0xed, 0xb1, 0xd6, 0x36, 0xc9, 0x77, 0x67, 0x73, 0xa1, 0x6d, 0xde, 0x85, 0x90, 0xd5, 0x5c, 0xe8, 0x4, 0xc3, 0x3c, 0xe0, 0x77, 0x7a, 0x13, 0x98, 0x88, 0x4c, 0x88, 0x19, 0x65, 0x48, 0x7d, 0x33, 0x27, 0xe6, 0x4c, 0xe5, 0x5c, 0xd, 0x8c, 0xc9, 0x1a, 0x85, 0x1a, 0x17, 0x25, 0xe6, 0xdf, 0x4a, 0x87, 0x8b, 0xbc, 0x21, 0x79, 0xd6, 0xba, 0xcf, 0x3c, 0x34, 0xe8, 0x9f, 0x64, 0x9c, 0xf6, 0x8b, 0xa3, 0x65, 0x40, 0xdb, 0xaf, 0x32, 0x69, 0x9b, 0x2a, 0x50, 0x68, 0x1a, 0x1, 0x9e, 0x6b, 0x1f, 0x33, 0x7d, 0x29, 0xc4, 0xf, 0x3e, 0xf4, 0x2d, 0x30, 0x11, 0x99, 0x10, 0x3b, 0x21, 0x65, 0x54, 0x16, 0xe2, 0x7f, 0x82, 0x4d, 0x4a, 0xe2, 0xf2, 0x42, 0x8b, 0xcb, 0xd0, 0x4c, 0x91, 0xc9, 0x16, 0xd4, 0x74, 0x33, 0x8, 0xc4, 0x4, 0x27, 0xa1, 0x25, 0x4e, 0x66, 0x96, 0x23, 0x2c, 0x32, 0x6f, 0xc3, 0x8b, 0x40, 0x41, 0xb4, 0x96, 0xfc, 0xd6, 0x4b, 0xab, 0xfe, 0xf5, 0x3a, 0xb0, 0x9f, 0x19, 0xb1, 0x95, 0xcb, 0x32, 0xd, 0x3b, 0xc1, 0x10, 0x22, 0xae, 0x7, 0x9b, 0xc1, 0x42, 0x64, 0x42, 0xec, 0x84, 0x44, 0x5a, 0x66, 0xc3, 0xc1, 0x45, 0x6, 0x51, 0xab, 0x72, 0xd4, 0x3f, 0x74, 0xf4, 0x1e, 0x92, 0xc1, 0x35, 0x9b, 0x6, 0x3a, 0x29, 0xb4, 0xb, 0xd9, 0x52, 0xb7, 0x70, 0x52, 0xb, 0xed, 0x14, 0x73, 0x14, 0x9b, 0x73, 0x79, 0x5e, 0x2f, 0xed, 0x3b, 0x6e, 0x73, 0x14, 0x98, 0xb6, 0xbd, 0x7a, 0xdb, 0xa0, 0x9f, 0x99, 0x76, 0xbe, 0x94, 0x34, 0x67, 0xb8, 0xda, 0x24, 0x18, 0xaa, 0x6, 0xe2, 0x1d, 0x91, 0x9, 0x8, 0x4d, 0x8b, 0xa5, 0xa4, 0x39, 0x6d, 0xb2, 0xd0, 0x51, 0xfa, 0x37, 0x69, 0xb6, 0xe1, 0x69, 0xa3, 0x8d, 0x4b, 0xe8, 0x9a, 0x2e, 0x97, 0x18, 0x65, 0x77, 0x67, 0xbe, 0x2, 0xe0, 0xb4, 0x45, 0xc0, 0x62, 0x8b, 0xcd, 0xd4, 0x67, 0x20, 0x4a, 0x69, 0x96, 0x61, 0xcb, 0x59, 0x60, 0xee, 0xfa, 0x80, 0x26, 0xfd, 0xec, 0x4c, 0xf7, 0xb1, 0x8b, 0x44, 0x2, 0x1a, 0x5b, 0x5c, 0x86, 0x26, 0x18, 0x8c, 0x6f, 0x3c, 0x91, 0x1, 0x13, 0xc, 0x88, 0x4c, 0x48, 0x55, 0x68, 0xce, 0x24, 0x8d, 0x69, 0x13, 0x73, 0xf2, 0xc7, 0xf, 0xfd, 0xb5, 0x89, 0x70, 0x36, 0xd9, 0x4b, 0xdf, 0xb3, 0x82, 0x77, 0x71, 0x45, 0xbc, 0x73, 0xba, 0x67, 0xd6, 0xa8, 0x71, 0xd9, 0x66, 0x6d, 0xef, 0x42, 0x7, 0x85, 0xa9, 0x9d, 0x1a, 0x74, 0x64, 0x9, 0xe9, 0xdb, 0x6, 0x63, 0xf7, 0x1c, 0x81, 0xf9, 0x4b, 0x3f, 0x3b, 0x91, 0xf0, 0xc, 0xdc, 0x91, 0x16, 0x57, 0x53, 0xe, 0x68, 0x6c, 0x3f, 0xd0, 0x44, 0x5c, 0xd6, 0xba, 0xed, 0x6, 0x5f, 0xd3, 0x8b, 0xc8, 0x84, 0x29, 0x46, 0xb3, 0x21, 0x98, 0x69, 0x93, 0x1b, 0x99, 0x4e, 0x66, 0x53, 0x7d, 0x4e, 0xb3, 0xce, 0xc6, 0x14, 0x1d, 0x6e, 0x9a, 0x2d, 0x54, 0xeb, 0x5a, 0x9b, 0x64, 0x2f, 0x6d, 0xee, 0x1d, 0xaf, 0xb3, 0xab, 0x13, 0x8c, 0x13, 0x3b, 0x97, 0xe6, 0x59, 0x92, 0x72, 0x27, 0xa0, 0x9a, 0x6a, 0x76, 0x73, 0xae, 0x3f, 0x7f, 0xd3, 0x25, 0x1, 0x66, 0xbd, 0xdc, 0x15, 0xdd, 0x6a, 0x6f, 0xc0, 0xfb, 0x56, 0xc2, 0xca, 0xb3, 0xed, 0xb, 0x68, 0xda, 0xda, 0xd5, 0xa1, 0x82, 0x94, 0xb3, 0x9d, 0xcf, 0xdb, 0xd4, 0x7, 0x8c, 0xb6, 0xc1, 0x13, 0x91, 0x9, 0x53, 0x8d, 0x66, 0x43, 0x1d, 0x99, 0xa9, 0x43, 0x67, 0xca, 0xa9, 0xc4, 0x64, 0x5c, 0x66, 0xfa, 0x33, 0xdd, 0x68, 0x7, 0x7b, 0xab, 0x7f, 0x2e, 0x5a, 0xfc, 0xcd, 0x4a, 0x8b, 0xcb, 0x36, 0x4e, 0xdf, 0xfe, 0x5b, 0x87, 0x28, 0x2c, 0x87, 0x4a, 0x56, 0x33, 0x6f, 0x8c, 0x43, 0x6b, 0x13, 0xd4, 0x1c, 0x59, 0x62, 0xc0, 0xee, 0x57, 0xb1, 0xa, 0x82, 0x23, 0x4b, 0x58, 0xfe, 0xd0, 0xe3, 0xb8, 0xa9, 0x80, 0x31, 0xe3, 0xb6, 0xa2, 0x2b, 0x1d, 0x64, 0x25, 0xcd, 0x36, 0x9f, 0xd9, 0x36, 0xb7, 0x8b, 0xe7, 0xd5, 0x35, 0xc5, 0x8e, 0x2f, 0xb8, 0x6c, 0x11, 0x6c, 0x6d, 0x3b, 0x8, 0xfc, 0x5a, 0xf3, 0x8a, 0xbe, 0xa, 0x13, 0xc4, 0x18, 0xe2, 0x26, 0xd9, 0xc9, 0x99, 0xbe, 0x2e, 0xb5, 0x23, 0xbc, 0xd3, 0x5f, 0xeb, 0x1, 0x1d, 0x92, 0xfa, 0xff, 0x8f, 0xf5, 0xd7, 0xb2, 0x63, 0xe3, 0x56, 0x69, 0x3, 0xdc, 0xa5, 0x93, 0x7a, 0xd0, 0x6d, 0x34, 0xf7, 0x10, 0x6, 0x8b, 0x96, 0xc6, 0x1f, 0xa6, 0x8f, 0x1a, 0x4b, 0xef, 0xe5, 0x39, 0x23, 0xdf, 0x26, 0x23, 0x59, 0x58, 0xfd, 0xca, 0xf4, 0x6f, 0x75, 0xdd, 0xeb, 0x3e, 0x56, 0x8f, 0x70, 0x7f, 0x85, 0x35, 0x86, 0x4b, 0xe9, 0x26, 0xe3, 0xfa, 0xa0, 0xc7, 0x2d, 0xd9, 0xcb, 0x30, 0x11, 0xf5, 0x56, 0x8b, 0xb2, 0x36, 0xb3, 0x29, 0x73, 0x2b, 0x48, 0x30, 0xfd, 0xeb, 0x6e, 0x20, 0xa1, 0x9f, 0x7c, 0x5f, 0x42, 0x64, 0xc2, 0x54, 0x31, 0x53, 0x4a, 0xca, 0xb8, 0x2c, 0x5b, 0x1a, 0x97, 0x4b, 0xed, 0xac, 0xb6, 0xfa, 0xba, 0xd3, 0x3f, 0xd7, 0x2d, 0xc, 0x47, 0xa1, 0x8d, 0xde, 0x1b, 0xeb, 0xe7, 0x59, 0x8f, 0xd1, 0x72, 0x1f, 0xe2, 0xd2, 0xe6, 0x93, 0xf8, 0x67, 0x29, 0x99, 0x3a, 0x7, 0xd3, 0x27, 0xdf, 0x6a, 0x81, 0xd8, 0xd5, 0xc6, 0x8b, 0x72, 0x27, 0xb0, 0x7c, 0xb0, 0xc6, 0xed, 0x77, 0x2b, 0xb8, 0x69, 0x3b, 0xe, 0x8e, 0x2c, 0x87, 0x7f, 0x6c, 0xfd, 0xdc, 0xc7, 0x18, 0x5e, 0xcb, 0xc8, 0xd9, 0xa6, 0x89, 0x63, 0x4a, 0xdd, 0x5d, 0x48, 0xfb, 0xa2, 0xff, 0xbb, 0xfd, 0x6b, 0x6b, 0x5, 0x33, 0x77, 0x56, 0x7f, 0x6b, 0xda, 0x9f, 0xd4, 0x18, 0xf8, 0x5d, 0xff, 0x1f, 0x85, 0x74, 0xbf, 0x5f, 0x60, 0xa9, 0x6d, 0x75, 0x34, 0x7d, 0x9, 0x91, 0x9, 0x53, 0x47, 0x9, 0xab, 0xcf, 0xd2, 0x7c, 0x53, 0xcc, 0xae, 0x30, 0x9c, 0xef, 0x11, 0xb3, 0xdb, 0x80, 0xdf, 0x1f, 0x9a, 0x8d, 0x36, 0x2a, 0x7d, 0x47, 0xdd, 0x26, 0xc2, 0x2f, 0xe9, 0x72, 0xd0, 0x40, 0x44, 0xad, 0x3b, 0x16, 0x9b, 0xb6, 0xf3, 0x2e, 0x1d, 0xfd, 0xb2, 0xa, 0xf8, 0x5b, 0x43, 0xae, 0x3, 0xed, 0x3b, 0x30, 0xcc, 0x2d, 0xe9, 0x70, 0xae, 0x6d, 0xe1, 0x85, 0x74, 0xb7, 0x81, 0x6c, 0x76, 0xa0, 0x4f, 0x6c, 0x3d, 0xc4, 0x5c, 0x9f, 0x89, 0x85, 0xdd, 0x31, 0xb6, 0x92, 0x8, 0xeb, 0x1e, 0x23, 0x32, 0x21, 0x5, 0xd4, 0xc0, 0x3a, 0x91, 0xe7, 0xac, 0x64, 0x1f, 0x4e, 0x2c, 0x36, 0x83, 0xba, 0xd6, 0x6, 0x75, 0x48, 0xa3, 0xa2, 0xa6, 0x40, 0xbf, 0x9, 0x99, 0x4a, 0x68, 0x2f, 0x36, 0x3f, 0xc, 0x38, 0xae, 0x62, 0x1b, 0xbf, 0x88, 0xcb, 0x7e, 0x7d, 0xc1, 0xa9, 0x6e, 0xdf, 0x2e, 0xc5, 0xe6, 0x4b, 0x2, 0x72, 0x6c, 0x3f, 0xa0, 0xb2, 0xb8, 0x9f, 0x25, 0xe2, 0x43, 0x35, 0xd8, 0xf8, 0x3, 0x29, 0x61, 0xea, 0x40, 0x9e, 0x4a, 0x9a, 0x27, 0xd9, 0x6c, 0xb4, 0xd0, 0xfb, 0x4d, 0x47, 0xed, 0x43, 0xdf, 0xa3, 0x59, 0xa2, 0xc0, 0xb4, 0x1e, 0xb4, 0x15, 0x9b, 0xaa, 0x1f, 0x99, 0x22, 0xdb, 0xf, 0x19, 0xdd, 0xf7, 0x5b, 0x7d, 0xef, 0x8, 0xcc, 0x61, 0xc4, 0xa6, 0xf2, 0x7, 0xcb, 0xc4, 0xfa, 0xd8, 0xd6, 0xba, 0xb7, 0x28, 0xb3, 0x97, 0x88, 0x4c, 0xc8, 0xc1, 0x98, 0xa7, 0x22, 0x36, 0x37, 0xfa, 0x3e, 0x7e, 0xd3, 0x2, 0x73, 0x33, 0xf2, 0xe7, 0x31, 0x3b, 0x16, 0xd9, 0xd8, 0x3, 0x5d, 0x39, 0xcb, 0xdf, 0xf4, 0xd7, 0x4d, 0xa2, 0xf7, 0x78, 0x6e, 0xdd, 0x23, 0xe3, 0x66, 0x78, 0xb1, 0xb9, 0xb2, 0xda, 0x7f, 0xaa, 0xe2, 0xfe, 0xc1, 0xa, 0x52, 0x26, 0x15, 0x9c, 0xfd, 0xd1, 0xd1, 0xe9, 0x19, 0x10, 0x90, 0x82, 0xd8, 0x1c, 0xe4, 0x8c, 0xd6, 0xe, 0x8d, 0xe2, 0x5a, 0x9e, 0x33, 0x96, 0xef, 0x23, 0x34, 0x28, 0x66, 0x57, 0xe7, 0x3e, 0x11, 0xff, 0x10, 0xb1, 0xb0, 0xff, 0x72, 0xa0, 0x1d, 0xb7, 0xd8, 0xbb, 0xd1, 0xc7, 0xea, 0x7b, 0x4b, 0xc, 0x4c, 0xc6, 0x89, 0x1e, 0x10, 0x96, 0xaf, 0xf5, 0x38, 0xb9, 0x12, 0xb2, 0xff, 0xb1, 0xf4, 0xb1, 0x13, 0x79, 0x2e, 0xed, 0x16, 0xfb, 0x78, 0x7f, 0xd8, 0x33, 0x2e, 0x26, 0x67, 0xa3, 0xfe, 0xf0, 0xe7, 0xbf, 0xfe, 0x5d, 0x7d, 0x2d, 0x5f, 0x78, 0xbd, 0xa2, 0x5f, 0x42, 0x42, 0x98, 0x7a, 0x76, 0xef, 0xa4, 0xfb, 0xd2, 0x41, 0x6d, 0x44, 0xa5, 0x1a, 0x67, 0xa6, 0x64, 0x46, 0x3d, 0xc1, 0x76, 0x2d, 0xe4, 0x79, 0x1d, 0x6c, 0x1d, 0xf9, 0x3d, 0xd8, 0x9f, 0x75, 0x57, 0x18, 0x20, 0x4, 0xe2, 0x63, 0x66, 0x8d, 0xd7, 0x99, 0xc4, 0xb9, 0x1e, 0xd8, 0x1e, 0xc3, 0x1b, 0xfa, 0xd1, 0xe4, 0x6c, 0x57, 0x19, 0x91, 0x4f, 0xa8, 0xf4, 0xf5, 0x65, 0xa, 0x82, 0xf2, 0xdf, 0xff, 0xfa, 0xa7, 0xb7, 0xc8, 0x4, 0xc8, 0x11, 0x65, 0x54, 0x8e, 0x7, 0x74, 0x60, 0x95, 0x25, 0xc2, 0xee, 0x10, 0x36, 0x0, 0x8d, 0x44, 0xa7, 0xba, 0xfa, 0x2c, 0x3, 0x73, 0x8, 0x53, 0xce, 0x66, 0xcb, 0x18, 0x4e, 0xb6, 0x7f, 0xa9, 0x7e, 0xf5, 0x46, 0xe, 0xef, 0x2c, 0xef, 0xb2, 0x2f, 0x99, 0x7e, 0x54, 0x4d, 0xad, 0xb1, 0x7c, 0x44, 0x26, 0xbb, 0xcb, 0x21, 0x67, 0x4c, 0xd4, 0xb8, 0xb2, 0xa2, 0xda, 0x42, 0xb, 0x4f, 0x23, 0x42, 0x65, 0xe7, 0x35, 0x9b, 0x7d, 0xe5, 0x8d, 0x6c, 0xa7, 0x73, 0xb7, 0xe7, 0xdf, 0x0, 0xa0, 0x9d, 0x63, 0x36, 0x63, 0x6e, 0xb5, 0x13, 0x30, 0x8a, 0x35, 0x76, 0xf7, 0x95, 0x23, 0x7a, 0x29, 0x90, 0x34, 0x81, 0xdf, 0xae, 0x6d, 0x50, 0x7c, 0xb7, 0x5e, 0xaf, 0x69, 0xfe, 0xac, 0xfa, 0xd7, 0x6e, 0xbf, 0x39, 0x7e, 0xa1, 0x1f, 0x95, 0xe, 0xbf, 0x60, 0xff, 0xdc, 0xa6, 0xd6, 0xe6, 0x24, 0xf9, 0xaf, 0x0, 0x3, 0x0, 0x58, 0xbf, 0x46, 0x22, 0x7, 0x65, 0x51, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)parse_logo3x_png { - return [NSData dataWithBytes:parse_logo3x_png length:sizeof(parse_logo3x_png)]; - } - - static const unsigned char apple_icon_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x16, 0x8, 0x6, 0x0, 0x0, 0x0, 0xcd, 0x5f, 0xcc, 0x41, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x1, 0x54, 0x49, 0x44, 0x41, 0x54, 0x38, 0x11, 0xa5, 0x93, 0x31, 0x2c, 0x83, 0x41, 0x14, 0xc7, 0xbf, 0xfb, 0x52, 0xd4, 0x86, 0xa5, 0x13, 0x91, 0x8a, 0x44, 0x22, 0x6, 0x6, 0x83, 0x98, 0x24, 0x62, 0xb3, 0x74, 0xb3, 0x4a, 0xba, 0x32, 0x1a, 0xd, 0x16, 0x89, 0xd1, 0x6a, 0x68, 0x62, 0x94, 0xb0, 0xd9, 0x30, 0x18, 0x6c, 0x48, 0x58, 0x1a, 0x2c, 0x6, 0xb1, 0x10, 0x83, 0x90, 0x56, 0xfa, 0xf9, 0xbd, 0xea, 0xbb, 0x6b, 0x85, 0xc4, 0x3d, 0x2f, 0xf9, 0xe5, 0xbd, 0x77, 0xf7, 0xfe, 0xff, 0x5c, 0xbf, 0xde, 0x25, 0x49, 0x44, 0x64, 0x59, 0x56, 0x86, 0x6b, 0x58, 0x8c, 0x90, 0x85, 0x51, 0x84, 0x29, 0xec, 0x82, 0xc6, 0x68, 0xd8, 0x8d, 0xa8, 0x50, 0xaf, 0xa8, 0x3, 0xf9, 0xc, 0x5c, 0x84, 0x3c, 0x8c, 0x22, 0xbc, 0x6d, 0x19, 0x3d, 0x91, 0x27, 0xc3, 0x4e, 0x44, 0x85, 0xb0, 0x1f, 0x1a, 0x70, 0x4, 0x23, 0xbf, 0x49, 0x3b, 0x8e, 0xc8, 0xe0, 0x18, 0x83, 0x73, 0x30, 0xe, 0xf7, 0xb0, 0xf, 0x55, 0xe8, 0x81, 0x1, 0x28, 0xc1, 0x14, 0x74, 0xc3, 0x25, 0x54, 0x9c, 0x73, 0x8f, 0xe4, 0xaf, 0xc0, 0x20, 0x7, 0xeb, 0xf0, 0x1, 0xdf, 0xe3, 0x9c, 0x85, 0x53, 0xf8, 0x69, 0xef, 0x95, 0xf5, 0x25, 0xf5, 0x49, 0x68, 0xb6, 0xc0, 0x1a, 0x2f, 0x8, 0xb, 0x62, 0x32, 0x1, 0x75, 0xa3, 0x4b, 0xd, 0xdd, 0x6c, 0xf3, 0x44, 0x14, 0x15, 0xa3, 0x89, 0xc8, 0x36, 0xdb, 0x7f, 0xd6, 0xdd, 0x3f, 0x8c, 0xfc, 0x55, 0x70, 0x98, 0xbc, 0xe1, 0x9a, 0xf7, 0xce, 0x7f, 0x2f, 0x1a, 0x8c, 0xf6, 0xf2, 0xaf, 0xd5, 0x44, 0x92, 0x42, 0x5d, 0xa, 0x43, 0x88, 0xd6, 0x1f, 0x40, 0x9a, 0x70, 0xf, 0xe2, 0xdd, 0x16, 0x54, 0x22, 0x46, 0x17, 0xda, 0x18, 0xb2, 0x5c, 0x9b, 0x3e, 0xd1, 0x89, 0xd1, 0xb1, 0xc1, 0x40, 0x25, 0x43, 0x14, 0x87, 0x98, 0xd, 0xca, 0xc7, 0x2e, 0xd0, 0xc8, 0x73, 0xe8, 0xd2, 0x5d, 0x43, 0x3e, 0x49, 0x5b, 0x6f, 0x65, 0xcf, 0x20, 0x6e, 0x97, 0xec, 0x34, 0x1b, 0x4e, 0x55, 0x84, 0x77, 0xb0, 0xc4, 0x15, 0xa2, 0x9c, 0x77, 0xa5, 0x59, 0x33, 0xb8, 0xc8, 0x43, 0x9e, 0xf1, 0x26, 0x52, 0xb0, 0x20, 0xdf, 0xeb, 0x20, 0xd2, 0x6c, 0xb5, 0xc3, 0x44, 0x1b, 0x4c, 0xf2, 0xb0, 0xd, 0xcf, 0x70, 0x3, 0x1b, 0x30, 0xd, 0xc3, 0x30, 0xf, 0xf2, 0x2e, 0x1f, 0xa0, 0xa, 0xcb, 0xaa, 0x93, 0xfc, 0x9, 0x73, 0x3f, 0x88, 0x2b, 0xe2, 0x2d, 0x37, 0x24, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - + (NSData *)apple_icon_png { - return [NSData dataWithBytes:apple_icon_png length:sizeof(apple_icon_png)]; - } - -@end diff --git a/ParseUI/ParseUI/Source/PFSignUpView.h b/ParseUI/ParseUI/Source/PFSignUpView.h deleted file mode 100644 index 0ad10c9b8..000000000 --- a/ParseUI/ParseUI/Source/PFSignUpView.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -#import "ParseUIConstants.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - `PFSignUpFields` bitmask specifies the sign up elements which are enabled in the view. - - @see PFSignUpViewController - @see PFSignUpView - */ -typedef NS_OPTIONS(NSInteger, PFSignUpFields) { - /** Username and password fields. */ - PFSignUpFieldsUsernameAndPassword = 1 << 0, - /** Email field. */ - PFSignUpFieldsEmail = 1 << 1, - /** This field can be used for something else. */ - PFSignUpFieldsAdditional = 1 << 2, - /** Sign Up Button */ - PFSignUpFieldsSignUpButton = 1 << 3, - /** Dismiss Button */ - PFSignUpFieldsDismissButton = 1 << 4, - /** Default value. Combines Username, Password, Email, Sign Up and Dismiss Buttons. */ - PFSignUpFieldsDefault = (PFSignUpFieldsUsernameAndPassword | - PFSignUpFieldsEmail | - PFSignUpFieldsSignUpButton | - PFSignUpFieldsDismissButton) -}; - -/** - `PFSignUpFields`'s accessibity identifiers - - @see PFSignUpView - */ -extern NSString *const PFSignUpViewUsernameFieldAccessibilityIdentifier; -extern NSString *const PFSignUpViewEmailFieldAccessibilityIdentifier; -extern NSString *const PFSignUpViewPasswordFieldAccessibilityIdentifier; -extern NSString *const PFSignUpViewAdditionalFieldAccessibilityIdentifier; -extern NSString *const PFSignUpViewSignUpButtonAccessibilityIdentifier; -extern NSString *const PFSignUpViewDismissButtonAccessibilityIdentifier; - -@class PFTextField; - -/** - The `PFSignUpView` class provides a standard sign up interface for authenticating a `PFUser`. - */ -@interface PFSignUpView : UIScrollView - -///-------------------------------------- -/// @name Creating SignUp View -///-------------------------------------- - -/** - Initializes the view with the specified sign up elements. - - @param fields A bitmask specifying the sign up elements which are enabled in the view - - @return An initialized `PFSignUpView` object or `nil` if the object couldn't be created. - - @see PFSignUpFields - */ -- (instancetype)initWithFields:(PFSignUpFields)fields; - -/** - The view controller that will present this view. - - Used to lay out elements correctly when the presenting view controller has translucent elements. - */ -@property (nullable, nonatomic, weak) UIViewController *presentingViewController; - -///-------------------------------------- -/// @name Customizing the Logo -///-------------------------------------- - -/** - The logo. By default, it is the Parse logo. - */ -@property (nullable, nonatomic, strong) UIView *logo; - -///-------------------------------------- -/// @name Configure Username Behaviour -///-------------------------------------- - -/** - If email should be used to log in, instead of username - - By default, this is set to `NO`. - */ -@property (nonatomic, assign) BOOL emailAsUsername; - -///-------------------------------------- -/// @name Sign Up Elements -///-------------------------------------- - -/** - The bitmask which specifies the enabled sign up elements in the view - */ -@property (nonatomic, assign, readonly) PFSignUpFields fields; - -/** - The username text field. - */ -@property (nullable, nonatomic, strong, readonly) PFTextField *usernameField; - -/** - The password text field. - */ -@property (nullable, nonatomic, strong, readonly) PFTextField *passwordField; - -/** - The email text field. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) PFTextField *emailField; - -/** - The additional text field. It is `nil` if the element is not enabled. - - This field is intended to be customized. - */ -@property (nullable, nonatomic, strong, readonly) PFTextField *additionalField; - -/** - The sign up button. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *signUpButton; - -/** - The dismiss button. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *dismissButton; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFSignUpView.m b/ParseUI/ParseUI/Source/PFSignUpView.m deleted file mode 100644 index e75918752..000000000 --- a/ParseUI/ParseUI/Source/PFSignUpView.m +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFSignUpView.h" - -#import "PFColor.h" -#import "PFDismissButton.h" -#import "PFImage.h" -#import "PFLocalization.h" -#import "PFPrimaryButton.h" -#import "PFRect.h" -#import "PFTextButton.h" -#import "PFTextField.h" - -static NSString *const PFSignUpViewDefaultLogoImageName = @"parse_logo.png"; - -///-------------------------------------- -#pragma mark - Accessibility Identifiers -///-------------------------------------- - -NSString *const PFSignUpViewUsernameFieldAccessibilityIdentifier = @"PFSignUpViewUsernameFieldAccessibilityIdentifier"; -NSString *const PFSignUpViewEmailFieldAccessibilityIdentifier = @"PFSignUpViewEmailFieldAccessibilityIdentifier"; -NSString *const PFSignUpViewPasswordFieldAccessibilityIdentifier = @"PFSignUpViewPasswordFieldAccessibilityIdentifier"; -NSString *const PFSignUpViewAdditionalFieldAccessibilityIdentifier = @"PFSignUpViewAdditionalFieldAccessibilityIdentifier"; -NSString *const PFSignUpViewSignUpButtonAccessibilityIdentifier = @"PFSignUpViewSignUpButtonAccessibilityIdentifier"; -NSString *const PFSignUpViewDismissButtonAccessibilityIdentifier = @"PFSignUpViewDismissButtonAccessibilityIdentifier"; - -@implementation PFSignUpView - -#pragma mark - -#pragma mark NSObject - -- (instancetype)initWithFields:(PFSignUpFields)otherFields { - self = [super init]; - if (!self) return nil; - - _fields = otherFields; - - self.opaque = YES; - self.backgroundColor = [PFColor commonBackgroundColor]; - - _logo = [[UIImageView alloc] initWithImage:[PFImage imageNamed:PFSignUpViewDefaultLogoImageName]]; - _logo.contentMode = UIViewContentModeScaleAspectFit; - [self addSubview:_logo]; - - if (_fields & PFSignUpFieldsDismissButton) { - _dismissButton = [[PFDismissButton alloc] initWithFrame:CGRectZero]; - _dismissButton.accessibilityIdentifier = PFSignUpViewDismissButtonAccessibilityIdentifier; - [self addSubview:_dismissButton]; - } - - _usernameField = [[PFTextField alloc] initWithFrame:CGRectZero - separatorStyle:(PFTextFieldSeparatorStyleTop | - PFTextFieldSeparatorStyleBottom)]; - _usernameField.accessibilityIdentifier = PFSignUpViewUsernameFieldAccessibilityIdentifier; - _usernameField.autocorrectionType = UITextAutocorrectionTypeNo; - _usernameField.autocapitalizationType = UITextAutocapitalizationTypeNone; - _usernameField.returnKeyType = UIReturnKeyNext; - [self addSubview:_usernameField]; - [self _updateUsernameFieldStyle]; - - _passwordField = [[PFTextField alloc] initWithFrame:CGRectZero - separatorStyle:PFTextFieldSeparatorStyleBottom]; - _passwordField.accessibilityIdentifier = PFSignUpViewPasswordFieldAccessibilityIdentifier; - _passwordField.placeholder = PFLocalizedString(@"Password", @"Password"); - _passwordField.secureTextEntry = YES; - _passwordField.autocorrectionType = UITextAutocorrectionTypeNo; - _passwordField.autocapitalizationType = UITextAutocapitalizationTypeNone; - if (!(_fields & PFSignUpFieldsEmail) && !(_fields & PFSignUpFieldsAdditional)) { - _passwordField.returnKeyType = UIReturnKeyDone; - } else { - _passwordField.returnKeyType = UIReturnKeyNext; - } - [self addSubview:_passwordField]; - - if (_fields & PFSignUpFieldsEmail) { - _emailField = [[PFTextField alloc] initWithFrame:CGRectZero - separatorStyle:PFTextFieldSeparatorStyleBottom]; - _emailField.accessibilityIdentifier = PFSignUpViewEmailFieldAccessibilityIdentifier; - _emailField.autocorrectionType = UITextAutocorrectionTypeNo; - _emailField.autocapitalizationType = UITextAutocapitalizationTypeNone; - _emailField.keyboardType = UIKeyboardTypeEmailAddress; - _emailField.placeholder = PFLocalizedString(@"Email", @"Email"); - if (!(_fields & PFSignUpFieldsAdditional)) { - _emailField.returnKeyType = UIReturnKeyDone; - } else { - _emailField.returnKeyType = UIReturnKeyNext; - } - [self addSubview:_emailField]; - } - - if (_fields & PFSignUpFieldsAdditional) { - _additionalField = [[PFTextField alloc] initWithFrame:CGRectZero - separatorStyle:PFTextFieldSeparatorStyleBottom]; - _additionalField.accessibilityIdentifier = PFSignUpViewAdditionalFieldAccessibilityIdentifier; - _additionalField.autocorrectionType = UITextAutocorrectionTypeNo; - _additionalField.autocapitalizationType = UITextAutocapitalizationTypeNone; - _additionalField.placeholder = PFLocalizedString(@"Additional", @"Additional"); - _additionalField.returnKeyType = UIReturnKeyDone; - [self addSubview:_additionalField]; - } - - if (_fields & PFSignUpFieldsSignUpButton) { - _signUpButton = [[PFPrimaryButton alloc] initWithBackgroundImageColor:[PFColor signupButtonBackgroundColor]]; - _signUpButton.accessibilityIdentifier = PFSignUpViewSignUpButtonAccessibilityIdentifier; - [_signUpButton setTitle:PFLocalizedString(@"Sign Up", @"Sign Up") forState:UIControlStateNormal]; - [self addSubview:_signUpButton]; - } - - return self; -} - -#pragma mark - -#pragma mark UIView - -- (void)layoutSubviews { - [super layoutSubviews]; - - CGRect bounds = self.bounds; - - if (_dismissButton) { - CGPoint origin = CGPointMake(16.0f, 16.0f); - - // In iOS 7+, if the view controller that contains this view - // is presented modally, it's edges extend under the status bar. - // This lets us move down the dismiss button a bit so that it's not covered by the status bar. - UIViewController *presentingViewController = self.presentingViewController; - if ([presentingViewController respondsToSelector:@selector(topLayoutGuide)]) { - origin.y += presentingViewController.topLayoutGuide.length; - } - - CGRect frame = PFRectMakeWithOriginSize(origin, [_dismissButton sizeThatFits:bounds.size]); - _dismissButton.frame = frame; - } - - const CGRect contentRect = PFRectMakeWithSizeCenteredInRect([self _contentSizeThatFits:bounds.size], - PFRectMakeWithSize(bounds.size)); - const CGSize contentSize = contentRect.size; - const CGSize contentSizeScale = [self _contentSizeScaleForContentSize:bounds.size]; - - CGFloat currentY = CGRectGetMinY(contentRect); - if (_logo) { - CGFloat logoTopInset = floor(48.0f * contentSizeScale.height); - CGFloat logoBottomInset = floor(36.0f * contentSizeScale.height); - - CGFloat logoAvailableHeight = floor(68.0f * contentSizeScale.height); - - CGSize logoSize = [_logo sizeThatFits:CGSizeMake(contentSize.width, logoAvailableHeight)]; - logoSize.width = MIN(contentSize.width, logoSize.width); - logoSize.height = MIN(logoAvailableHeight, logoSize.height); - - CGRect frame = PFRectMakeWithSizeCenteredInRect(logoSize, contentRect); - frame.origin.y = CGRectGetMinY(contentRect) + logoTopInset; - _logo.frame = CGRectIntegral(frame); - - currentY = floor(CGRectGetMaxY(frame) + logoBottomInset); - } - - if (_usernameField) { - CGRect frame = PFRectMakeWithSizeCenteredInRect([_usernameField sizeThatFits:contentSize], contentRect); - frame.origin.y = currentY; - _usernameField.frame = frame; - - currentY = CGRectGetMaxY(frame); - } - - if (_passwordField) { - CGRect frame = PFRectMakeWithSizeCenteredInRect([_passwordField sizeThatFits:contentSize], contentRect); - frame.origin.y = currentY; - _passwordField.frame = frame; - - currentY = CGRectGetMaxY(frame); - } - - if (_emailField && !_emailAsUsername) { - CGRect frame = PFRectMakeWithSizeCenteredInRect([_emailField sizeThatFits:contentSize], contentRect); - frame.origin.y = currentY; - _emailField.frame = frame; - - currentY = CGRectGetMaxY(frame); - } - - if (_additionalField) { - CGRect frame = PFRectMakeWithSizeCenteredInRect([_additionalField sizeThatFits:contentSize], contentRect); - frame.origin.y = currentY; - _additionalField.frame = frame; - - currentY = CGRectGetMaxY(frame); - } - - if (_signUpButton) { - CGFloat loginButtonTopInset = floor(24.0f * contentSizeScale.height); - - CGRect frame = PFRectMakeWithSizeCenteredInRect([_signUpButton sizeThatFits:contentSize], contentRect);; - frame.origin.y = currentY + loginButtonTopInset; - _signUpButton.frame = frame; - - currentY = CGRectGetMaxY(frame); - } -} - -- (CGSize)_contentSizeThatFits:(CGSize)boundingSize { - CGSize maxContentSize = [self _maxContentSize]; - CGSize contentSizeScale = [self _contentSizeScaleForContentSize:boundingSize]; - - CGSize size = PFSizeMin(maxContentSize, boundingSize); - size.height = 0.0f; - if (_logo) { - CGFloat logoTopInset = floor(36.0f * contentSizeScale.height); - CGFloat logoBottomInset = floor(36.0f * contentSizeScale.height); - - CGFloat logoAvailableHeight = floor(68.0f * contentSizeScale.height); - - CGFloat scale = MAX(contentSizeScale.width, contentSizeScale.height); - - CGSize logoSize = [_logo sizeThatFits:CGSizeMake(boundingSize.width, logoAvailableHeight)]; - logoSize.height *= scale; - logoSize.width *= scale; - - size.height += logoSize.height + logoTopInset + logoBottomInset; - } - if (_usernameField) { - CGSize fieldSize = [_usernameField sizeThatFits:boundingSize]; - size.height += fieldSize.height; - } - if (_passwordField) { - CGSize fieldSize = [_passwordField sizeThatFits:boundingSize]; - size.height += fieldSize.height; - } - if (_emailField && !_emailAsUsername) { - CGSize fieldSize = [_emailField sizeThatFits:boundingSize]; - size.height += fieldSize.height; - } - if (_additionalField) { - CGSize fieldSize = [_additionalField sizeThatFits:boundingSize]; - size.height += fieldSize.height; - } - if (_signUpButton) { - CGFloat buttonTopInset = floor(24.0f * contentSizeScale.height); - - CGSize buttonSize = [_signUpButton sizeThatFits:boundingSize]; - - size.height += buttonSize.height + buttonTopInset; - } - - size.width = floor(size.width); - size.height = floor(size.height); - - return size; -} - -- (CGSize)_maxContentSize { - return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? - CGSizeMake(420.0f, 500.0f) : - CGSizeMake(500.0f, 800.0f)); -} - -- (CGSize)_contentSizeScaleForContentSize:(CGSize)contentSize { - CGSize maxContentSize = [self _maxContentSize]; - if (maxContentSize.width < contentSize.width && - maxContentSize.height < contentSize.height) { - return CGSizeMake(1.0f, 1.0f); - } - - CGSize contentSizeScale = CGSizeMake(contentSize.width / maxContentSize.width, - contentSize.height / maxContentSize.height); - return contentSizeScale; -} - -#pragma mark - -#pragma mark PFSignUpView - -- (void)setLogo:(UIView *)logo { - if (self.logo != logo) { - [_logo removeFromSuperview]; - _logo = logo; - [self addSubview:_logo]; - - [self setNeedsLayout]; - } -} - -- (void)setEmailAsUsername:(BOOL)otherEmailAsUsername { - if (_emailAsUsername != otherEmailAsUsername) { - _emailAsUsername = otherEmailAsUsername; - - if (_emailAsUsername) { - if (_emailField.superview) { - [_emailField removeFromSuperview]; - } - } else { - if (_emailField.superview == nil) { - [self addSubview:_emailField]; - } - [self setNeedsLayout]; - } - [self _updateUsernameFieldStyle]; - } -} - -#pragma mark - -#pragma mark Private - -- (void)_updateUsernameFieldStyle { - UIKeyboardType keyboardType = UIKeyboardTypeDefault; - NSString *placeholder = nil; - if (!_emailAsUsername) { - placeholder = PFLocalizedString(@"Username", @"Username"); - keyboardType = UIKeyboardTypeDefault; - } else { - placeholder = PFLocalizedString(@"Email", @"Email"); - keyboardType = UIKeyboardTypeEmailAddress; - } - - _usernameField.placeholder = placeholder; - _usernameField.keyboardType = keyboardType; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFSignUpViewController.h b/ParseUI/ParseUI/Source/PFSignUpViewController.h deleted file mode 100644 index 6c667d15e..000000000 --- a/ParseUI/ParseUI/Source/PFSignUpViewController.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import -#import "ParseUIConstants.h" -#import "PFSignUpView.h" - -@import ParseCore; - -@class PFUser; -@protocol PFSignUpViewControllerDelegate; - -NS_ASSUME_NONNULL_BEGIN - -/** - The `PFSignUpViewController` class that presents and manages - a standard authentication interface for signing up a `PFUser`. - */ -@interface PFSignUpViewController : UIViewController - -///-------------------------------------- -/// @name Configuring Sign Up Elements -///-------------------------------------- - -/** - A bitmask specifying the log in elements which are enabled in the view. - - @see PFSignUpFields - */ -@property (nonatomic, assign) PFSignUpFields fields; - -/** - The sign up view. It contains all the enabled log in elements. - - @see PFSignUpView - */ -@property (nullable, nonatomic, strong, readonly) PFSignUpView *signUpView; - -///-------------------------------------- -/// @name Configuring Sign Up Behaviors -///-------------------------------------- - -/** - The delegate that responds to the control events of `PFSignUpViewController`. - - @see PFSignUpViewControllerDelegate - */ -@property (nullable, nonatomic, weak) id delegate; - -/** - Minimum required password length for user signups, defaults to `0`. - */ -@property (nonatomic, assign) NSUInteger minPasswordLength; - -/** - Whether to use the email as username on the attached `signUpView`. - - If set to `YES`, we'll hide the email field, prompt for the email in - the username field, and save the email into both username and email - fields on the new `PFUser` object. By default, this is set to `NO`. - */ -@property (nonatomic, assign) BOOL emailAsUsername; - -@end - -///-------------------------------------- -/// @name Notifications -///-------------------------------------- - -/** - The notification is posted immediately after the sign up succeeds. - */ -extern NSString *const PFSignUpSuccessNotification; - -/** - The notification is posted immediately after the sign up fails. - - If the delegate prevents the sign up to start, the notification is not sent. - */ -extern NSString *const PFSignUpFailureNotification; - -/** - The notification is posted immediately after the user cancels sign up. - */ -extern NSString *const PFSignUpCancelNotification; - -///-------------------------------------- -// @name Keys for info dictionary on `signUpViewController:shouldBeginSignUp` delegate method. -///-------------------------------------- - -/** - Username supplied during sign up. - */ -extern NSString *const PFSignUpViewControllerDelegateInfoUsernameKey; - -/** - Password supplied during sign up. - */ -extern NSString *const PFSignUpViewControllerDelegateInfoPasswordKey; - -/** - Email address supplied during sign up. - */ -extern NSString *const PFSignUpViewControllerDelegateInfoEmailKey; - -/** - Additional info supplied during sign up. - */ -extern NSString *const PFSignUpViewControllerDelegateInfoAdditionalKey; - -///-------------------------------------- -/// @name PFSignUpViewControllerDelegate -///-------------------------------------- - -/** - The `PFLogInViewControllerDelegate` protocol defines methods a delegate of a `PFSignUpViewController` should implement. - All methods of this protocol are optional. - */ -@protocol PFSignUpViewControllerDelegate - -@optional - -///-------------------------------------- -/// @name Customizing Behavior -///-------------------------------------- - -/** - Sent to the delegate to determine whether the sign up request should be submitted to the server. - - @param signUpController The signup view controller that is requesting the data. - @param info An `NSDictionary` instance which contains all sign up information that the user entered. - - @return A `BOOL` indicating whether the sign up should proceed. - */ -- (BOOL)signUpViewController:(PFSignUpViewController *)signUpController shouldBeginSignUp:(NSDictionary *)info; - -///-------------------------------------- -/// @name Responding to Actions -///-------------------------------------- - -/** - Sent to the delegate when a `PFUser` is signed up. - - @param signUpController The signup view controller where signup finished. - @param user `PFUser` object that is a result of the sign up. - */ -- (void)signUpViewController:(PFSignUpViewController *)signUpController didSignUpUser:(PFUser *)user; - -/** - Sent to the delegate when the sign up attempt fails. - - @param signUpController The signup view controller where signup failed. - @param error `NSError` object representing the error that occured. - */ -- (void)signUpViewController:(PFSignUpViewController *)signUpController didFailToSignUpWithError:(nullable NSError *)error; - -/** - Sent to the delegate when the sign up screen is cancelled. - - @param signUpController The signup view controller where signup was cancelled. - */ -- (void)signUpViewControllerDidCancelSignUp:(PFSignUpViewController *)signUpController; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFSignUpViewController.m b/ParseUI/ParseUI/Source/PFSignUpViewController.m deleted file mode 100644 index 2f6431e46..000000000 --- a/ParseUI/ParseUI/Source/PFSignUpViewController.m +++ /dev/null @@ -1,514 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFSignUpViewController.h" -#import "PFUIAlertView.h" -#import "PFLocalization.h" -#import "PFPrimaryButton.h" -#import "PFTextField.h" - -@import ParseCore; - -NSString *const PFSignUpSuccessNotification = @"com.parse.ui.signup.success"; -NSString *const PFSignUpFailureNotification = @"com.parse.ui.signup.failure"; -NSString *const PFSignUpCancelNotification = @"com.parse.ui.signup.cancel"; - -// Keys that are used to pass information to the delegate on `signUpViewController:shouldBeginSignUp`. -NSString *const PFSignUpViewControllerDelegateInfoUsernameKey = @"username"; -NSString *const PFSignUpViewControllerDelegateInfoPasswordKey = @"password"; -NSString *const PFSignUpViewControllerDelegateInfoEmailKey = @"email"; -NSString *const PFSignUpViewControllerDelegateInfoAdditionalKey = @"additional"; - -@interface PFSignUpViewController () { - struct { - BOOL shouldSignUp : YES; - BOOL didSignUp : YES; - BOOL didFailToSignUp : YES; - BOOL didCancelSignUp : YES; - } _delegateExistingMethods; -} - -@property (nonatomic, strong, readwrite) PFSignUpView *signUpView; - -@property (nonatomic, assign) BOOL loading; - -@property (nonatomic, assign) CGFloat visibleKeyboardHeight; - -@end - -@implementation PFSignUpViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)init { - self = [super init]; - if (self) { - [self _commonInit]; - } - return self; -} - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - [self _commonInit]; - } - return self; -} - -- (instancetype)initWithCoder:(NSCoder *)decoder { - self = [super initWithCoder:decoder]; - if (self) { - [self _commonInit]; - } - return self; -} - -- (void)_commonInit { - self.modalTransitionStyle = UIModalTransitionStyleCoverVertical; - self.modalPresentationStyle = UIModalPresentationFormSheet; - _fields = PFSignUpFieldsDefault; - - if ([self respondsToSelector:@selector(automaticallyAdjustsScrollViewInsets)]) { - self.automaticallyAdjustsScrollViewInsets = NO; - } -} - -#pragma mark - -#pragma mark Dealloc - -- (void)dealloc { - // Unregister from all notifications - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -#pragma mark - -#pragma mark UIViewController - -- (void)loadView { - _signUpView = [[PFSignUpView alloc] initWithFields:_fields]; - _signUpView.presentingViewController = self; - self.view = _signUpView; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - [self _setupHandlers]; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - - [self _registerForKeyboardNotifications]; - if (self.navigationController && - self.fields & PFSignUpFieldsDismissButton) { - self.fields = self.fields & ~PFSignUpFieldsDismissButton; - - [_signUpView.dismissButton removeFromSuperview]; - } -} - -#pragma mark - -#pragma mark Rotation - -- (UIInterfaceOrientationMask)supportedInterfaceOrientations { - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { - return UIInterfaceOrientationMaskAll; - } - - return UIInterfaceOrientationMaskPortrait; -} - -#pragma mark - -#pragma mark PFSignUpViewController - -- (PFSignUpView *)signUpView { - return (PFSignUpView *)self.view; // self.view will call loadView if the view is nil -} - -- (void)setDelegate:(id)delegate { - if (self.delegate != delegate) { - _delegate = delegate; - - _delegateExistingMethods.shouldSignUp = [delegate respondsToSelector:@selector(signUpViewController: - shouldBeginSignUp:)]; - _delegateExistingMethods.didSignUp = [delegate respondsToSelector:@selector(signUpViewController: - didSignUpUser:)]; - _delegateExistingMethods.didFailToSignUp = [delegate respondsToSelector:@selector(signUpViewController: - didFailToSignUpWithError:)]; - _delegateExistingMethods.didCancelSignUp = [delegate - respondsToSelector:@selector(signUpViewControllerDidCancelSignUp:)]; - } -} - -- (void)setEmailAsUsername:(BOOL)otherEmailAsUsername { - self.signUpView.emailAsUsername = otherEmailAsUsername; -} - -- (BOOL)emailAsUsername { - return self.signUpView.emailAsUsername; -} - -#pragma mark - -#pragma mark UITextFieldDelegate - -- (void)textFieldDidBeginEditing:(UITextField *)textField { - [self _updateSignUpViewContentOffsetAnimated:YES]; -} - -- (BOOL)textFieldShouldReturn:(UITextField *)textField { - if (textField == _signUpView.usernameField) { - [_signUpView.passwordField becomeFirstResponder]; - return YES; - } - - if (textField == _signUpView.passwordField) { - if (_signUpView.emailField) { - [_signUpView.emailField becomeFirstResponder]; - return YES; - } else if (_signUpView.additionalField) { - [_signUpView.additionalField becomeFirstResponder]; - return YES; - } - } - - if (textField == _signUpView.emailField) { - if (_signUpView.additionalField) { - [_signUpView.additionalField becomeFirstResponder]; - return YES; - } - } - - [self _signUpAction]; - - return YES; -} - -#pragma mark - -#pragma mark Private - -- (void)_setupHandlers { - _signUpView.delegate = self; // UIScrollViewDelegate - [_signUpView.dismissButton addTarget:self - action:@selector(_dismissAction) - forControlEvents:UIControlEventTouchUpInside]; - _signUpView.usernameField.delegate = self; - _signUpView.passwordField.delegate = self; - _signUpView.emailField.delegate = self; - _signUpView.additionalField.delegate = self; - [_signUpView.signUpButton addTarget:self - action:@selector(_signUpAction) - forControlEvents:UIControlEventTouchUpInside]; - - UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] - initWithTarget:self - action:@selector(_dismissKeyboard)]; - gestureRecognizer.cancelsTouchesInView = NO; - [_signUpView addGestureRecognizer:gestureRecognizer]; -} - -- (void)_dismissAction { - [self _cancelSignUp]; - - // Normally the role of dismissing a modal controller lies on the presenting controller. - // Here we violate the principle so that the presenting modal log in controller is especially easy. - // Cons of this design is that it makes working with non-modally presented log in controller hard; - // but this concern is mitigated by the fact that navigationally presented controller should not have - // dismiss button. - - [self dismissViewControllerAnimated:YES completion:nil]; -} - -- (void)_signUpAction { - if (self.loading) { - return; - } - - [self _dismissKeyboard]; - - NSString *username = _signUpView.usernameField.text ?: @""; - NSString *password = _signUpView.passwordField.text ?: @""; - NSString *email = (self.emailAsUsername ? username : _signUpView.emailField.text); - email = [email stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; - - NSString *additional = _signUpView.additionalField.text; - - NSMutableDictionary *dictionary = [@{ PFSignUpViewControllerDelegateInfoUsernameKey : username, - PFSignUpViewControllerDelegateInfoPasswordKey : password } mutableCopy]; - - if (email) { - dictionary[PFSignUpViewControllerDelegateInfoEmailKey] = email; - } - if (additional) { - dictionary[PFSignUpViewControllerDelegateInfoAdditionalKey] = additional; - } - - if (_delegateExistingMethods.shouldSignUp) { - if (![_delegate signUpViewController:self shouldBeginSignUp:dictionary]) { - return; - } - } - - if ([password length] < _minPasswordLength) { - NSString *errorMessage = PFLocalizedString(@"Password must be at least %d characters.", - @"Password too short error message in PFSignUpViewController"); - errorMessage = [NSString stringWithFormat:errorMessage, (unsigned long)_minPasswordLength]; - NSError *error = [NSError errorWithDomain:PFParseErrorDomain - code:0 - userInfo:@{ NSLocalizedDescriptionKey : errorMessage }]; - [self _signUpDidFailWithError:error]; - [_signUpView.passwordField becomeFirstResponder]; - - return; - } - - PFUser *user = [PFUser user]; - user.username = username; - user.password = password; - - if (email) { - user.email = email; - } - if (additional) { - user[PFSignUpViewControllerDelegateInfoAdditionalKey] = additional; - } - - self.loading = YES; - if ([_signUpView.signUpButton isKindOfClass:[PFPrimaryButton class]]) { - [(PFPrimaryButton *)_signUpView.signUpButton setLoading:YES]; - } - [user signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { - self.loading = NO; - if ([self->_signUpView.signUpButton isKindOfClass:[PFPrimaryButton class]]) { - [(PFPrimaryButton *)self->_signUpView.signUpButton setLoading:NO]; - } - - if (succeeded) { - [self _signUpDidSuceedWithUser:user]; - } - else { - [self _signUpDidFailWithError:error]; - } - }]; -} - -- (void)_signUpDidSuceedWithUser:(PFUser *)user { - if (_delegateExistingMethods.didSignUp) { - [_delegate signUpViewController:self didSignUpUser:user]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:PFSignUpSuccessNotification object:self]; -} - -- (void)_signUpDidFailWithError:(NSError *)error { - if (_delegateExistingMethods.didFailToSignUp) { - [_delegate signUpViewController:self didFailToSignUpWithError:error]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:PFSignUpFailureNotification object:self]; - - NSString *title = PFLocalizedString(@"Sign Up Error", @"Sign Up Error"); - - if ([[error domain] isEqualToString:PFParseErrorDomain]) { - NSInteger errorCode = [error code]; - NSString *message = nil; - UIResponder *responder = nil; - - if (errorCode == kPFErrorInvalidEmailAddress) { - message = PFLocalizedString(@"The email address is invalid. Please enter a valid email.", - @"Invalid email address error message in PFSignUpViewControllers"); - responder = _signUpView.emailField ?: _signUpView.usernameField; - } else if (errorCode == kPFErrorUsernameMissing) { - message = PFLocalizedString(@"Please enter a username.", - @"Username missing error message in PFSignUpViewController"); - responder = _signUpView.usernameField; - } else if (errorCode == kPFErrorUserPasswordMissing) { - message = PFLocalizedString(@"Please enter a password.", - @"Password missing error message in PFSignUpViewController"); - responder = _signUpView.passwordField; - } else if (errorCode == kPFErrorUsernameTaken) { - NSString *format = PFLocalizedString(@"The username '%@' is taken. Please try choosing a different username.", - @"Username taken error format in PFSignUpViewController"); - message = [NSString stringWithFormat:format, _signUpView.usernameField.text]; - responder = _signUpView.usernameField; - } else if (error.code == kPFErrorUserEmailTaken) { - NSString *format = PFLocalizedString(@"The email '%@' is taken. Please try using a different email.", - @"Email is taken error format in PFSignUpViewController."); - UITextField *textField = self.emailAsUsername ? _signUpView.usernameField : _signUpView.emailField; - - message = [NSString stringWithFormat:format, textField.text]; - responder = textField; - } else if (error.code == kPFErrorUserEmailMissing) { - message = PFLocalizedString(@"Please enter an email.", - @"Email missing error message in PFSignUpViewController"); - responder = _signUpView.emailField; - } - - if (message != nil) { - [PFUIAlertView presentAlertInViewController:self withTitle:title message:message]; - [responder becomeFirstResponder]; - - return; - } - } - - // Show the generic error alert, as no custom cases matched before - [PFUIAlertView presentAlertInViewController:self withTitle:title error:error]; -} - -- (void)_cancelSignUp { - if (_delegateExistingMethods.didCancelSignUp) { - [_delegate signUpViewControllerDidCancelSignUp:self]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:PFSignUpCancelNotification object:self]; -} - -- (UIView *)_currentFirstResponder { - if ([_signUpView.usernameField isFirstResponder]) { - return _signUpView.usernameField; - } - if ([_signUpView.passwordField isFirstResponder]) { - return _signUpView.passwordField; - } - if ([_signUpView.emailField isFirstResponder]) { - return _signUpView.emailField; - } - if ([_signUpView.additionalField isFirstResponder]) { - return _signUpView.additionalField; - } - - return nil; -} - -#pragma mark Keyboard - -- (void)_dismissKeyboard { - [self.view endEditing:YES]; -} - -- (void)_registerForKeyboardNotifications { - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_keyboardWillShow:) - name:UIKeyboardWillShowNotification - object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_keyboardWillHide:) - name:UIKeyboardWillHideNotification object:nil]; -} - -- (void)_keyboardWillShow:(NSNotification *)notification { - NSDictionary *userInfo = [notification userInfo]; - CGRect endFrame = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; - CGFloat duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; - UIViewAnimationCurve curve = [userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]; - - CGRect keyboardFrame = [self.view convertRect:endFrame fromView:self.view.window]; - CGFloat visibleKeyboardHeight = CGRectGetMaxY(self.view.bounds) - CGRectGetMinY(keyboardFrame); - - [self setVisibleKeyboardHeight:visibleKeyboardHeight - animationDuration:duration - animationOptions:curve << 16]; -} - -- (void)_keyboardWillHide:(NSNotification *)notification { - NSDictionary *userInfo = [notification userInfo]; - CGFloat duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; - UIViewAnimationCurve curve = [userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]; - [self setVisibleKeyboardHeight:0.0 - animationDuration:duration - animationOptions:curve << 16]; -} - -- (void)setVisibleKeyboardHeight:(CGFloat)visibleKeyboardHeight - animationDuration:(NSTimeInterval)animationDuration - animationOptions:(UIViewAnimationOptions)animationOptions { - - dispatch_block_t animationsBlock = ^{ - self.visibleKeyboardHeight = visibleKeyboardHeight; - }; - - if (animationDuration == 0.0) { - animationsBlock(); - } else { - [UIView animateWithDuration:animationDuration - delay:0.0 - options:animationOptions | UIViewAnimationOptionBeginFromCurrentState - animations:animationsBlock - completion:nil]; - } -} - -- (void)setVisibleKeyboardHeight:(CGFloat)visibleKeyboardHeight { - if (self.visibleKeyboardHeight != visibleKeyboardHeight) { - _visibleKeyboardHeight = visibleKeyboardHeight; - [self _updateSignUpViewContentOffsetAnimated:NO]; - } -} - -- (void)_updateSignUpViewContentOffsetAnimated:(BOOL)animated { - CGPoint contentOffset = CGPointZero; - if (self.visibleKeyboardHeight > 0.0f) { - // Scroll the view to keep fields visible - CGFloat offsetForScrollingTextFieldToTop = CGRectGetMinY([self _currentFirstResponder].frame); - - UIView *lowestView; - if (_signUpView.signUpButton) { - lowestView = _signUpView.signUpButton; - } else if (_signUpView.additionalField) { - lowestView = _signUpView.additionalField; - } else if (_signUpView.emailField) { - lowestView = _signUpView.emailField; - } else { - lowestView = _signUpView.passwordField; - } - - CGFloat offsetForScrollingLowestViewToBottom = 0.0f; - offsetForScrollingLowestViewToBottom += self.visibleKeyboardHeight; - offsetForScrollingLowestViewToBottom += CGRectGetMaxY(lowestView.frame); - offsetForScrollingLowestViewToBottom -= CGRectGetHeight(_signUpView.bounds); - - if (offsetForScrollingLowestViewToBottom < 0) { - return; // No scrolling required - } - - contentOffset = CGPointMake(0.0f, MIN(offsetForScrollingTextFieldToTop, - offsetForScrollingLowestViewToBottom)); - } - - [_signUpView setContentOffset:contentOffset animated:animated]; -} - -#pragma mark - -#pragma mark Accessors - -- (void)setLoading:(BOOL)loading { - if (self.loading != loading) { - _loading = loading; - - _signUpView.usernameField.enabled = !self.loading; - _signUpView.passwordField.enabled = !self.loading; - _signUpView.emailField.enabled = !self.loading; - _signUpView.additionalField.enabled = !self.loading; - _signUpView.dismissButton.enabled = !self.loading; - } -} - -@end diff --git a/ParseUI/ParseUI/Source/PFTableViewCell.h b/ParseUI/ParseUI/Source/PFTableViewCell.h deleted file mode 100644 index 72396889d..000000000 --- a/ParseUI/ParseUI/Source/PFTableViewCell.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -#import "ParseUIConstants.h" -#import "PFImageView.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - The `PFTableViewCell` class represents a table view cell which can download and display remote images stored on Parse. - - When used in a `PFQueryTableViewController` - downloading and - displaying of the remote images are automatically managed by the controller. - */ -@interface PFTableViewCell : UITableViewCell - -/** - The imageView of the table view cell. - - @see `PFImageView` - */ -@property (nullable, nonatomic, strong, readonly) PFImageView *imageView; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFTableViewCell.m b/ParseUI/ParseUI/Source/PFTableViewCell.m deleted file mode 100644 index a51f1f823..000000000 --- a/ParseUI/ParseUI/Source/PFTableViewCell.m +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFTableViewCell.h" - -#import "PFRect.h" - -@interface PFTableViewCell () - -@property (nonatomic, assign) UITableViewCellStyle style; -@property (nonatomic, strong) PFImageView *customImageView; - -@end - -@implementation PFTableViewCell - -#pragma mark - -#pragma mark NSObject - -- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { - self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; - if (self) { - _style = style; - - _customImageView = [[PFImageView alloc] initWithFrame:CGRectZero]; - [self.contentView addSubview:_customImageView]; - } - return self; -} - -#pragma mark - -#pragma mark UIView - -- (void)layoutSubviews { - [super layoutSubviews]; - - // We cannot depend on the parent class to lay out things perfectly because - // UITableViewCell layoutSubviews use its internal imageView member rather than via - // its self.imageView property, so we need to lay out things manually - - // Don't relayout anything if there is no file/image - if (!self.imageView.file && !self.imageView.image) { - return; - } - - // Value2 ignores imageView entirely - if (self.style == UITableViewCellStyleValue2) { - return; - } - - const CGRect bounds = self.contentView.bounds; - - CGFloat imageHeight = MIN(CGRectGetWidth(bounds), CGRectGetHeight(bounds)); - CGFloat imageWidth = floor(13.0f * imageHeight / 9.0f); // Default is 13/9 aspect ratio - _customImageView.frame = PFRectMakeWithSize(CGSizeMake(imageWidth, imageHeight)); - - CGFloat imageViewRightInset = 10.0f; - CGFloat textOrigin = CGRectGetMaxX(_customImageView.frame) + imageViewRightInset; - - CGRect textLabelFrame = self.textLabel.frame; - CGRect detailTextLabelFrame = self.detailTextLabel.frame; - - switch (self.style) { - case UITableViewCellStyleDefault: - case UITableViewCellStyleSubtitle: - { - CGFloat originalTextLabelInset = CGRectGetMinX(textLabelFrame); - CGFloat originalDetailTextLabelInset = CGRectGetMinX(detailTextLabelFrame); - - CGFloat maxTextLabelWidth = CGRectGetMaxX(bounds) - textOrigin - originalTextLabelInset; - CGFloat maxDetailTextLabelWidth = CGRectGetMaxX(bounds) - textOrigin - originalDetailTextLabelInset; - - textLabelFrame.origin.x = textOrigin; - textLabelFrame.size.width = MIN(maxTextLabelWidth, CGRectGetWidth(textLabelFrame)); - - detailTextLabelFrame.origin.x = textOrigin; - detailTextLabelFrame.size.width = MIN(maxDetailTextLabelWidth, CGRectGetWidth(detailTextLabelFrame)); - } - break; - case UITableViewCellStyleValue1: - { - CGFloat maxTextLabelWidth = CGRectGetMinX(detailTextLabelFrame) - textOrigin; - - textLabelFrame.origin.x = textOrigin; - textLabelFrame.size.width = MIN(maxTextLabelWidth, CGRectGetWidth(textLabelFrame)); - } - break; - case UITableViewCellStyleValue2: - break; - default: - break; - } - self.textLabel.frame = textLabelFrame; - self.detailTextLabel.frame = detailTextLabelFrame; -} - -#pragma mark - -#pragma mark PFImageTableViewCell - -- (PFImageView *)imageView { - return _customImageView; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFTextField.h b/ParseUI/ParseUI/Source/PFTextField.h deleted file mode 100644 index ed7b450a1..000000000 --- a/ParseUI/ParseUI/Source/PFTextField.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -#import "ParseUIConstants.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - `PFTextFieldSeparatorStyle` bitmask specifies the style of the separators, - that should be used for a given `PFTextField`. - - @see PFTextField - */ -typedef NS_OPTIONS(uint8_t, PFTextFieldSeparatorStyle){ - /** No separators are visible. */ - PFTextFieldSeparatorStyleNone = 0, - /** Separator on top of the text field. */ - PFTextFieldSeparatorStyleTop = 1 << 0, - /** Separator at the bottom of the text field. */ - PFTextFieldSeparatorStyleBottom = 1 << 1 -}; - -/** - `PFTextField` class serves as a stylable subclass of `UITextField`. - It includes styles that are specific to `ParseUI` framework and allows advanced customization. - */ -@interface PFTextField : UITextField - -/** - Separator style bitmask that should be applied to this textfield. - - Default: `PFTextFieldSeparatorStyleNone` - - @see PFTextFieldSeparatorStyle - */ -@property (nonatomic, assign) PFTextFieldSeparatorStyle separatorStyle; - -/** - Color that should be used for the separators, if they are visible. - - Default: `227,227,227,1.0`. - */ -@property (nullable, nonatomic, strong) UIColor *separatorColor UI_APPEARANCE_SELECTOR; - -/** - This method is a convenience initializer that sets both `frame` and `separatorStyle` for an instance of `PFTextField.` - - @param frame The frame rectangle for the view, measured in points. - @param separatorStyle Initial separator style to use. - - @return An initialized instance of `PFTextField` or `nil` if it couldn't be created. - */ -- (instancetype)initWithFrame:(CGRect)frame separatorStyle:(PFTextFieldSeparatorStyle)separatorStyle; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFTextField.m b/ParseUI/ParseUI/Source/PFTextField.m deleted file mode 100644 index 7372cd5ba..000000000 --- a/ParseUI/ParseUI/Source/PFTextField.m +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFTextField.h" - -#import "PFColor.h" - -@implementation PFTextField - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (!self) return nil; - - self.backgroundColor = [PFColor textFieldBackgroundColor]; - self.textColor = [PFColor textFieldTextColor]; - - self.font = [UIFont systemFontOfSize:17.0f]; - - self.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; - - _separatorColor = [PFColor textFieldSeparatorColor]; - - return self; -} - -- (instancetype)initWithFrame:(CGRect)frame separatorStyle:(PFTextFieldSeparatorStyle)separatorStyle { - self = [self initWithFrame:frame]; - if (!self) return nil; - - _separatorStyle = separatorStyle; - - return self; -} - -#pragma mark - -#pragma mark Accessors - -- (void)setPlaceholder:(NSString *)placeholder { - NSDictionary *attributes = @{ NSForegroundColorAttributeName : [PFColor textFieldPlaceholderColor] }; - self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholder attributes:attributes]; -} - -- (void)setSeparatorStyle:(PFTextFieldSeparatorStyle)separatorStyle { - if (self.separatorStyle != separatorStyle) { - _separatorStyle = separatorStyle; - [self setNeedsDisplay]; - } -} - -#pragma mark - -#pragma mark Drawing - -- (void)drawRect:(CGRect)rect { - [super drawRect:rect]; - - const CGRect bounds = self.bounds; - CGContextRef context = UIGraphicsGetCurrentContext(); - - if (self.separatorStyle != PFTextFieldSeparatorStyleNone) { - [self.separatorColor setFill]; - } - - if (self.separatorStyle & PFTextFieldSeparatorStyleTop) { - CGRect borderRect = CGRectMake(0.0f, 0.0f, CGRectGetWidth(bounds), 1.0f); - CGContextFillRect(context, borderRect); - } - - if (self.separatorStyle & PFTextFieldSeparatorStyleBottom) { - CGRect borderRect = CGRectMake(0.0f, CGRectGetMaxY(bounds) - 1.0f, CGRectGetWidth(bounds), 1.0f); - CGContextFillRect(context, borderRect); - } -} - -#pragma mark - -#pragma mark Frame - -- (CGRect)textRectForBounds:(CGRect)bounds { - return CGRectMake(20.0f, 0.0f, CGRectGetWidth(bounds) - 30.0f, CGRectGetHeight(bounds)); -} - -- (CGRect)placeholderRectForBounds:(CGRect)bounds { - return [self textRectForBounds:bounds]; -} - -- (CGRect)editingRectForBounds:(CGRect)bounds { - return [self textRectForBounds:bounds]; -} - -#pragma mark - -#pragma mark Sizing - -- (CGSize)sizeThatFits:(CGSize)boundingSize { - CGSize size = CGSizeZero; - size.width = boundingSize.width; - size.height = MIN(44.0f, boundingSize.height); - return size; -} - -@end diff --git a/ParseUI/ParseUI/Source/ParseUI.h b/ParseUI/ParseUI/Source/ParseUI.h deleted file mode 100644 index c308bea32..000000000 --- a/ParseUI/ParseUI/Source/ParseUI.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFCollectionViewCell.h" -#import "PFImageView.h" -#import "PFLogInView.h" -#import "PFLogInViewController.h" -#import "PFProductTableViewController.h" -#import "PFPurchaseTableViewCell.h" -#import "PFQueryCollectionViewController.h" -#import "PFQueryTableViewController.h" -#import "PFSignUpView.h" -#import "PFSignUpViewController.h" -#import "PFTableViewCell.h" -#import "PFTextField.h" -#import "ParseUIConstants.h" diff --git a/ParseUI/ParseUI/Source/ParseUIConstants.h b/ParseUI/ParseUI/Source/ParseUIConstants.h deleted file mode 100644 index edd970a4f..000000000 --- a/ParseUI/ParseUI/Source/ParseUIConstants.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import -#import - -#ifndef ParseUI_ParseUIConstants_h -#define ParseUI_ParseUIConstants_h - -///-------------------------------------- -/// @name Deprecated Macros -///-------------------------------------- - -#ifndef PARSE_UI_DEPRECATED -# ifdef __deprecated_msg -# define PARSE_UI_DEPRECATED(_MSG) (deprecated(_MSG)) -# else -# ifdef __deprecated -# define PARSE_UI_DEPRECATED(_MSG) (deprecated) -# else -# define PARSE_UI_DEPRECATED(_MSG) -# endif -# endif -#endif - -#endif diff --git a/ParseUI/ParseUIDemo/Classes/AppDelegate.h b/ParseUI/ParseUIDemo/Classes/AppDelegate.h deleted file mode 100644 index 935592be2..000000000 --- a/ParseUI/ParseUIDemo/Classes/AppDelegate.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -@interface AppDelegate : UIResponder - -@property (nonatomic, strong) UIWindow *window; - -@end diff --git a/ParseUI/ParseUIDemo/Classes/AppDelegate.m b/ParseUI/ParseUIDemo/Classes/AppDelegate.m deleted file mode 100644 index 8ea22be75..000000000 --- a/ParseUI/ParseUIDemo/Classes/AppDelegate.m +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "AppDelegate.h" -#import "PFUIDemoViewController.h" - -@import ParseCore; - -@implementation AppDelegate - -#pragma mark - -#pragma mark UIApplicationDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [Parse setApplicationId:@"UdNpOP2XFoEiXLZEBDl6xONmCMH8VjETmnEsl0xJ" - clientKey:@"wNJFho0fQaQFQ2Fe1x9b67lVBakJiAtFj1Uz30A9"]; - - self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; - self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[[PFUIDemoViewController alloc] init]]; - [self.window makeKeyAndVisible]; - - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - [self _setupTestData]; - }); - - return YES; -} - -#pragma mark - -#pragma mark Test Data - -- (void)_setupTestData { - NSArray *todoTitles = @[ @"Build Parse", - @"Make everything awesome", - @"Go out for the longest run", - @"Do more stuff", - @"Conquer the world", - @"Build a house", - @"Grow a tree", - @"Be awesome", - @"Setup an app", - @"Do stuff", - @"Buy groceries", - @"Wash clothes" ]; - - NSMutableArray *objects = [NSMutableArray array]; - - PFQuery *query = [PFQuery queryWithClassName:@"Todo"]; - NSArray *todos = [query findObjects]; - if ([todos count] == 0) { - int count = 0; - for (NSString *title in todoTitles) { - int priority = count % 3; - - PFObject *todo = [[PFObject alloc] initWithClassName:@"Todo"]; - todo[@"title"] = title; - todo[@"priority"] = @(priority); - [objects addObject:todo]; - - count++; - } - } - - NSArray *appNames = @[ @"Anypic", - @"Anywall", - @"f8" ]; - - PFQuery *appsQuery = [PFQuery queryWithClassName:@"App"]; - NSArray *apps = [appsQuery findObjects]; - if ([apps count] == 0) { - for (NSUInteger i = 0; i < 3; i++) { - NSString *name = [NSString stringWithFormat:@"%d", (int)i]; - NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"png"]; - NSData *data = [NSData dataWithContentsOfFile:path]; - - PFFileObject *file = [PFFileObject fileObjectWithName:[path lastPathComponent] data:data]; - - PFObject *object = [[PFObject alloc] initWithClassName:@"App"]; - object[@"icon"] = file; - object[@"name"] = appNames[i]; - [objects addObject:object]; - } - } - - if ([objects count] != 0) { - [PFObject saveAll:objects]; - } -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/LogInViewController/CustomLogInViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/LogInViewController/CustomLogInViewController.h deleted file mode 100644 index 23bacec6d..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/LogInViewController/CustomLogInViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFLogInViewController.h" - -@interface CustomLogInViewController : PFLogInViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/LogInViewController/CustomLogInViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/LogInViewController/CustomLogInViewController.m deleted file mode 100644 index 8e3f4feb3..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/LogInViewController/CustomLogInViewController.m +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "CustomLogInViewController.h" - -@implementation CustomLogInViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.view.backgroundColor = [UIColor blueColor]; - - UILabel *label = [[UILabel alloc] init]; - label.textColor = [UIColor whiteColor]; - label.text = @"All Custom!"; - [label sizeToFit]; - self.logInView.logo = label; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.h deleted file mode 100644 index 4e003123e..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "ParseUI.h" - -@interface DeletionCollectionViewController : PFQueryCollectionViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.m deleted file mode 100644 index 3f71ce92f..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.m +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "DeletionCollectionViewController.h" - -#if __has_include() -#import -#else -#import "BFTask.h" -#endif - -@import ParseCore; - -@interface DeletionCollectionViewController() - -@end - -@implementation DeletionCollectionViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (self) { - self.title = @"Deletion Collection"; - self.pullToRefreshEnabled = YES; - self.objectsPerPage = 10; - self.paginationEnabled = YES; - } - return self; -} - -#pragma mark - -#pragma mark View Lifecycle - -- (void)viewDidLoad { - [super viewDidLoad]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - layout.sectionInset = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 10.0f); - layout.minimumInteritemSpacing = 5.0f; - - self.collectionView.allowsMultipleSelection = YES; - self.navigationItem.rightBarButtonItems = @[ - self.editButtonItem, - [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd - target:self - action:@selector(addTodo:)] - ]; -} - -- (void)viewWillLayoutSubviews { - [super viewWillLayoutSubviews]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - const CGRect bounds = UIEdgeInsetsInsetRect(self.view.bounds, layout.sectionInset); - CGFloat sideSize = MIN(CGRectGetWidth(bounds), CGRectGetHeight(bounds)) / 2.0f - layout.minimumInteritemSpacing; - layout.itemSize = CGSizeMake(sideSize, sideSize); -} - - -- (void)setEditing:(BOOL)editing animated:(BOOL)animated { - [super setEditing:editing animated:animated]; - - if (editing) { - self.navigationItem.leftBarButtonItem = - [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash - target:self - action:@selector(deleteSelectedItems:)]; - } else { - self.navigationItem.leftBarButtonItem = self.navigationItem.backBarButtonItem; - } -} - -- (void)addTodo:(id)sender { - if ([UIAlertController class]) { - UIAlertController *alertDialog = [UIAlertController alertControllerWithTitle:@"Add Todo" - message:nil - preferredStyle:UIAlertControllerStyleAlert]; - - __block UITextField *titleTextField = nil; - [alertDialog addTextFieldWithConfigurationHandler:^(UITextField *textField) { - titleTextField = textField; - - titleTextField.placeholder = @"Name"; - }]; - - [alertDialog addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]]; - [alertDialog addAction: - [UIAlertAction actionWithTitle:@"Save" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action) { - PFObject *object = [PFObject objectWithClassName:self.parseClassName - dictionary:@{ @"title":titleTextField.text }]; - - [[object saveInBackground] continueWithSuccessBlock:^id(BFTask *task) { - return [self loadObjects]; - }]; - }]]; - - [self presentViewController:alertDialog animated:YES completion:nil]; - } else { - UIAlertView *view = [[UIAlertView alloc] initWithTitle:@"Add Todo" - message:nil - delegate:self - cancelButtonTitle:@"Cancel" - otherButtonTitles:@"Save", nil]; - - [view setAlertViewStyle:UIAlertViewStylePlainTextInput]; - [view textFieldAtIndex:0].placeholder = @"Name"; - - [view show]; - } -} - -- (void)deleteSelectedItems:(id)sender { - [self removeObjectsAtIndexPaths:self.collectionView.indexPathsForSelectedItems]; -} - -#pragma mark - UICollectionViewDataSource - -- (PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - PFCollectionViewCell *cell = [super collectionView:collectionView cellForItemAtIndexPath:indexPath object:object]; - cell.textLabel.textAlignment = NSTextAlignmentCenter; - cell.textLabel.text = object[@"title"]; - - cell.contentView.layer.borderWidth = 1.0f; - cell.contentView.layer.borderColor = [UIColor lightGrayColor].CGColor; - - return cell; -} - -#pragma mark - -#pragma mark UIAlertViewDelegate - -- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { - if (buttonIndex == alertView.cancelButtonIndex) return; - - PFObject *object = [PFObject objectWithClassName:self.parseClassName - dictionary:@{ @"title": [alertView textFieldAtIndex:0].text }]; - - [[object saveEventually] continueWithSuccessBlock:^id(BFTask *task) { - return [self loadObjects]; - }]; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.h deleted file mode 100644 index 39f53eac7..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFQueryCollectionViewController.h" - -@interface PaginatedCollectionViewController : PFQueryCollectionViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.m deleted file mode 100644 index efd0d6879..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.m +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PaginatedCollectionViewController.h" -#import "PFCollectionViewCell.h" - -@import ParseCore; - -@implementation PaginatedCollectionViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (!self) return nil; - - self.title = @"Paginated Collection"; - self.pullToRefreshEnabled = YES; - self.objectsPerPage = 10; - self.paginationEnabled = YES; - - return self; -} - -#pragma mark - -#pragma mark UIViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - layout.sectionInset = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 10.0f); - layout.minimumInteritemSpacing = 5.0f; -} - -- (void)viewWillLayoutSubviews { - [super viewWillLayoutSubviews]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - const CGRect bounds = UIEdgeInsetsInsetRect(self.view.bounds, layout.sectionInset); - CGFloat sideSize = MIN(CGRectGetWidth(bounds), CGRectGetHeight(bounds)) / 3.0f - layout.minimumInteritemSpacing * 2.0f; - layout.itemSize = CGSizeMake(sideSize, sideSize); -} - -#pragma mark - -#pragma mark Data - -- (PFQuery *)queryForCollection { - PFQuery *query = [super queryForCollection]; - [query orderByAscending:@"priority"]; - return query; -} - -#pragma mark - -#pragma mark CollectionView - -- (PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - PFCollectionViewCell *cell = [super collectionView:collectionView cellForItemAtIndexPath:indexPath object:object]; - cell.textLabel.textAlignment = NSTextAlignmentCenter; - - NSMutableAttributedString *title = [[NSMutableAttributedString alloc] initWithString:object[@"title"] attributes:nil]; - NSAttributedString *priorityString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"\nPriority: %@", object[@"priority"]] - attributes:@{ NSFontAttributeName : [UIFont systemFontOfSize:13.0f], - NSForegroundColorAttributeName : [UIColor grayColor] }]; - [title appendAttributedString:priorityString]; - cell.textLabel.attributedText = title; - - cell.contentView.layer.borderWidth = 1.0f; - cell.contentView.layer.borderColor = [UIColor lightGrayColor].CGColor; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.h deleted file mode 100644 index 0f25f387b..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFQueryCollectionViewController.h" - -@interface SectionedCollectionViewController : PFQueryCollectionViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.m deleted file mode 100644 index d3391f6d5..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.m +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "SectionedCollectionViewController.h" -#import "PFCollectionViewCell.h" - -@import ParseCore; - -#pragma mark - -#pragma mark SimpleCollectionReusableView - -@interface SimpleCollectionReusableView : UICollectionReusableView - -@property (nonatomic, strong, readonly) UILabel *label; - -@end - -@implementation SimpleCollectionReusableView - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (!self) return nil; - - _label = [[UILabel alloc] initWithFrame:CGRectZero]; - _label.textAlignment = NSTextAlignmentCenter; - [self addSubview:_label]; - - return self; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - - _label.frame = self.bounds; -} - -@end - -@interface SectionedCollectionViewController () -{ - NSArray *_sectionSortedKeys; - NSMutableDictionary *_sections; -} - -@end - -#pragma mark - -#pragma mark SectionedCollectionViewController - -@implementation SectionedCollectionViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (!self) return nil; - - self.title = @"Sectioned Collection"; - self.pullToRefreshEnabled = YES; - - _sections = [NSMutableDictionary dictionary]; - - return self; -} - -#pragma mark - -#pragma mark UIViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - layout.sectionInset = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 10.0f); - layout.minimumInteritemSpacing = 5.0f; - - [self.collectionView registerClass:[SimpleCollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header"]; -} - -- (void)viewWillLayoutSubviews { - [super viewWillLayoutSubviews]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - const CGRect bounds = UIEdgeInsetsInsetRect(self.view.bounds, layout.sectionInset); - CGFloat sideSize = MIN(CGRectGetWidth(bounds), CGRectGetHeight(bounds)) / 3.0f - layout.minimumInteritemSpacing * 2.0f; - layout.itemSize = CGSizeMake(sideSize, sideSize); -} - -#pragma mark - -#pragma mark Data - -- (void)objectsDidLoad:(NSError *)error { - [super objectsDidLoad:error]; - - [_sections removeAllObjects]; - for (PFObject *object in self.objects) { - NSNumber *priority = object[@"priority"]; - - NSMutableArray *array = _sections[priority]; - if (array) { - [array addObject:object]; - } else { - _sections[priority] = [NSMutableArray arrayWithObject:object]; - } - } - - _sectionSortedKeys = [[_sections allKeys] sortedArrayUsingSelector:@selector(compare:)]; - [self.collectionView reloadData]; -} - -- (PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath { - NSArray *sectionAray = _sections[_sectionSortedKeys[indexPath.section]]; - return sectionAray[indexPath.row]; -} - -#pragma mark - -#pragma mark CollectionView - -- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { - return [_sections count]; -} - -- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { - NSArray *sectionAray = _sections[_sectionSortedKeys[section]]; - return [sectionAray count]; -} - -- (PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - PFCollectionViewCell *cell = [super collectionView:collectionView cellForItemAtIndexPath:indexPath object:object]; - - cell.textLabel.textAlignment = NSTextAlignmentCenter; - cell.textLabel.text = object[@"title"]; - - cell.contentView.layer.borderWidth = 1.0f; - cell.contentView.layer.borderColor = [UIColor lightGrayColor].CGColor; - - return cell; -} - -- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { - if ([kind isEqualToString:UICollectionElementKindSectionHeader]) { - SimpleCollectionReusableView *view = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"header" forIndexPath:indexPath]; - NSNumber *priority = _sectionSortedKeys[indexPath.section]; - view.label.text = [NSString stringWithFormat:@"Priority %@", [priority stringValue]]; - return view; - } - return [super collectionView:collectionView viewForSupplementaryElementOfKind:kind atIndexPath:indexPath]; -} - -- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { - if ([_sections count]) { - return CGSizeMake(CGRectGetWidth(self.collectionView.bounds), 40.0f); - } - return CGSizeZero; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.h deleted file mode 100644 index 47c9ca650..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFQueryCollectionViewController.h" - -@interface SimpleCollectionViewController : PFQueryCollectionViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.m deleted file mode 100644 index 3f683af9f..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.m +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "SimpleCollectionViewController.h" -#import "PFCollectionViewCell.h" - -@import ParseCore; - -@implementation SimpleCollectionViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (!self) return nil; - - self.title = @"Simple Collection"; - self.pullToRefreshEnabled = YES; - self.paginationEnabled = NO; - - return self; -} - -#pragma mark - -#pragma mark UIViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - layout.sectionInset = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 10.0f); - layout.minimumInteritemSpacing = 5.0f; -} - -- (void)viewWillLayoutSubviews { - [super viewWillLayoutSubviews]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - const CGRect bounds = UIEdgeInsetsInsetRect(self.view.bounds, layout.sectionInset); - CGFloat sideSize = MIN(CGRectGetWidth(bounds), CGRectGetHeight(bounds)) / 2.0f - layout.minimumInteritemSpacing; - layout.itemSize = CGSizeMake(sideSize, sideSize); -} - -#pragma mark - -#pragma mark Data - -- (PFQuery *)queryForCollection { - PFQuery *query = [super queryForCollection]; - [query orderByAscending:@"priority"]; - return query; -} - -#pragma mark - -#pragma mark CollectionView - -- (PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - PFCollectionViewCell *cell = [super collectionView:collectionView cellForItemAtIndexPath:indexPath object:object]; - cell.textLabel.textAlignment = NSTextAlignmentCenter; - - NSMutableAttributedString *title = [[NSMutableAttributedString alloc] initWithString:object[@"title"] attributes:nil]; - NSAttributedString *priorityString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"\nPriority: %@", object[@"priority"]] - attributes:@{ NSFontAttributeName : [UIFont systemFontOfSize:13.0f], - NSForegroundColorAttributeName : [UIColor grayColor] }]; - [title appendAttributedString:priorityString]; - cell.textLabel.attributedText = title; - - cell.contentView.layer.borderWidth = 1.0f; - cell.contentView.layer.borderColor = [UIColor lightGrayColor].CGColor; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.h deleted file mode 100644 index d589f48c6..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "ParseUI.h" - -@interface StoryboardCollectionViewController : PFQueryCollectionViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.m deleted file mode 100644 index 8fd4cae08..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.m +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "StoryboardCollectionViewController.h" -#import "PFCollectionViewCell.h" - -@import ParseCore; - -@implementation StoryboardCollectionViewController - -#pragma mark - -#pragma mark UIViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - layout.sectionInset = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 10.0f); - layout.minimumInteritemSpacing = 5.0f; -} - -- (void)viewWillLayoutSubviews { - [super viewWillLayoutSubviews]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - const CGRect bounds = UIEdgeInsetsInsetRect(self.view.bounds, layout.sectionInset); - CGFloat sideSize = MIN(CGRectGetWidth(bounds), CGRectGetHeight(bounds)) / 2.0f - layout.minimumInteritemSpacing; - layout.itemSize = CGSizeMake(sideSize, sideSize); -} - - -#pragma mark - -#pragma mark Query - -- (PFQuery *)queryForCollection { - PFQuery *query = [super queryForCollection]; - [query orderByAscending:@"priority"]; - return query; -} - -#pragma mark - -#pragma mark CollectionView - -- (PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - PFCollectionViewCell *cell = [super collectionView:collectionView cellForItemAtIndexPath:indexPath object:object]; - cell.textLabel.textAlignment = NSTextAlignmentCenter; - - NSMutableAttributedString *title = [[NSMutableAttributedString alloc] initWithString:object[@"title"] attributes:nil]; - NSAttributedString *priorityString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"\nPriority: %@", object[@"priority"]] - attributes:@{ NSFontAttributeName : [UIFont systemFontOfSize:13.0f], - NSForegroundColorAttributeName : [UIColor grayColor] }]; - [title appendAttributedString:priorityString]; - cell.textLabel.attributedText = title; - - cell.contentView.layer.borderWidth = 1.0f; - cell.contentView.layer.borderColor = [UIColor lightGrayColor].CGColor; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.h deleted file mode 100644 index 761fa4a59..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFQueryCollectionViewController.h" - -@interface SubtitleImageCollectionViewController : PFQueryCollectionViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.m deleted file mode 100644 index 095af1ff8..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.m +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "SubtitleImageCollectionViewController.h" -#import "PFCollectionViewCell.h" -#import "PFImageView.h" - -@import ParseCore; - -@implementation SubtitleImageCollectionViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (!self) return nil; - - self.title = @"Image Collection"; - self.pullToRefreshEnabled = YES; - self.paginationEnabled = NO; - - return self; -} - -#pragma mark - -#pragma mark UIViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - layout.sectionInset = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 10.0f); - layout.minimumInteritemSpacing = 5.0f; -} - -- (void)viewWillLayoutSubviews { - [super viewWillLayoutSubviews]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - const CGRect bounds = UIEdgeInsetsInsetRect(self.view.bounds, layout.sectionInset); - CGFloat sideSize = MIN(CGRectGetWidth(bounds), CGRectGetHeight(bounds)) / 2.0f - layout.minimumInteritemSpacing; - layout.itemSize = CGSizeMake(sideSize, sideSize); -} - -#pragma mark - -#pragma mark CollectionView - -- (PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - PFCollectionViewCell *cell = [super collectionView:collectionView cellForItemAtIndexPath:indexPath object:object]; - - cell.textLabel.textAlignment = NSTextAlignmentCenter; - cell.textLabel.text = object[@"name"]; - - cell.imageView.file = object[@"icon"]; - // If the image is nil - set the placeholder - if (cell.imageView.image == nil) { - cell.imageView.image = [UIImage imageNamed:@"Icon.png"]; - [cell.imageView loadInBackground]; - } - - cell.contentView.layer.borderWidth = 1.0f; - cell.contentView.layer.borderColor = [UIColor lightGrayColor].CGColor; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.h deleted file mode 100644 index 95a50b979..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFProductTableViewController.h" - -@interface CustomProductTableViewController : PFProductTableViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.m deleted file mode 100644 index 535fc00b4..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.m +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "CustomProductTableViewController.h" - -@import ParseCore; - -@implementation CustomProductTableViewController - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ - PFObject *purchase = self.objects[indexPath.row]; - NSString *productIdentifier = purchase[@"productIdentifier"]; - - if ([productIdentifier isEqualToString:@"Cooper"]) { - [PFPurchase buyProduct:@"Cooper" block:^(NSError *error) { - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Success!" - message:@"YES!" - delegate:nil - cancelButtonTitle:@"OK!" - otherButtonTitles:nil]; - [alertView show]; - }]; - } else { - [super tableView:tableView didSelectRowAtIndexPath:indexPath]; - } -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.h deleted file mode 100644 index 0022d0ee8..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "ParseUI.h" - -@interface DeletionTableViewController : PFQueryTableViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.m deleted file mode 100644 index 5b3f0b93c..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.m +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "DeletionTableViewController.h" - -#if __has_include() -#import -#else -#import "BFTask.h" -#endif - -@import ParseCore; - -@interface DeletionTableViewController() - -@end - -@implementation DeletionTableViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (!self) return nil; - - self.title = @"Deletion Table"; - self.pullToRefreshEnabled = YES; - - return self; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.tableView.allowsMultipleSelectionDuringEditing = YES; - self.navigationItem.rightBarButtonItems = @[ - self.editButtonItem, - [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd - target:self - action:@selector(addTodo:)] - ]; -} - -- (void)setEditing:(BOOL)editing animated:(BOOL)animated { - [super setEditing:editing animated:animated]; - - if (editing) { - self.navigationItem.leftBarButtonItem = - [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash - target:self - action:@selector(deleteSelectedItems:)]; - } else { - self.navigationItem.leftBarButtonItem = self.navigationItem.backBarButtonItem; - } -} - -- (void)addTodo:(id)sender { - if ([UIAlertController class]) { - UIAlertController *alertDialog = [UIAlertController alertControllerWithTitle:@"Add Todo" - message:nil - preferredStyle:UIAlertControllerStyleAlert]; - - __block UITextField *titleTextField = nil; - [alertDialog addTextFieldWithConfigurationHandler:^(UITextField *textField) { - titleTextField = textField; - - titleTextField.placeholder = @"Name"; - }]; - - [alertDialog addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]]; - [alertDialog addAction: - [UIAlertAction actionWithTitle:@"Save" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action) { - PFObject *object = [PFObject objectWithClassName:self.parseClassName - dictionary:@{ @"title":titleTextField.text }]; - - [[object saveInBackground] continueWithSuccessBlock:^id(BFTask *task) { - return [self loadObjects]; - }]; - }]]; - - [self presentViewController:alertDialog animated:YES completion:nil]; - } else { - UIAlertView *view = [[UIAlertView alloc] initWithTitle:@"Add Todo" - message:nil - delegate:self - cancelButtonTitle:@"Cancel" - otherButtonTitles:@"Save", nil]; - - [view setAlertViewStyle:UIAlertViewStylePlainTextInput]; - [view textFieldAtIndex:0].placeholder = @"Name"; - - [view show]; - } -} - -- (void)deleteSelectedItems:(id)sender { - [self removeObjectsAtIndexPaths:self.tableView.indexPathsForSelectedRows]; -} - -- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle - forRowAtIndexPath:(NSIndexPath *)indexPath { - if (editingStyle == UITableViewCellEditingStyleDelete) { - [self removeObjectAtIndexPath:indexPath]; - } -} - -#pragma mark - -#pragma mark UIAlertViewDelegate - -- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { - if (buttonIndex == alertView.cancelButtonIndex) return; - - PFObject *object = [PFObject objectWithClassName:self.parseClassName - dictionary:@{ @"title": [alertView textFieldAtIndex:0].text }]; - - [[object saveEventually] continueWithSuccessBlock:^id(BFTask *task) { - return [self loadObjects]; - }]; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.h deleted file mode 100644 index 862899362..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -#import "PFQueryTableViewController.h" - -@interface PaginatedTableViewController : PFQueryTableViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.m deleted file mode 100644 index db202d4fa..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.m +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PaginatedTableViewController.h" -#import "PFTableViewCell.h" - -@import ParseCore; - -@implementation PaginatedTableViewController - -#pragma mark - -#pragma mark init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (self) { - self.title = @"Paginated Table"; - self.pullToRefreshEnabled = YES; - self.objectsPerPage = 10; - self.paginationEnabled = YES; - } - return self; -} - -#pragma mark - -#pragma mark Data - -- (PFQuery *)queryForTable { - PFQuery *query = [super queryForTable]; - [query orderByAscending:@"priority"]; - return query; -} - -#pragma mark - -#pragma mark TableView - -- (UITableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - static NSString *cellIdentifier = @"cell"; - - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if (cell == nil) { - cell = [[PFTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; - } - - cell.textLabel.text = object[@"title"]; - cell.detailTextLabel.text = [NSString stringWithFormat:@"Priority: %@", object[@"priority"]]; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.h deleted file mode 100644 index d8e54fb65..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -#import "PFQueryTableViewController.h" - -@interface SectionedTableViewController : PFQueryTableViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.m deleted file mode 100644 index 9ccdfac00..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.m +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "SectionedTableViewController.h" -#import "PFTableViewCell.h" - -@import ParseCore; - -@interface SectionedTableViewController () -{ - NSArray *_sectionSortedKeys; - NSMutableDictionary *_sections; -} - -@end - -@implementation SectionedTableViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (self) { - self.title = @"Sectioned Table"; - self.pullToRefreshEnabled = YES; - - _sections = [NSMutableDictionary dictionary]; - } - return self; -} - -#pragma mark - -#pragma mark Data - -- (void)objectsDidLoad:(NSError *)error { - [super objectsDidLoad:error]; - - [_sections removeAllObjects]; - for (PFObject *object in self.objects) { - NSNumber *priority = object[@"priority"]; - - NSMutableArray *array = _sections[priority]; - if (array) { - [array addObject:object]; - } else { - _sections[priority] = [NSMutableArray arrayWithObject:object]; - } - } - - _sectionSortedKeys = [[_sections allKeys] sortedArrayUsingSelector:@selector(compare:)]; - [self.tableView reloadData]; -} - -- (PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath { - NSArray *sectionArray = _sections[_sectionSortedKeys[indexPath.section]]; - return sectionArray[indexPath.row]; -} - -#pragma mark - -#pragma mark UITableViewDataSource - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return [_sections count]; -} - -- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { - return [NSString stringWithFormat:@"Priority %@", [_sectionSortedKeys[section] stringValue]]; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - NSArray *sectionAray = _sections[_sectionSortedKeys[section]]; - return [sectionAray count]; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - static NSString *cellIdentifier = @"cell"; - - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if (cell == nil) { - cell = [[PFTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; - } - - cell.textLabel.text = object[@"title"]; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.h deleted file mode 100644 index a7bad53ab..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -#import "PFQueryTableViewController.h" - -@interface SimpleTableViewController : PFQueryTableViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.m deleted file mode 100644 index 2c2b6d56b..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.m +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "SimpleTableViewController.h" -#import "PFTableViewCell.h" - -@import ParseCore; - -@implementation SimpleTableViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (self) { - self.title = @"Simple Table"; - self.pullToRefreshEnabled = YES; - self.paginationEnabled = NO; - } - return self; -} - -#pragma mark - -#pragma mark Data - -- (PFQuery *)queryForTable { - PFQuery *query = [super queryForTable]; - [query orderByAscending:@"priority"]; - return query; -} - -#pragma mark - -#pragma mark TableView - -- (UITableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - static NSString *cellIdentifier = @"cell"; - - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if (cell == nil) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; - } - - cell.textLabel.text = object[@"title"]; - cell.detailTextLabel.text = [NSString stringWithFormat:@"Priority: %@", object[@"priority"]]; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.h deleted file mode 100644 index 88bfb32bf..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "ParseUI.h" - -@interface StoryboardTableViewController : PFQueryTableViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.m deleted file mode 100644 index 504c7be09..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.m +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "StoryboardTableViewController.h" -#import "PFTableViewCell.h" - -@import ParseCore; - -@implementation StoryboardTableViewController - -#pragma mark - -#pragma mark Data - -- (PFQuery *)queryForTable { - PFQuery *query = [super queryForTable]; - [query orderByAscending:@"priority"]; - return query; -} - -#pragma mark - -#pragma mark TableView - -- (UITableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - static NSString *cellIdentifier = @"cell"; - - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if (cell == nil) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; - } - - cell.textLabel.text = object[@"title"]; - cell.detailTextLabel.text = [NSString stringWithFormat:@"Priority: %@", object[@"priority"]]; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.h deleted file mode 100644 index 4cb92a2cf..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFQueryTableViewController.h" - -@interface SubtitleImageTableViewController : PFQueryTableViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.m deleted file mode 100644 index 3998c5dc9..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.m +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "SubtitleImageTableViewController.h" -#import "PFTableViewCell.h" - -@import ParseCore; - -@implementation SubtitleImageTableViewController - -- (UITableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - static NSString *cellIdentifier = @"cell"; - - PFTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if (cell == nil) { - cell = [[PFTableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier]; - } - - cell.textLabel.text = object[@"name"]; - cell.detailTextLabel.text = @"@parseit"; - - cell.imageView.image = [UIImage imageNamed:@"Icon.png"]; - cell.imageView.file = object[@"icon"]; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/SignUpViewController/CustomSignUpViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/SignUpViewController/CustomSignUpViewController.h deleted file mode 100644 index fab959333..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/SignUpViewController/CustomSignUpViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFSignUpViewController.h" - -@interface CustomSignUpViewController : PFSignUpViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/SignUpViewController/CustomSignUpViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/SignUpViewController/CustomSignUpViewController.m deleted file mode 100644 index b2e3530ef..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/SignUpViewController/CustomSignUpViewController.m +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "CustomSignUpViewController.h" - -@implementation CustomSignUpViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.view.backgroundColor = [UIColor blueColor]; - - UILabel *label = [[UILabel alloc] init]; - label.text = @"All Custom!"; - [label sizeToFit]; - self.signUpView.logo = label; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.h b/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.h deleted file mode 100644 index 7b94f6366..000000000 --- a/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -@interface PFUIDemoViewController : UITableViewController - -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -@end diff --git a/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.m b/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.m deleted file mode 100644 index c053dbe54..000000000 --- a/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.m +++ /dev/null @@ -1,442 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import "PFUIDemoViewController.h" - -#import "ParseUI.h" - -#import "CustomLogInViewController.h" -#import "CustomProductTableViewController.h" -#import "CustomSignUpViewController.h" -#import "DeletionCollectionViewController.h" -#import "DeletionTableViewController.h" -#import "PaginatedCollectionViewController.h" -#import "PaginatedTableViewController.h" -#import "SectionedCollectionViewController.h" -#import "SectionedTableViewController.h" -#import "SimpleCollectionViewController.h" -#import "SimpleTableViewController.h" -#import "StoryboardCollectionViewController.h" -#import "StoryboardTableViewController.h" -#import "SubtitleImageCollectionViewController.h" -#import "SubtitleImageTableViewController.h" - -typedef NS_ENUM(uint8_t, PFUIDemoType) { - PFUIDemoTypeSimpleTable, - PFUIDemoTypePaginatedTable, - PFUIDemoTypeSectionedTable, - PFUIDemoTypeStoryboardTable, - PFUIDemoTypeDeletionTable, - PFUIDemoTypeSimpleCollection, - PFUIDemoTypePaginatedCollection, - PFUIDemoTypeSectionedCollection, - PFUIDemoTypeStoryboardCollection, - PFUIDemoTypeDeletionCollection, - PFUIDemoTypeLogInDefault, - PFUIDemoTypeLogInUsernamePassword, - PFUIDemoTypeLogInPasswordForgotten, - PFUIDemoTypeLogInDone, - PFUIDemoTypeLogInEmailAsUsername, - PFUIDemoTypeLogInAll, - PFUIDemoTypeLogInAllNavigation, - PFUIDemoTypeLogInCustomizedLogoAndBackground, - PFUIDemoTypeSignUpDefault, - PFUIDemoTypeSignUpUsernamePassword, - PFUIDemoTypeSignUpUsernamePasswordEmail, - PFUIDemoTypeSignUpUsernamePasswordEmailSignUp, - PFUIDemoTypeSignUpAll, - PFUIDemoTypeSignUpEmailAsUsername, - PFUIDemoTypeSignUpMinPasswordLength, - PFUIDemoTypeImageTableDefaultStyle, - PFUIDemoTypeImageTableSubtitleStyle, - PFUIDemoTypeImageCollection, - PFUIDemoTypePurchase, - PFUIDemoTypeCustomizedPurchase -}; - -@interface PFUIDemoViewController () -{ - NSArray *_descriptions; -} - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER; - -@end - -@implementation PFUIDemoViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)init { - return [super initWithStyle:UITableViewStylePlain]; -} - -- (instancetype)initWithStyle:(UITableViewStyle)style { - return [self init]; -} - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; -} - -- (instancetype)initWithCoder:(NSCoder *)decoder { - return [self init]; -} - -#pragma mark - -#pragma mark View - -- (void)viewDidLoad { - [super viewDidLoad]; - - if (!self.title) { - self.title = @"ParseUI Demo"; - } - if (!_descriptions) { - _descriptions = @[ @"Simple Table", - @"Paginated Table", - @"Sectioned Table", - @"Simple Storyboard Table", - @"Deletion Table", - @"Simple Collection", - @"Paginated Collection", - @"Sectioned Collection", - @"Simple Storyboard Collection", - @"Deletion Collection", - @"Log In Default", - @"Log In Username and Password", - @"Log In Password Forgotten", - @"Log In Done Button", - @"Log In Email as Username", - @"Log In All", - @"Log In All as Navigation", - @"Log In Customized Background", - @"Sign Up Default", - @"Sign Up Username and Password", - @"Sign Up Email", - @"Sign Up Email And SignUp", - @"Sign Up All", - @"Sign Up Email as Username", - @"Sign Up Minimum Password Length", - @"Remote Image Table Default Style", - @"Remote Image Table Subtitle Style", - @"Remote Image Collection", - @"Purchase", - @"Custom Purchase" ]; - } -} - -#pragma mark - -#pragma mark UITableViewDataSource - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [_descriptions count]; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - static NSString *identifier = @"cell"; - - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; - if (cell == nil) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; - } - - cell.textLabel.text = _descriptions[indexPath.row]; - - return cell; -} - -#pragma mark - -#pragma mark UITableViewDelegate - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - switch (indexPath.row) { - case PFUIDemoTypeSimpleTable: { - PFQueryTableViewController *controller = [[SimpleTableViewController alloc] initWithClassName:@"Todo"]; - [self.navigationController pushViewController:controller animated:YES]; - break; - } - case PFUIDemoTypePaginatedTable: { - PFQueryTableViewController *controller = [[PaginatedTableViewController alloc] initWithClassName:@"Todo"]; - [self.navigationController pushViewController:controller animated:YES]; - break; - } - case PFUIDemoTypeSectionedTable: { - PFQueryTableViewController *controller = [[SectionedTableViewController alloc] initWithClassName:@"Todo"]; - [self.navigationController pushViewController:controller animated:YES]; - break; - } - case PFUIDemoTypeStoryboardTable: { - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SimpleQueryTableStoryboard" bundle:NULL]; - StoryboardTableViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"StoryboardTableViewController"]; - [self.navigationController pushViewController:controller animated:YES]; - break; - } - case PFUIDemoTypeDeletionTable: { - PFQueryTableViewController *controller = [[DeletionTableViewController alloc] initWithClassName:@"PublicTodo"]; - [self.navigationController pushViewController:controller animated:YES]; - break; - } - case PFUIDemoTypeSimpleCollection: { - SimpleCollectionViewController *controller = [[SimpleCollectionViewController alloc] initWithClassName:@"Todo"]; - [self.navigationController pushViewController:controller animated:YES]; - } - break; - case PFUIDemoTypePaginatedCollection: { - PaginatedCollectionViewController *controller = [[PaginatedCollectionViewController alloc] initWithClassName:@"Todo"]; - [self.navigationController pushViewController:controller animated:YES]; - } - break; - case PFUIDemoTypeSectionedCollection: { - SectionedCollectionViewController *controller = [[SectionedCollectionViewController alloc] initWithClassName:@"Todo"]; - [self.navigationController pushViewController:controller animated:YES]; - } - break; - case PFUIDemoTypeStoryboardCollection: { - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SimpleQueryCollectionStoryboard" bundle:NULL]; - StoryboardCollectionViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"StoryboardCollectionViewController"]; - [self.navigationController pushViewController:controller animated:YES]; - break; - } - case PFUIDemoTypeDeletionCollection: { - PFQueryCollectionViewController *controller = [[DeletionCollectionViewController alloc] initWithClassName:@"PublicTodo"]; - [self.navigationController pushViewController:controller animated:YES]; - break; - } - case PFUIDemoTypeLogInDefault: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.delegate = self; - [self presentViewController:logInController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeLogInUsernamePassword: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.fields = PFLogInFieldsUsernameAndPassword | PFLogInFieldsDismissButton; - logInController.delegate = self; - [self presentViewController:logInController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeLogInPasswordForgotten: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.fields = (PFLogInFieldsUsernameAndPassword - | PFLogInFieldsPasswordForgotten - | PFLogInFieldsDismissButton); - logInController.delegate = self; - [self presentViewController:logInController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeLogInDone: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.fields = (PFLogInFieldsUsernameAndPassword - | PFLogInFieldsLogInButton - | PFLogInFieldsDismissButton); - logInController.delegate = self; - [self presentViewController:logInController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeLogInEmailAsUsername: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.fields = (PFLogInFieldsUsernameAndPassword - | PFLogInFieldsLogInButton - | PFLogInFieldsDismissButton - | PFLogInFieldsSignUpButton); - logInController.emailAsUsername = YES; - logInController.delegate = self; - [self presentViewController:logInController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeLogInAll: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.fields = (PFLogInFieldsUsernameAndPassword - | PFLogInFieldsLogInButton - | PFLogInFieldsPasswordForgotten - | PFLogInFieldsApple - | PFLogInFieldsSignUpButton - | PFLogInFieldsDismissButton); - logInController.delegate = self; - - logInController.signUpController.fields = (PFSignUpFieldsUsernameAndPassword - | PFSignUpFieldsEmail - | PFSignUpFieldsAdditional - | PFSignUpFieldsDismissButton - | PFSignUpFieldsSignUpButton); - logInController.signUpController.delegate = self; - - [self presentViewController:logInController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeLogInAllNavigation: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.fields = (PFLogInFieldsUsernameAndPassword - | PFLogInFieldsLogInButton - | PFLogInFieldsPasswordForgotten - | PFLogInFieldsSignUpButton - | PFLogInFieldsDismissButton); - logInController.delegate = self; - - logInController.signUpController.fields = (PFSignUpFieldsUsernameAndPassword - | PFSignUpFieldsEmail - | PFSignUpFieldsAdditional - | PFSignUpFieldsDismissButton - | PFSignUpFieldsSignUpButton); - logInController.signUpController.delegate = self; - [self.navigationController pushViewController:logInController animated:YES]; - break; - } - case PFUIDemoTypeLogInCustomizedLogoAndBackground: { - PFLogInViewController *logInController = [[CustomLogInViewController alloc] init]; - logInController.fields = PFLogInFieldsDefault; - logInController.delegate= self; - - PFSignUpViewController *signUpController = [[CustomSignUpViewController alloc] init]; - signUpController.fields = PFSignUpFieldsDefault; - signUpController.delegate = self; - - logInController.signUpController = signUpController; - [self presentViewController:logInController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeSignUpDefault: { - PFSignUpViewController *signUpController = [[PFSignUpViewController alloc] init]; - signUpController.delegate = self; - [self presentViewController:signUpController animated:YES completion:nil]; - } - break; - case PFUIDemoTypeSignUpUsernamePassword: { - PFSignUpViewController *signUpController = [[PFSignUpViewController alloc] init]; - signUpController.fields = PFSignUpFieldsUsernameAndPassword | PFSignUpFieldsDismissButton; - signUpController.delegate = self; - [self presentViewController:signUpController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeSignUpUsernamePasswordEmail: { - PFSignUpViewController *signUpController = [[PFSignUpViewController alloc] init]; - signUpController.fields = (PFSignUpFieldsUsernameAndPassword - | PFSignUpFieldsEmail - | PFSignUpFieldsDismissButton); - signUpController.delegate = self; - [self presentViewController:signUpController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeSignUpUsernamePasswordEmailSignUp: { - PFSignUpViewController *signUpController = [[PFSignUpViewController alloc] init]; - signUpController.fields = (PFSignUpFieldsUsernameAndPassword - | PFSignUpFieldsEmail - | PFSignUpFieldsSignUpButton - | PFSignUpFieldsDismissButton); - signUpController.delegate = self; - [self presentViewController:signUpController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeSignUpAll: { - PFSignUpViewController *signUpController = [[PFSignUpViewController alloc] init]; - signUpController.fields = (PFSignUpFieldsEmail - | PFSignUpFieldsAdditional - | PFSignUpFieldsSignUpButton - | PFSignUpFieldsDismissButton); - signUpController.delegate = self; - signUpController.modalPresentationStyle = UIModalPresentationFormSheet; - [self presentViewController:signUpController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeSignUpEmailAsUsername: { - PFSignUpViewController *signUpController = [[PFSignUpViewController alloc] init]; - signUpController.fields = (PFSignUpFieldsUsernameAndPassword - | PFSignUpFieldsSignUpButton - | PFSignUpFieldsDismissButton); - signUpController.emailAsUsername = YES; - signUpController.delegate = self; - [self presentViewController:signUpController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeSignUpMinPasswordLength: { - PFSignUpViewController *signUpController = [[PFSignUpViewController alloc] init]; - signUpController.fields = (PFSignUpFieldsUsernameAndPassword - | PFSignUpFieldsSignUpButton - | PFSignUpFieldsDismissButton); - signUpController.minPasswordLength = 6; - signUpController.delegate = self; - [self presentViewController:signUpController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeImageTableDefaultStyle: { - PFQueryTableViewController *tableViewController = [[PFQueryTableViewController alloc] initWithClassName:@"App"]; - tableViewController.imageKey = @"icon"; - tableViewController.textKey = @"name"; - tableViewController.paginationEnabled = NO; - tableViewController.placeholderImage = [UIImage imageNamed:@"Icon.png"]; - [self.navigationController pushViewController:tableViewController animated:YES]; - break; - } - case PFUIDemoTypeImageTableSubtitleStyle: { - SubtitleImageTableViewController *tableViewController = [[SubtitleImageTableViewController alloc] initWithClassName:@"App"]; - tableViewController.imageKey = @"icon"; - tableViewController.textKey = @"name"; - tableViewController.paginationEnabled = NO; - tableViewController.placeholderImage = [UIImage imageNamed:@"Icon.png"]; - [self.navigationController pushViewController:tableViewController animated:YES]; - break; - } - case PFUIDemoTypeImageCollection: { - SubtitleImageCollectionViewController *controller = [[SubtitleImageCollectionViewController alloc] initWithClassName:@"App"]; - [self.navigationController pushViewController:controller animated:YES]; - } - break; - case PFUIDemoTypePurchase: { - PFProductTableViewController *purchaseController = [[PFProductTableViewController alloc] init]; - [self.navigationController pushViewController:purchaseController animated:YES]; - break; - } - case PFUIDemoTypeCustomizedPurchase: { - CustomProductTableViewController *purchaseController = [[CustomProductTableViewController alloc] init]; - [self.navigationController pushViewController:purchaseController animated:YES]; - } - } -} - -#pragma mark - -#pragma mark PFLogInViewControllerDelegate - -- (void)logInViewController:(PFLogInViewController *)logInController didLogInUser:(PFUser *)user { - [self dismissViewControllerAnimated:YES completion:nil]; -} - -- (void)logInViewControllerDidCancelLogIn:(PFLogInViewController *)logInController { - // Do nothing, as the view controller dismisses itself -} - -#pragma mark - -#pragma mark PFSignUpViewControllerDelegate - -- (void)signUpViewController:(PFSignUpViewController *)signUpController didSignUpUser:(PFUser *)user { - [self dismissViewControllerAnimated:YES completion:nil]; -} - -- (void)signUpViewControllerDidCancelSignUp:(PFSignUpViewController *)signUpController { - // Do nothing, as the view controller dismisses itself -} - -@end diff --git a/ParseUI/ParseUIDemo/Images.xcassets/LaunchImage.launchimage/Contents.json b/ParseUI/ParseUIDemo/Images.xcassets/LaunchImage.launchimage/Contents.json deleted file mode 100644 index f62085cfc..000000000 --- a/ParseUI/ParseUIDemo/Images.xcassets/LaunchImage.launchimage/Contents.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "scale" : "1x", - "orientation" : "portrait" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "orientation" : "portrait" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "subtype" : "retina4", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "minimum-system-version" : "7.0", - "subtype" : "retina4", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "to-status-bar", - "scale" : "1x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "to-status-bar", - "scale" : "2x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "to-status-bar", - "scale" : "1x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "to-status-bar", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "1x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "2x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "1x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ParseUI/ParseUIDemo/Other/Info.plist b/ParseUI/ParseUIDemo/Other/Info.plist deleted file mode 100644 index 6bad7e063..000000000 --- a/ParseUI/ParseUIDemo/Other/Info.plist +++ /dev/null @@ -1,73 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - Icon.png - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.1.1 - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLSchemes - - fb838719136190681 - - - - CFBundleVersion - 1.1.1 - LSRequiresIPhoneOS - - NSAppTransportSecurity - - NSExceptionDomains - - local - - NSIncludesSubdomains - - NSTemporaryExceptionAllowsInsecureHTTPLoads - - - - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UIStatusBarStyle - UIStatusBarStyleLightContent - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/ParseUI/ParseUIDemo/Other/main.m b/ParseUI/ParseUIDemo/Other/main.m deleted file mode 100644 index 91134264b..000000000 --- a/ParseUI/ParseUIDemo/Other/main.m +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2014, Parse, LLC. All rights reserved. - * - * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, - * copy, modify, and distribute this software in source code or binary form for use - * in connection with the web services and APIs provided by Parse. - * - * As with any software that integrates with the Parse platform, your use of - * this software is subject to the Parse Terms of Service - * [https://www.parse.com/about/terms]. This copyright notice shall be - * included in all copies or substantial portions of the software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#import - -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/ParseUI/ParseUIDemo/ParseUIDemo.entitlements b/ParseUI/ParseUIDemo/ParseUIDemo.entitlements deleted file mode 100644 index a812db506..000000000 --- a/ParseUI/ParseUIDemo/ParseUIDemo.entitlements +++ /dev/null @@ -1,10 +0,0 @@ - - - - - com.apple.developer.applesignin - - Default - - - diff --git a/ParseUI/ParseUIDemo/Resources/0.png b/ParseUI/ParseUIDemo/Resources/0.png deleted file mode 100644 index c2c9bc03b9a00c3bfdd6efe6b2350ae96c2f2a3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21533 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 diff --git a/ParseUI/ParseUIDemo/Resources/1.png b/ParseUI/ParseUIDemo/Resources/1.png deleted file mode 100644 index 57115b9a4e27ab016016e7599bc2e7805bcfb4a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23750 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 z 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 Tq3NIhxwx#Pl0=D^q2K=n5+qe< diff --git a/ParseUI/ParseUIDemo/Resources/2.png b/ParseUI/ParseUIDemo/Resources/2.png deleted file mode 100644 index c0b0f5ea874efc1ee0fc0f76ab51f0b13ced7bdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20857 zcmd^n2|U!>|F@8AS(7b{vF|g3VXWE4l6{x0!C=JL_wCxUCE2osvWBvYWZy**krc8k zWJ$7wo>8}M_ulTk{eIo&@%*31>&48R@A4B zZiZ^AVwR2${0J*Y3nagngA=AV7M6sU80M`5(hULdaZt!(cE05JUh1;luRcbM;2MA-wp|t}LHHzTn6sT`gTuPHreiG~f^yVd3cRCJ6){ z4)pcwv!8A#>)%E~yZ%ZGLr~!GiU61&B=9{m4B4;#{m#k@;q;eAR+e9FoZMaPKQXeh z6hPV|9gt`@SBxF_uLe_7`)c~#;T#;kYw7By;DI6jYaqXC>8k7PgcQ(5x;nbMSRxfX zFrKh{kFl$pHu5hb^@a2Ap)lRQ3*=<$=;r8Z>-ZM|{CfFw7(W%q=bT9#W<*TG1%+`D zahO{vu*9b<{jTk|97|x5B&LR`Ju8G8LLT9Ul!Ac3LVO@WJ_uMBEGi}}Dh2`ZfkebW zAPIp#_5A~moC^|z@C60L2gX>6>Vk#EAW$(uC=Uqo73G_rf51?4v_e^Xf5G@$Pk!t9 z2aHeXjxM^6j`mVAhf@%s`6ZqJIUOi~Qw?E>LLUa0>ociu4Zgv$vJ|s+ba6nqNueAN zHb?;{w2g$oZ;jvd#6(6-?J&ePC^W)e-qF(iuv(Snr7#!xtx#5C3Q#!_Az8Q(NEQNu zih{wi3i5Iaa$txoSVRFN41s_0gMR;{Y};}x&NdMI!Nc=w|==`kNPyn zoe(ar$irHe1b!*zucGjE&L7%*niFEKj@E9T2p6P`4Tj8jA}I{`8b}F&@0tAO`d9Q{ zp*?Mp=)+R`t0MV~_NmujgP_o^ZV0p`^4B<{ekjhLk-sthYkY*|rx|4VsjRKOQ2e#^ zk7g1Ahbn51`X7=2OIrlm25BWF@P*cwhClN9tsMT8GpHB@Go@i)CiZ`uGZ_dBECg1N z0fYW(Zv5vtb47R{|8LCLAH?S~vER?LzfQoH6#W-D6XXMf`M^+JFjNeq#~=s~2>eNm z|J$5Fgdno=!XOzz5Jd1$&qN^*83hrjoT!M9AOs?ZSuFlf=Iry_`@Q;oQPe-H<>8u# zky_^G)=hDExdFeMFladh}WDaR-+W_uy_jnW-1Mu#H#Bgy-N>2Lmg)`P>#R{za1_t~j$ zOn*cE5?%SNjlW;2zEXo@N*@ds z5dw+)Mok7TDhq-M!4x2nAE)+5Aee}ZumVg-RzwaWBn*|q>{0(qk6@TR6kJYDL=fYr zkPuYi$ALs;!4MEgK~D5nYM5Zl3Jc3&oDzm(ChYftKDYk9wj>08tTMkTU|pn_n<~N^ z`JYzq56*l{sUKGRZ*F}WOC8~Wl+v|DxdPmf4o>!%ojSl1;R^V5cLT8S2B@JhD-6;e z0JlfDxH|zj&su+a!v)Ypc_HmxFtWe2h^VI*0B7lrjDRbic$}kYDgm4t`3> zA07Ow=>0hC5%CrVLw@6pxpDgRK?kGH$e$zrAK)GlbIi_F2%wF0!`%G+Z;8Nvfqz7i zKxrZ{+wSiv&kvXR_YjVV4OkfRC9O)14oH9wMl6x&pX2v~m`BA}=xZT=!x(_k9_UZf z{ttkUiaQAOCEGeqj&AlS8(X)3gZU4`9uaR5DBzo1|6H2?0qcku3V{G$Gx~G<{ub$o z*g;?b9i$s(@v(9JIdXpobVS@lAm7&Jzc3qr1n`Ks3V&0j{{qv0hC3pjqJNgzpR3y+ z0X!nE!lGZ7lz(N4{s7()F+IFJfdX_;KFFU`p}zwTa*9jDazjg9T7KSk#Dp2Z>;=30C-ef z|G!xeF^{9aqeA~ecK;LLBg*pO)6Y*2{s0CjS6hH8=D@(Ew@rO~5i1nwcl5=!$LZH2Wj_Kbb9VNT(soa0Gnft`-dniZ5N(qUuceDMu zZ2bks5i$D92>*}H(2|#T=;>Kmh$|})bV>zZIIJW>8&~1o1Im_g z-Q!eLH#ntQZgH+{2kl}}4R8cUWM7awMFcP<2b~3+#fqblO+JnNy6(fr%vx~-r8boL zYG~8O&hiAr)n-0j@Ycgx*Zvf-agpx0%*>!B?bnvgy}gu-52yuNtZR}391j+cK_G&N z_ix|r5m6y=ab$@q+om{K#&>Sh%M!VID~4bp%2ReKC*d?EbJqaDehCk79l2ZI4e92Z z+|TWMWbInZu3F0y0mL0WKU*A55HY%QV!A(XQd5Q9qIx-K6s;3VZjq#TWu4Oz*!#o| znarRh;Y`R;gKmF(3qBnuvp+S3XxZyOJ@x2;V_T`WDBVag!R_#*Yv=T9vCB=!^46J+uMF(r@Hg<#Iw6T^mH%jg0MakD)n{;X8_gOjf_;K%qBp0-wgN1 zrCl@2-@Qdu9l^oV@uV|F5{s=rMT<21<9@@y9cP+{)^dtUMq0D+Reg`~UwW>Q%?CE( zQ_lO5u(D=3B5_ZFACod>)jz|nJ8&`KBTByw}J1>3=QmnjA#&9Nrw+<&Y z+q{RY5?_Wl2=U1LK@Y^RQAkmxIul^PYF;04FR6FnzQ1ujc+;IYpp2a~*Q#|vGSd+A{X<{eDJ7j+dC0t1gnC2roNxovO@`ur{`tVD9#KdO&urk?7R7*}w;Qd?uXUUf*~@N}G6gTA~^!tmc#CU`lo*R9V@uYyp!U1#$d-iSlx@H%3hQffLvPda}H zYA2%Ep9Z|E-9lGI+NBm-hJs{uo%0V4x{mq1-=w&F$Ss0` z?aavu`E8~y^=UWzGnXWG$QZXjjK6wbm_s4h?nol(%(;%=Xu3;j<{v0^MeBjc>X?eN zdK9NE&@eu-`+d0&St0GSM&RiQzL52vw*7%R1Jcj|)@!px=JvDg?)1>9+m20L4@VZT z9xdkhD**;8mb)vET+aE7_tgVOG61spTJ4#v@bfB!9(RmFPMg+Ejv{cJ9s3yzbO)~P z`>+x*_GN0c&KJK}dzXuP*1(Oo`CLRXqbMm(y*x>weXjZfRr%;8YJ!c09U{@P01oWu zmn`2$=Q#DMz0u0CqY5({fof|%DGO~6Sj`DDY}nQjYM4{sE*HptS7~(+Ul(^#{^k;# zjGUuNJCc=W7HMem&}Q&-KNOVKPExkn;?Q8^#n@uzj!0+^`Ivo;tSw_@0)W7o^|4 ziV*18zSLaGv<5y;>hk+FpCwGI%D?b3p_r=Xpwt*dn8uHb) zX?%?COrb3AnM6ZLsRP2eW~8x#_sK^=N=fIE-**7(;AdRb2!IUKw_9G=we;oOx_YMW zM9tQlAg~6B;)_?Dx@#LrGO2R;(O$dnZac0$9n&ax+{cr5YdC2(F_Dh2vF7pI)Fl6S zilWfG9yU{BV|}6bEzNc{aR*P^i3?;WBhrR%7t#r9%>sob8JxwZ!QP#9+w(bdXE%Ia zk(r!$&1wi|zeT_fPKp*2B3!vgmfQZw?3fuZEmK-~p_^y>K^2Ww+(3$GfKaCIGE`8qb z60CShpVVybM)W98+{)LI5XP5VD!V{PO*x1>?a$X9Qq>>eGuT?GS>ACbmu9?y@}rj(J|q1e z;JiY$?$hh1Q7eio@wjIpkJG9GHVa<|Jdh!7WY`w-k_4FUw`BN_WTE?*Ef7<@r%N{JF}uv zfVYs1T7%O7ktyRTz#pX?Iqeb!DTV#ItpJE^op(f_Oo*H>U2QuiA9@%zkBhiP&>gC**>sr zn3MoMVvLsclBY~pQEJX-f;QLaBX#ow$h-1X^`m>{RKlxjd;R0s7?O|i67~aqEJi(U zR*0DSpgAwSUyXh|>0@x2eZ6|+c_p==^fry_#ChCMyqkQR@~3&~tbMXm-f5Yf#X?Rm zcI@@HRefTpa&uIi*Hs=j(gsAd7c~?;5rk8}CNv^Fp6`zP=JAB$@7oYaZBiD#y$# zA*VmcntT)G@6B8s!QhT_je-vtN^aNyTZ2?W%Kb-VCcWrteOXuP>Nx0JfIL20ZQL=@ z^z${(9JYfG%3punf~u;~0V~jaB=x+feybs zXX*M4Vko_$H+M&TY*SOP!_HGl!-EbdiS;ouV!uf#;j_o7pVJZDF~T`XA6jA4l+b(r z-nd*10Z>rK&dH=cC0pXA#Y)=ffUBG5L({e6nHe%o{VOcC17W2`4`9#v_?x>+$2d5M zQ)l1tX4a4p$>`ex#@`cxH+q@C>ya`veRE3Fm&mibFQ}MkJl|SuPL{CF?an4Rj}XCScFF4aW`PyO{ICSe z$j2LOY-#P{*EG1X?Id#J{dl-<9;7>H-V$BX!tF^-)!-B9bFkDr4PuQvXg^**uAHWt>yroF`>iSm-3$BI)_i@5gXUq zPrQlDI%fJ{BWy6-AV`d_$<=^)D-Z3=I=gb0nEio4f~igISby@e`wHW%xi2{Z@M+?) z3w`XTBKq`aC2UFrXQDz96GeY+9Ys(3lF;Qs zjhZed&P>A%Qx_0(Cw*?#Rz+u?*xFrs-kG%U77tR&+R!`RR^LOrl};(=$#@mg8O=H# zI&iEOg7037@LZe`;}cu7Ag#RC;2jblSR=3y>QT{lBQwwlU)Dy*;F0*NRAH7C{3VH5 z-i5XU+%=Ol<*C*Bu>}P_!B)CwwXdF|$zt43#af;`V?uCuY(U^;$-^YGS=BR2Fvoj= zdVZ(q&bm4QuPOO%WVuzLQ(H(~UTwrn)oGQ7usmN}ZKjnHbPOVW%9=7zMi`fdXnkr< zpiOlmb2%Z>I2%G{$U$^k+Bukx#jrh*FD80H-RnXd2~WOXi^i;n&rR=(^wc&9mKE(= z^HPi|_pQnarrB5CzA261T83tsx`{n^&!Jqwo{L!8i!b%qn0513pVj?^VWBUz+$WWq zzuj5SkBZWxJ>|8IO4q)>0ILhSHgRB#MoF0_z? zD}ykV+IlL{MAvyOlPy&>sXd3dkbzwS%1gQRGL@KzJi|Lm#Hc*%J`2~A(3kpplee9t zwdbdpjcln?2_5Hc*q^jrT|V}a&gj+f2kg_ORny7xM09!!i}I+wq9=1=LKB2V+C4O9 zfHuiD_+F(-ymb-QGc*-@xe2Z=hO;Sz*eEAbv1=MGM1Q!1UjUFnxO4C|#Sq2$V9>Zz={ zzH^_%pVz|FFHBbOL6DG3^MPb$gwb?R%3}Qv$12f8o*69ODN5`lLj++GkxQ`C@#yn= zZ^~{^=OK8*#9jN870j*UAG_QLeh4TTNBRhtQ!PV+~Sece$hCU^S;^s zy2ss?0?73(grd8*HrywN7y4&fUNkuG-7$LP8N7(h@@5?k7VB*BRD5a&MY8akX_Idl z7(E7>oUTjC%u@))e?SPl-Wi-oJ{o6WWSMy1Jb8%gS-(+o1T%d{xGJq#z#{g+erS*z zS8;+IK3otQnd3G8Fe>FBgo>fnKB5>R~`_tNv&CU-pNnN4ACWY&vu>U)_Z zu=q%OR->y)D*J6d)1L ze07H4nrU4_SwN16v?HY;ZGpj)D~zVvTFJlxbsh17B8C=!{+s9Ogwn-LX`>Iy0P)B{ zF81h7w&imKxfIh^DP9po0#wGAUu!;nG9hWEH18+7rw;366nMz0L^#~c1vH9ynz9jj z&>)b_eG6PX^T-BC%%%=yJsOZ}mu z%*ZLyT!fanv?1Dteh_`-(m5=+ND-$vF2aUNrXZr3mSjPLdBc}vrz_?hw>=A)+{}f6`U-4n)Lj6i>7<2 zCCeGtN$0ihbPH}uEOs}tF}T*aj?N9qRrK}lfRaj;1A=9u1S*FOp9+LXdB)51E5wUB zoi==zA#h&dR*N`@s9Kt@%sJn&PbfzxT-VJuS>;h5of1z1bqDQcNK61I^^(`soB2i1 zy@2MZQFHG$5fyu7qgVPa`K5S#o*!M!&%xxZ9vGRC^-><6Qx5QO(bqKGG1(!ZeGK7! zMhVVtub95YVW-C`s!=vjG_76gSCZNGNwleii2+P)zqBmw*g7R22B0_8To z<%0f=qMVx&rj3d7%!9%^3c8*bTCsa#aXP!C?i;(@@vY1t54bE66c$PPfO`Jax?aXL z?KkK%`zZEw=D4PbE>#LqUm%}s+KuiL>m&7)Y^l`d_UpxZbgD^$O_Ke~Ie!^wp2bAmDx~xd2#NM+tn!3X`S&KSQN>{|5T^bT_B$?v~ zfH*HKaO&96fO959ZD6J*Ol&KsoX83bUvm%LmhT+6fw$D<*q%e@6{^?zg0B3$x|925XjKN; zMb-y-OWpzah}3Kz_vZz0o6F}f4i|-iXE0x09b&{lUj)QE<5yX+VF1lT=oU+rSy^9c9 zdF4Sr@4pM1?@K2Ml`mSor&G(W1CKcnt#~|loc_N2z8)T0#nI^Dmca(n_4xeO( zPc-Jq8B^UcqLgh^f2yT_*YXL&+8BF;{2VT}^VPWFD=w>7&aS8eSmQ}&^Ac(xxEJLs z^Y7&>Ihe#(lJQXUo!wR&pX33n)7a1ZTrze)v6h`k&bqW#ZGN0Z<}AIlU-GNmBbL};bjCTeluMR9~nlv?EW8}Nt6l{VrMf)+Gl zpv?Q2Vo{CJDVjH@l!7#YNZ45%OHQsx|Y=D~~f1Zw5=5_NUcoJwKk*2D`D zT-|jS@s}h>S)bs=O7Qa1Qhy)3>mb~16JnsN1XAhF`+>+oLkfkNlF;Qo7RWaBq^ zEuvp|(ulfXThdZ3tZt3vO`oF6C2OUbst;p%zdRm(Ji4*vV}nrSYA4P>JyMPeEv$!q z4W^h7oO^kn3zxE17T&ji}Y-@SNy`=#eubW$v1v0&=uLd($zC`GQZ<%`Er`kd=AOs4=vhf; zn7gGPAzTUL+fwYF@I%)4(--!+K8Z=j$$1;h4`AcAU4Ie~CXfPB6 z)Y-R1ossg#y` z1=5i|S+u33Dts5s-9>nJ;+f|pS->{xcxEOzy!7}C`9Lj8c&_~fTTA@OyjSWU*!1A! z!DsB)m>-(R-FMJCquIukkQu0}(1fOV3aaCJv{MlxYd=Op^>j63gzHKO3)ujtVQO0k zk+E&cU?T-Pw4$p4&9%8~HYXNWG`oK<)HrFN(sk?DrM4F_AM2$UJYSCD@NE#(&{5Vg z+yJRhUDqktmScIG9UzG*3pMNv(-ZsIABx*vbUq;~e={B&UVA;ZJ=VV0|Jx!@ww!h>Tx1Iurk;#H2*Icq56rby0HaJH%9#4mwJry~J&PG3L+&w`x z^1cDAF-=n8r+I-vPd5fKK)YuO=yjZ^X3+U4azffqj2hoDqyRur!_D+??Hs%Cyoy;< zgc@u2HBRsKE)8afF1)Ix(G#VYeN5i8>%dCO!fqY358lw9?x0%7EZf_z{k zhDh>?Hju-Qkz5aaI zM=+1E#-+=Jgg8;x+`l*mqzI=m@qW>hw01|ojTW7>Tx+%}PR}45R-nJ&R%o8&zqvM=z8&8vBD^fmoe1;_<{T3{Al2k|By{Ga#f3G*N zqcfaHs!KFdJ=u#UZb*P6pz>NL?3W>TJw0R$3Fk&uC*pXhP(t0U zwd0CcSR6En83R3tcgHHn!@&Vcj`Apo-{W(oV8a6`+?r^(9=B=go9H_u-MV2r z91anCTWkjGS_i8ilLl&T>$i!Q?w`BM{6bqP-Ui9frmVV>wDfc)p}(=6W3^xYP4|^O ziL4?B@6c?LiJ#=4J4XaoUPsE?wD^nAt~WE#o{!zf)KS}^g`#!dl#5m9kmq{XiTJ#43~-UbfMfy| zG);gRd?#>z+2~Bn{_(Ao0k|xeh$lUn;zoVr?nT9gvM83jJQ95pJHAwoF~hsmK#K&T)56%WA91G)dt0Bzsiy?b@>w#@Fx7%tNC% zbi8y_&%6iVy?YZf>2oP>w&wukF{$p1vN~Z|%2_>c&!SkD=f`~Q7FRa0ixNq_ z=6rXFo!Ro8JNwT)wrN-%J9L`vhfj`@w+*D#dFNPLT9ZEjzE@8VeC8fl|`l3GKf z*;~mPbDvA*Z$iP@a&mn-ygkSqg`0TwcNlxAWP~V=*IGmt@)^Up#_pnVTE)h5*+ZRq zuH97bLYMi7ZB>iblADBoEU^)(fW1y$WlG2kzfLu z%cV{yT}|80^Iv&OBJ0th%zUh<&~tmQ*!l9_zCyu$ILhlP8a5O#NAFRSWW6U zxc`LXesoVyRd>e9#4}{*Y3os^gHm10UlCNTt!Lg)ob UU0p0V{C|kb3hMGDvKNB?7j$%z1G?57yDKNLPAJKh=qkkqN1$${$D@%pY{ar-@9DD zBKKd14SNrHg;jwB?ERY%xGNjLu&{_I|I@IsGP7y^F&H>#>wD_IQJ1oEbK$qJcC)nM z_jPgq$Bl&r@|F5Gbg}WYVD@!!c7;j#%CP*GL+ao7KV$(G=Kr#II?1r;zj@27;O1e& zEXFU&FUSHWWM*atd05*@y;pqwzvBO9GA#Cu;Ku}mf zSeWl02OrGO)ziY4&lSe{KT7@|J&HCkD-Q>EPX{+w=KtumuyphClwo1{kD>qj{Lel; z9c=$!ORlj0b?cvl0{>YN5aJgU_`kaUiGuz^mD2QZu=!{CKl;H!p#O6I|7ibf2PE(x z|U} z#WaR=^&$8tE((S>pR8jkCBq&;l9&k|J&yT-?`cb`M{^KKc9SVq|rM+zP=P-&bzFg~Zv7{A$&3Pm<2u&loD5*UmaZK9M_+c`wG~ z+be|Tqwy%)Qmo6yuc$sMiMYE>?eie_s9;)as6;gb7LX$$+SW8)1NSPYdto69$r6w2&rp? z)t0))uH1$7d@M1Y^^dx(1U<)4_B2TlKh|7loGebL9PhK|(Ug_Q zpTw-H($Xo=Fa!=XuFEiHJ7r8}5JE}=80VT%`8YTxmVHB(go-c=(k|MFSVU{+0a z{%dC#RejA20M0W(TuGk!(bnz$nd+B5`z|`6NFMZZS`aBW;Duy%=D2>5ReLvwR+-c) z<{4*TcZ0_S?wu*H{q-Fe{ve7gYbTp{tl0F(W);slu~e9=&bd!#)kLU&!VUOR0)OjQ zSvJxwgu(7>TzR`=WsOj)b3L3^Z6$bsUMr|yo5`mCbR*b)se7?Olk_4vek65}d^9MC z-NRU&NzdV0(kNGG{)q{P>EF}5ZJa2LmTrc0l>y6Vs|8iYSA84?-yWxv^O+G$e?ws< zOl@$^VYc~&>iZ2ltn?bTsX3d^+*g4RwG^7YG1S4*XB_<%TN{v;9_jF$NyKo9P)^!j zsJgM3iVDs_F_)N&&f2JapydnhroO?a;+!UEtfq~ZT4$Ec*i*@ptu}laI;2>c(pEX$ zUhnc?jWiMQUBFwa56`RRnXC9b*!(1Y31r=|M;ldgN_r>swW05dWr7q$9+~4NU>=Xt zEIsB?rHozD*JhO?fe@#D9I(JCqFLE3$?KJjRuGkf%n2-I*RnZ(jieheUs9U6V%UKT zgmM^4azzWtq>B80PuSmYTjTzgRG0(l&gsyCi;yYob8LOq0qoN`R00_50UZ*`d<~ta z22)918eZv(7&IVe8vF{&Z(lA!n)e-c4I25x(q13*o?7I9`Nh(14~xtBFWoGhvoJK$ zO9|g9hi96#vz#g#e-!(g`*Bj-+P)NxUBOte1 zDudP*+3*JHBP&^wrBDp(SZ(RzRB`s0DNc!TOf(B+Pri6>Z(BlPYa)NVH-<#{!GBN4 z?EFKCT(xpz$!TnSgAS?rN6i;(8?1h$WAC)|z2Pbd&ck5}o^0B$wpgsm6k6FA+|1)_ zE7YQfBAjuqqTVFH8s-b-a`C}y+#d#(Y|s3z_gOEl4XFSi{GBJuO1~$?0e<_S*N)4U zlR}eP=*KO!F^Nw$Ia`3$+PXY#Pmjjune+Z7Ni9C&Am*m17&yFA+4N`l>M%~di>MPmtHOP9*U~3tF6(4%> zP70fNgXn%o(447p9qQ`Q!aBAaB9u zdV$_Ug~(%a8oD36%i@v)FE#3_C{*~z!&qz}&f#AL=H7a2-zNaS41sspbN0pZZ&E7J zF^o=T`~^EMIn`7GKWU9_?U`QV4_ZqnE11v@8#wSLwM>=0sUq7-D!^ubVr4EB1?Zpo z!XoX7w2;n^zLp*pYuh+rrG_`0e zv{-Znmdhh2z8Cm&CZ0y<>t&_YPSoq{qdKpEaWr5f2bK_ccAS!7scH9!_W)-K20X9+ z+sRW_78Ox`MkQA&bNhpFcv6W;A@kkOzZuge4@ZF4($p}|h1D^@QOQ(empAE!UmFVS zJtnfIGTw*lTL`2R4!5eC7JA(@W@?{U;(;h1Q(SJSTt9cNO6{u#^)~DKxE|p5(HTJo zCg)n0C8Am9uAI@|oBbaH=X5HoWvH7WA!DzbEys?ktr~$+u1jlMtut0Fe1*xZP;{B> z?d~t0HAov-cUwszTQ5*^_hs&#=Ytv()Zcoq_lIi*r9uq!yj+iAh|7^SsqP@gyb{`b zTC(}{)>c-iAjcPy6dI$y37P`NsbTH2>f!B7!0brhbjRfD0(SrmV+Ja($3lLK#&&rv zi4L@Pw*$G&PHGH&M#KhOwVm-{C%LIEQJFme%J(oG7io8@M;LCm2yu>3d}!9)u+jn< z;m!E6s9&;C>CtN(BC}(;Fx4o)Aez2mJ#l3*0bpYgjce>wP|)u#Xs*oi=6Sh4@tH-O zGduV9y5n|66*fk+ddBlJFXIWtye=!t-6{J%4MdfQl2^l>SwyCAjvg$9pJVb6tUKk?2PxJ#;D=Iq4TVayzJ5|oltwvw}sRF}+C~MMKbD_if zxNTS7spF9ix&{h{ZCJS&|Ni&12sGcrg7`sw92;y2)jvBsP`Xt}8+!wIND`3-+4gdG9g(we!s5 zeF-F=h0}o7Qh5Qm-G`f>{5pqpQg3G+$IZOgK#+VFAoQHSzDuHiDQnBNKSSK3^tkkC zZgn8~O~attYOaEqzDuqb{A0SYznEs>)g#m$1)d~-GCgop7NRPIKPF)BJpU92;(Sk3 zYB`VM!o7ZhUk_jTIF$JEv?Fu|zzn~Iv03fN;hzb_CKjkR@Ad15qK&zAh1jEoxvWCz z|3wmElXWd7klf*rl*pTm9Gxyx%t|=&`_af7C+e^H=)LJCe{rg+5K+RnUs-Zgtw4NV zjthm+aZFkk^yJS1H$2*7YM)!}3d>q*x6^4CYQ zPw_)+b>XKFc!Fz?V#0h_*`11hg*{UyD>4su1?JkT)#pzt;Owkj(RA2&LGo=8k7OgU zUhMo`T0Nzgb2kt58{|71;bx9u(~sQ-q`iXu%W$`=YVMTgS9?$o2Y!#jspe%Xo1=4Y zxVpr)^5$n*AqUs2DSvCi#OXuK<$QzzXF5Fklj=eK=k97a0qGf5jR@qNkgs{v?AD{9 zo#S5!5wlRpeI}M(%4c+ClneFBwKbdNf#dq_vQ|O?_{O*PB1OZ3Zv0_r49u3O3E0q9 z(S;GG?DTa2W`C>ALWl_N=3X&UO&#WWZS^4QrBBW)GKA&~FHigq=fDDHPC=If>J}U* zef8vG_I}q&zUbw%-fKx!n6dd7dFu~WYrfDbpGpj1Y*IYR%UVg1wWro037yoxS=eg3w@|I57OA`idyW=s82NosN{Y{DoV zX$!9`0vl_UH_gw>#^cJ4ZFr~!`TNHRS?u{*GEfiwN|BX|Pn_N>Gm+LNo~N(4RRfGm>P$tNWSK8JqVuuSce^9i_vlz8H`kadGKp4VU~xe1 zt^rz9v2_gCAzY1%zbOZ#0&O18p^_Rce;-+~;;SQt{{13Exf-dwH6ndI4R7!CS`*(| zlsc_k-lBEm6rUa*PxUN24G}5YEY8mIwR9YP0qjk_i3MwC@7-NgJ^J)3SM9ymJNK+Y z6&JISYO2Q6f*p||UFXl!BOiO3`>S1|)0qcO0oGhrt$(p=bPf0RGQBbzot=tOZTvB3 zUx$s7b$ePWDwW~!8iogrhsi8$iLh?XVZVOwVte9HfsG~)` zEOJG!g2xVOziiwkxRBEMHjGM5U(?4tZ(wgS)%uhkOVT*fG60;pjtEc}$D`h45vL=h zEW7i@eNuh2+~BQx0;{h$_VR>t^KL^c5*4h;$EH^^QKwg-o7*;|e|>fYp>G;sJx`ro z5i1QMkVxBhqT?Ru;M!ixOo$|Zn2WoJsOaa~?g5Jti>6D7)nR<5HFmq_?V3eCqtk9} z{o6^U!(mG6uXAeownj(ZDjjv=dKs8uRqVWV88&I+%0!sUyd`lir%c%MAO z?u9!weW!1F!tmt+LDN#MM*E)lSpeMgS%~KQgzYuX=sm$}zyV!@hp{`;a2Q5QgY$T_ zDSTq^&)bOo;!*IX7>n1lpuLqfwmrapc;uNfS&MJ6-hn8&1_wBlh=MDBnqGKLip@TK z`A|5Sks%mHKu#a67coq3>hC)#$TMIh!5WH`ydX_mOfsa!tBTrhRSV7iAAQe>srkg z^fje&mTm>S$)=XufIUs+-zx%hpYiFBFH3QpD`w@}zOi|> z8$Jf1c$4^SR5j&{PpkJz#9Z54Tyxo1N|rg=!xp~GGm7$|_#~W`JZr6saoOqAS*JkHw%xAn=DK*1soU)-F($UydL|LOLA|%B}!&oK<0NqX;`VZy1HAe&oukX)51it%l;Io<%P`;R&@pnt@(>jqt#A z{5i(8s>u*4e`&%-(kFv<)jv(;ri%r0Uv{PdrQACz-N*Y=SM^{n}g*&Sj z5);?1JiAGm-v^R6 zpa=>%zV~=;P8|2{Ai)COP#}N3oKczh#F`g}Dw`00d_}d0Of6o;h6i7$AwCafY`dx} zaDQ&mRu+_P7LqC9?=7yE2HWhOKgQAxNR@u$wkp2C;jZ;U-`jNn`e{6L|CjJx^YfJJ z&(x;I?SFM7`2P+wH3a~JFH6u$hcB{6LJZSH?8f;7vV)<150?w*&vu#ud4Btm=tkMU z%jXpXd1j2kn~@o%2MB&2Gaq8T$)v1J-~i4$^I=XX&>tFO`m+O0v}?Ks_d z|GKbCmsk#(KF3+Rz8ZmMzYz#+;lyyKp~z%cgBkI`WDmOX8)dRO+m51o_eZ)@N#$R}a?v+cI`ov{hxmu><+ak0vU8AmjW%NQGuGmyG=MGnJ| zE<`&epuK|yzv)l)hN4{Uu!j+;#?ff3@xIH+Rj!%dPu+D}B{a)ko9}mSDZ-=LQo0IM z_blpT%OZ>8*{;wtjOl$B&p(`@r+}hLj8oEPMKuQAOEJ~Pk2Y=8wJSj!EIsqrUo|8R zd|5mWxpLi1f;^kiw@zt#tI)0UqPr90)rUFiblE>Mun`DTkOyWqn$hUt&PTQZbdGCm zpuuQz+$D zOi6P;srS4s{{dtC3RJ2z4FGDjT$?nw?z`Acs}0=4S88k-^BVMh3igh8Kl;M>u8C}T z!1uTb0<{4}Ee$+i@{yxBJICoOUj~?NqgvCMZg%qwgE2qzOoI>S!S(mZg7Hl`V8e3A z(IlF9IG6(FQ8q?!_kAJ2%w*q>7y3XeHm-!&`*+uAP>I$^7ZwV;oeG+woP zH$NAvjJ2+k|BP8XEH zV|V;mOV-T2Ym-MttS!dH(0;F(jn6x%c4$9p5l6;~^q6`YVAn+Ybi6%2Etfb)nd0-} ztA*-M0pw8gQ)aFG=j6WY01m{nGGFV2_A>^LaE2x#i297=&X;7N4c5tIG$lgDYkS}U zv1XJOP#J&cfj6)z+Il&Oe7#l0xbYxjr{Rht6BD*uFvREkH|b}y(mJP{auydbGz$rP0zbWN2mWi)MGLMC#X%# zulWZ05$b)k3k6~~jWh9kIB z&kW6u6pEsiD6+#bddE7@g3Me((Yb|Ooi$kb^@)vSxdGcjV@Bm_Cd&DbjZKKn5=+k? zB87MmI@cEyB6exftG^@BA(*4_jc;wy=}b+3i_nO6OaT@!Z)^W+{X7I2uA7qIck-f`DOPpFi%r@re!?)H$0LJr=wQnMHqw0U4up9EMOaNvs zt=2HWPRA#JUp&>b*0?2`H65CxRx8!!$8Q|BK2+u%XI-&8=FrzGnDN}0@g+nQpXuj& zS}wdZpQ=F7w-Mmaj{=T_vxK;!oKd!TZog-Zz3VF4P0SPtTgJ30W8?XhLag7Nk4WUeV35rTjU)o zqaXb81pnT8Co)`fov8`a>v1(Ua*l0m@Q~ASw}Gxd@%O~2h1`GvT$P5V!3Qce8*;!( zoNd{Mu15af9rqC<9T+lj4ao1P1{8yHR4b``^S}x$u;nZWBa)#P|Lh>}z!BA1e^2qz z3M^0Xs1x*ZSwIXiv_Us@*yh5+kXA5b(C$G`pZM(uh=YopgkKV3;j9L7f?0f2IB4zW z`m8dyOzwQ3Ud8NFpCa~P^Ko=h$f=F{MW`q3PTF^G+Er(1!(EL;$Z<0KitlSNr>8&8 zWHFLlXim(^sm*4N5_}nkwIyoVCzO^{r@=bn>AIDX;)5uL;`sukC4J8IHfBryMXZ(c zP6Q?g&FGhi%X1_Ip%x<4~H}7kwdq45dN#ODPO@v=fjEavKG(P(!5j#sF@HI+xqT zURXEu8eS$b;wBAR^DIcheSLp4N%?_`NkzEfPb#3zrJ3&w{%F|bXbhL)%30}wX#gk5 zG$T8;u6d9pF-x&ukI^jBaaDOcRec)P(hz=~c|hk=an|p5OxEgcR^j=-M_2vs`qH7Y z(4FP;&Y{xu$`DNbh-T2QA+(F^wb6)K$Us0EXZwA(huEqzFh1hL_`3(xl40mh=n%#>z*4~k_0V<4gcr@H5V7# zzVhdc>+wKWTE@=%^Ky}-k7N}9HL)_`sLTUHoMvO~?8wio`r-K^4FHy;qQK;V1&TbC z7}eyDuE`$+@%zv6-tuu&JsGPlt}aWAZ)~(SXv$L5xJs)bK(MSqQH(va+eDK3tEV-T zL?<~9e9PW{ARz}PBdmFtDGy?Ng1j~uMq@er&nDR!bF(An2{_puU$&&cq-xh*ri2=` zR3;ba;MmY}=YEMA;D(IVr$*fAjK^s-kvXhOSsw>}+OWUV=GY8HtYdZl4NED@nCW2} zFqfuKqQ#1iWla$SCr!B(zAnoi8EAU@2=62L!+^F26(e2X0;$>d3*Geu_)GV?Hfdd! zPl#X2G*llZ4GP6Vol#}`s3S+o@@A*N~iwBG_L-3#>scvN5M|WotVzM>{o6xdVF2e ztmX52-%T}M&zhvP5*C*$zDCk*EpBywN0HCguM)T@V3TZvdaoguhSIBX$G*Rr>XI8r z`jaD0TFmf!c1=NzfwWN)|4znq@D&;z@UZK{*YPk>&?A2?5OUy@)^Rmp)|lPR`4#iE zU*%Aytv^FRxOcJPX!63?E^P1!!tWP6_|SZH6D|Yx#P1ani2P;V z?@4f=!->rLvId0IQ=v2gq?_ggiCN?nWkUnX>XGNkJ<|XX!}#M~a!R77EguraZ)w!B zt7ljtC`ZyQOY7`i&YE8TQS$rQ=WTE=>w&&Qs0-Mth0*T^LhK4$f)KuAPLl?@)}-xL z&4=LW#ke(HJqD8m`eW=KcHDkPJjQ=|w)WSBjQ=mjXQeTaB5$h&8$SkUOv`LovU(6p z>d*8VRz_}d0{zJeK}j4mnCZjYf9`V6d=-}j0S+RDS{VZ@(AZ_W$UwI9`IGR*DSg+Uh(8jp6s*I8GxFCZw8CkAF#u`m#9}t~wBFe*KBk9C98Mb@`FuMKc#Ar5AWLtM%t1_cts%TN2eR`a z4-pqYS9)B5A(N-_^d9K%HNZyab1KL;8#~Y0=w`{ZDpx#t#>yI8JST#jN_-BY!Ixeo4#F3$KxoQ^;Bs zuY~c>z^4L#SK+&?ftYk6d>K?UZ#5yU6M`gltT^$4oQTYY*Xx)U zcB$}%q14}#Tb#f{UugkZJ^Xl47eeVQw&iQ(o!IZkhTQ!zx%1;deRi#UiNc9(RY(UO zGuX0^i#PC8&*q@kB|WH9zIxTIpJw4GKN5-154^o>M$h&d6``?pNnGMfmJI<<2e)>+M!9Gu#ulO|hCUhoBM^H%T z7Hmfi?S97fICk84<(dG-jsc>hL@Aa-7D+l}x^(Eh8W+Z~E~}A-p92)rzRWW>>P+IB zBK_V{F~46ekja*Rgr{09WuRU(tUK?5hXmf9wI0rIMa2KTmc9M?FG%0L)IZy&T4mj! zu6a0Q3dRz!Gx-VnP${|w-+kG;6%vr4CVo5RCLMO^mwz~b-rrgW{N$KTyK2%1Okw8r zV=hG+G$6CWZ|2GDCHkvxoqe1U=6CtDRyim*nG=AK)gzJUFO4(|m!n3n-KE(h(Zk*d zbV+jn&5|kWABEQb+~2W!h&fm)w3{y_+w)NzZ%%dN!DscQ+Q0{%bf-X%S3=Oc;3m*@ zZ>>Kj{XwGRnrb8jGrkhxW{@*C(zkQ1oPaI|2mBU~tIMId{_lAW6^o&6lddiY39hw>T07k#qru!B(Bgk(|6NpTWr zz!3r4+!LZhG7r*?da_K35vkEcZ{YgiJe7{j#r+v9xg1q}y> z!F>CHiCVRW0*ayj(3hnC6QaV~jUWq~oe~fQ5B1^wznVqH(_qC&v#~!HC-*n!T?kpY zW^S(zy1uf_1(V#knwTDG_Kc`Q;p-0{nEWT8HGtE4@J$B}za~?1ayCZrCjft2jSZ7 zFqzW16PxdF<+7&-6f|HPu_=-&)c=j&wJe*{m*Z)*OBe!DP8}x|H@#}?!B#>`05{|r zcnea9d3i>muv==VxiQv_e_AU)zNvzd4&EXU+?9KlzB6ifZ9cwsIt}Zu9Vx%3 zA?&FW%`dITn{=XT#&4oR6o#tTdl<_x-Ak%Olzts%xa7mnjK@)w_I5R4k1k8bPE#2z zujrs9g>><}+kb(t0jNu19oQK^h&dFchzJ9IiuT=>I+3_z$SXMPwl&$dYGe9Qij3(p z5EXpHQgB(-*Z3=T>rvKSgK1>|jP!SBrm@>d;qsdiztG$Zd;Xo+RiG_X2~PGU`P;*N z9+!7Un=wLgXqu3}gZOQ6v3~T%swKmRUW2J|lwP0esWC1yXf9L`#O#GU!bOno@ z&e*Kv`BJqmjQQ*3pguvKSe^dwl?s3Uwv&9i9y z#6}zoigXhm})_SKa>nVQv$L8of41kqag-bntKdii&5GjMQ`}rPatA1tR z%`mq`*{QkSJQ#8F`3vmk`;b7#-Sn*&4U5M5bjR8?$Fl84D+f~-8S0GFbgQN{P%zg z;B_ZopAQ5SN{f4A1-*^qw2FMAu|aFqC47bRd}AnVP-@R2wo|CMCTgpy-nX`BbR#LZ z@iw46b6Q9mGA^IC(<-oOWp|NL);W(UYgUy1o2`E3vxNi@y!bntl-Em{a97dckMX*% z>Nx=?Fnw4L|FdCp^CSPnm%+96bcZDbC!@puNA_p|i{P({cjQ`37SrviUN*{7A0M@= z9YuV&L+XI=-zk=|au2e^Q?Zn0aRXXV#B?tmeRL|mht*2)%jGs37}n1&WjV_7D)s3u zK&$EvQ0MeM6N8en38gJIh+gdlA+N#?ek!*$=i1}ua3sTy!7qvRSV^)tGt9(pdU0-F zz^|qP^EJ2Tzoc!YzGC1JFVl`#bwU%YoTcm;KBw&x)GMP($~nN!m#+2&+m#?~XIAcT zKl6QjBcz^{vJT`jKNo!VtT$1jbC>s&5XY-1sr!5 zH#t$)Ccs0t-smSrz6({GP17My1WdmeQD%(ZeG&pI9&t9JrI5m2OMu#MZVL&&?JH>2 zI;gE)`A|=+yJtfzO8`RAm9$z+@bAVt4S&BtiOgVcZ6&B0*~f+Ee9#SR1s)00;vdej zHW0%5--h`hTQDeGRp17W;R=L7j#XyPS5trJ{FhDyrft&@I3 zf0a$yuD9*8T9wM216?m13;p=aC>Ny${a5PSw!34xRAA=3 zbQT4T5W<#A=leRzvbmiPl|pWbf~)TxNEhIuug!CmD`v3AMYbdv*GBigA&34Su2WS}y@9Jr+>=OBJyvK4|Vvk%+i;v5kLF$ui0-i5zYSX zwiUj^-oDu`5kdP}SJtE({_S9dhQ0?d+U&->jOp8sZK)V>@D2~~z}te9?=))(`EnvPCYzouc?iZ-7-l~eHRS58qJm}du-FJ7(+Zwj6hIlh zSk{-L^Rq^-&7CzL>rxdEr0bM}fp9_o-?y*B8K__uqE@WopayYw$~M@f`DZBn zdxIcrw3<92`hzRTukD#}2B9m@z_Z4pLqA-TvmWkMI3;ADPw~r+uBK~aOlTG(Se;zC zdP>*$J}#o|Ya`CmoBlL~&xNs5-l0z+)3m3{2`8ba#i8JfUKn2=^gium{tRn~%=)Yc ze$V>#aSY*^>Nn!Lg=FvNQ-)-0Tb_&s+!Vy=`3SBTAC*Ws!ao5oxpk+78v}VC*qefhznN~$q~p#O!0h{Iyzhivk;8Bf z`1P=Jpz9yXKxmYT`(oKq@!i?h?7Q0RXIt8jVjL5`iUqA=*OJNOS`st%A;$)I6ru** z42;PEKwA6)A8<>PzTR@L0NmKGK%|2#_j@01pH?}uPEzmeF#iehgv%6aKVk4!vL{C8TF&%)pN!9_lXFqHK9PQ3v(Q2az0wfjuO?)*6!nR8ppTW-Rd~$L_ zqS$>fGhr>08}VVz4~r{f!tt{?R~t@V7frp%uS0j#)KlAhuUQ@%+7ZX^PGs3Fgy5(wHsO%8GprLZmQevNpS!GYj_q!V?C4)zyfu6 zs2`kPR;q%mzn%bafxOZBYEWA=4KUk5r<5V!dh)j7r7CIrY(eB*JUZ@3-0a>TMg{p? zPkSO&?sEvx{4lvf4Q=>suj+(6)eEpem#8#3IgbeVP2xdjaaRCf`C$??uor|G*b;L|@F&w&h(HN}rY ziQPWW<0y6zBK+3X+6<%!<%;$kkLWhG=avMCaHFcNZb>dbrUkF3>xrY1Lq*&zihBR{5n$!W$_p75MNP4r1q(7sBy zl5F@D%#L07*N^jbm}=Xal$H~|z+o!6oICMfkh7@Mu80d>l_HzLFyM>Az@vtICpcq| zO2V)`Jq8+8Ys8y>L0qhr<^0YUVS`0ur3_9{WD*;Q(Xx*hXu5u|Lwy8YJj>n{T3bI% zi3DA}(cG#5k9+LqkTy6h5u~r@;-Iy|RTA~?v6%75+5?U|GS#N1eRb4`o)l(m|4C1_g8%5%_o5)o`DG+f`H=kY0C^Jp>q|z^>f~g#Dk8eKD zUY27ZJ)q;1IGBM*;NqOgbdByjvqPj`_vpUtqXElw>M>4io$R&0|EkrPf&lgH+vGUH z>`~+T)}c+$GwfGb4=L06LF0sZ?t3TgF*_}9of_FRYu^nzQC1so_t0Ph-K|OZUk&2b z%t2DNQTxMBuN9VbN$HvcxJ57aOaWewj8i+-xmhN_52b-D$3Z1AB(g^jY}mjIaRo7t z#X?xB#vZQy{i5as4FnuKufU|=yIXzy4_^CIUKwQ&823BHtT&qaitZ&D8LvvaCOo}{ zEKRrQ%ec<-Mc3*l+SFbn1ie(_Z-fZFC%9v+I$KT*4pdYRY>`=J=jt1@HHKsNFWzKM46Ucxvn=Hs zslRaiDpYm$coC}JkNYsE&5BBnI8A^6Gzss;rp7m5`b5Dz2Xpj)^k&X37sl#F>Jg2qaZ$)xl(y6UZd)#&mA# z2JS1sqrxTtV>Ax*oLFO2kLC%dOMt9?T3J;P_>-|-x*foM#;i&ktuJ1O`T2^O&mRx^ z;Hoa7zweLl@;b4@$8%2CCtT6(+IYI{pTw{2d2XK$deY=eXi@U3F-2O7Kp2_1)cj18 zy$eL5f+{3}zEz)U2Mm8pUuB;3)D9GUY}?}sGD#Kb+5D1|O#*3UBGpH11&N;~R*GyELh(0Zl%cR*3&>tj&2R-N&vZ(LMC@II; ztix0j$B8R9G~hVfe3hNp9<1Q(j1lVGKySal=^6r@XExmJ&HQ*3i<umsoEB zQqeiqKS^luexX@AdLb*OxJK!c56>kLXFX6U=~=dyFnjQwjr!OA+*|%pU1I0(aqwdN z8{vzI+yZMW`_h!xL8dgN>pL`c4f4)nt1Ug>$HniazJbc3>Bsf=jU97NhuqYe!}G)k zP^JUGe*MLx(gr%U7-+wG@Q;4fe03W)01{MuQNT{N3cK()ioJ1XnatZpNUo17ttA+h zJx~_z{3vj$9|JlbJBsiRs2y&dHpdABzBF2bd{J8Xd85nkm^zy2g-G$A8%cC@R-~k% zc#)Q{m$vQjyJ=<#qj*?`pzjCm#0Y`H$k~1i?5vsMA)0FOIw8j@n!E-$^8rPDSIYeW zFPVMGBx&Z79QAHtrrmF266IbN@XqrL!b%p_cKKFF(Kgi-P&t%+fz641H8)}n+(9}n z3yw8=yRCT-a{oPcL~#4#U!n5k?{@kn;T*I#2QN#1XhZs=0?c>GYyo_mpy-xgyLG(B zr0Z<^#JQ+|Hve14hC;}rnV)A?6OLcI-n+0GBDvmVpZ5P%2NUPpo9Mqkd@hlz^vEr5 zgfsHpS7~P*SW?5&A@-~b$tADoKHF|CyXUEkf~mY@!(t$XCux5@NIL^e z80UrRhF{t27tBuYvA?t%n#?PlcjTg;=*=f^ZlKUpC|Rz$BaDQtB~iKV=u>H9DH)#u ztWj|h<=+<1nR@NkbeG%3VWV3B*@NEk1_RE=;>V(k<7SeLflD}zn+X5h(RJ4U)&S4r z5gY8Qls6H1RUQr(@-`77&VBC`qliZiv%JFXmdeOJ(5rS`tgjm1XuPD~>LKE-OLGqZ z(UniH5Zbw^pNNlV6kJ@Q(unSNen|!#Sy9Kax3qV{jnXE@$di-p>W(UWBwWjUdaEJx z^9SENC6QOqL!gvdW8!FQ9bcOZfKMb>*ylFu6mK1J+T(t|(c~7q4o6FNut&mgK5hGe z=rl$cF~z6P?rP z+i;eNj{r)Is~ebX3)b{6{K~4+5`9M9rNSn?5&iQwLDv0QJzJwXM|U1b$=$PQypZzEpAF8v%G4w_I~$4BMolbaGBD5#4_ z{-t@O?-do=l=DfGuMwtPeN`px-1OUq0ckh(DmN-?V8@S7S{SHIOwBL_%c9i8kk~+$|kA>;Mf$96OO^32i-8wkcDZ!FHd9uY60?z_D z84j$g-ifpBLXmhKo3}dLED279l#@{*U))XLoU7vRbppOMv3TBly2(PN$NH-^NO6}Nb zn(JTAb+_RLy$+RrzWHLIf(FKJJ;I^4$>IAt^`5|8hLNDmgJ`)XB?6(ZYa#BQeeeTJ z>0TF9m1?+@Tu)^5s85VDY7GFZm{X12Ab5LCYkdB6-Nojj!i9%Foa-^CLM4uAh&PEQ zGUSGAwZ3iV*eLDdURk<=n=E8Me&p|IFz9b5+0a=*tQ~phxT6@nxh@gV5;_cy7}~-O zRr^)2%e+mXA^k|4fv+*LAi`l3X$JrbDUfhPp#RnLjkjnjq75k52+(P-m zw*#>-R&T^6_lMTxQ|AqDlx=Oi*@DG{$s?>Do2KXQ!yOT>xf5NhRt`Iw_sdbcjAUEQ z0}%opuK%DlEfVYQ=Mt6wfrO%p0j+H*eK}Ek^4@sY@nePX%%)gfb(-P}-GH7? z5#ur%xBFp;wEM`$pB{eexkhKKBu%=V50jd*)%RCxf!cax!4XNC$N*EDIGyXu)L#*} zbxewB%+vzoLvwx`IPH4sZ2U_z!+IZ`a$d7C1>&+^17#YB*7}x7{jgCTSKwc-CaI5aMk1=ct2v7 zcH*~Q^snwd;q+wYw=8n=`N3|;0p-XYW01EW!>Z0-PzB=vIx*K+i)pV67#^}R5YsvX z*8b?dl2O`@yZ!Rw4dSQ&NBH+_+{pKH-}oQ((8_~#W<}DbV|!lE{26|Ip%By5w2G== zh^SQviAQ7x3W`fRImH$#8pnBxIrj(^CHY`6Y_TvYkK$MEZ`oT7O*;42H$CGpxkNGr zd^m@Y9*SP48e>mL>57p)FIrD%c>7DJ_(Ko<-ySnd2ZTLbpIg4`Y#)lFQJ}dg&6t4s zz4~x9GU5jOQHme3xcdhY7>r5&`#a@U%qLJuwbAHE%OGIK-0@YVH50PSMc3%t=AVyB zRirL@vlW`yPqCdyrrGDN_bHR`c%`i~8A{mx-4T_izu)-6&San;I#m?L)9s;6F|t7@ zD}=GP{XYSrI$p(-!cfHKCLA%fGWj;>6Bwbh-+60|M9OZk$DoieR^Cg}Q3uChq-a%; zRAjdUqiTpTMEe*-I|tjOh^_mg9DbwjBo2_r@wd_ctAFv{x z5kAyYt{BUu8*wY-jNu{l%CJ`e06DQqL_t)4-ZK%bC+Xo47r_|-iTufx%H9Q;!4t2s39{~DSqbaPP`-j zp(jr*-}ky(mw)X$U$-2`4>Ne4{-59Z`10TU+M~;TFFUb3jt^b&kL9RoPl~hHY+WOa zEG-(yp`70t<9Vqv%`Fd=T$H2qDzgH!q}cg+JKQ#!>ST=fof4mQ;bmSJX~!gSV{u8^ ztPe&T27f9HU?4HvOw_%=3|7rQ(cM?h)rnyUODBVH;L`I-bHPK0Q_&nUW2nH*Kq)j# z3+=?DxxpZa!G;{k-Ij(ybrS($%?3H*I!P_ba-(n#k1DK{>tX{ACX3)sd83ACB%pD~bvB#{HCv5{E-IO~+3~WA zx7jc+$ZL$kir%x3a=w;Ey^ihJxsTL4ASKwVOD_w-Rr`;E0$=Us+F@hZv+&)E@6&z| zpQ+-nGW`4xy>WT-{dekl2M>-XpE}tkbJwwA zJjsI%VCx=t#oIpPs?Hpq8{0X5mOX-tFn%X87HTr3zGEQVA@jJ77wL-0aow?v>;9B7 zki(jzqj&n@SjElY1hAs!nu2U^W(ZC0Wk@pC9nLuWBMc}Q!WPI_hquZ-W5hUZ!!&`J z@o0xKRQTx5Yp-O->)^nZ<3s!~;+M}ZKmDh^arw?~eigv@Tou1!iz~=a{NEo~{@QPR zc6lvstv-({N1SE%&(TU#Qfr8}7$rtY%?AGk^wGk$a-_3inlR>|x&LsSKrv+$TZ|HH zuSn-5@N?9x8$I){akkXavRP)`c8;~S!|Vs~Fn0Ev+hg_blDBx)*s!d4VW`;J&+Kt* z!|1Gx=(zW5JjRiiGGDFYn}M(4!SO7feLQz|`Kdqi#^sN_?ZII#|G}?5y!^ZG_~`QT z+fLv%?7aR2NE~|y=K!@5UCBQ7&EXn62a3~*p56yd$KsBY_ttuM*>#(~(lKa&C{YDTA3daU$4H8X4ECaizhoB2x?;*Rk~X zFxrEh&rbjX7X{J-$qA6vfvryjy{ zl4HxYxYc?BR}=ki)E+rv>$;~>-)0{%Qy1EYa;TQN7er3?uK9vVEv3ScK=q8qAM z;sEOw*IN%fM@J58Jw`lQIbZcz_Sol*8>-HW`C}%G$Br+t&Sl6(Xp4)fSv2dFFF2Vm zt{5Eo(^a=&XXoD=eBYzbFW-(g0{@FY@y6w?uj2<1!9_Y89KZCtpIE;8Z@&lf`Q?EV z@sciYtvE-Ox8_qQFs;9a-KP%)w&*#By{jB>#P(wjE`e}e&6FP3)_H`;eMwK!>B6F+ zHXHU@SO5=NCl?^KxQOUJGgR)5@964x%wZ#An91W|c=(KeLs28P=b%olas(#U<|Br;QhaTnzesWot{TS>`S6$VO4X@z%YXXa z_bxy5U9VqWdB=_T5F$QCg6AA0{rTT|WO+Le4m{s@@Z{CYV|>LbsHZhD0PmCTsva7m z>=G9SW2sp#pdv;N^Q^F!D@WFWlfWipx?OHPa9pcPiw46wa~VUgeLj0wH($kUPg1b) z{17=id*w2}`Eq1PDYeGNi$LkbU|7Y_8ambh_$osw?2dBY&|6GnrN8H(YzE5OyV@&M z$=P%v2ui^@D+6s&9p{M}AAGXOA5pj#kE1v^_-WgZ;g?4ie0=0P@WrRU@b(AwCg8Ql zkF|HnPvaKq@BibEEdT0HjOb5iP5lyueK_W_3`S!efKCve%S{(W|L74t=Xfo?WB%Fpid8^;TNei`Ybtd~ha6G>bZouFa(o**sF@BFw(wiFgGlzl?}I5h zynQ?t*Ht(x^7k`u!n?&+`M#j|Us`daz@dP{`~l|d@HXlkcJ$K_KF*&8<>NFwJUFgB zy8Lnc63O?y=eYPt z2QKuRG`Lww$ClrFDt%QR3V~96U1t4}l(xbT4X;WyHwAnP?)>uT3(Ifur5OFf8LeC# zOD5XzQ3Q>JFS5{HdUPFhnrn;CxFMFnL-<^e`*4oJN0T2s0pMlZ+i$#j`JVevF5h(D zEqKH4_T|A>zHGVuCjSy5!Q?%ntH%HNn;%>L)X#kcze;^(xgYOyya4wXajUicoC9J1 zR4kmox-EKBxC-Z_%g@PLFSf=GPkdkKv&G|9vWla>a|Tz}d!e|4R&_+w_`rtGaj zmccDPeNAsdkhl71cV2!M<2oD=Hyl5@+h|eQd`#q)8?NaI+Ke92 zpK$&sAAW548^8GQ@)PgHk1pJFe0l9HCzdba{K4C@_+B>iE)9s9tr8B-ay;g*d#U~hFoCd~Ul zmN4#^8DrmJeZ(Ko5o_6bQzuDFo{Y0jGvQk3kFR)V&Q zFi(x)*<#m1mw778wlO)t24OTtCfk#5e(EH5EvgixGfNWlw(3KldSdy=qfag;u0Dz@ zTOlqnA?_e7IEIt|;+LAE%4V##ZJEDpcosh%eFi_l^X&7dm&czzwS4S}=axqve}4Ig zc<_r&x`gAGNB9JsKkmjKSomaq8drZ13hC4fMrP3hUeC^)nST1JowgQB1&jO%tY`R& z+c$^v1@rd0*3)tzaNite#T%)9k`yMBnJ7AiwHe}x8dYN%+3w@(j#g%(V<`pMyhAk% zgi1qxF2c7uf~OvocG+fK!B#wi>^DC2*z!Yv?cK|A5B@q5?<>4eR56jG_n!9VhhF6t zpK;=_aT;6Pl;fb7iDI)Z9wqEW{b1xPS$ICeH$+~AgW@EA6%l6MN}U3RuTJp|#CZJz z4*c&W)O|xBRnYxWP`pj)C)#nRUoo@)@ErLnM$ivA&4n^comJkd^Wyu!6(n}}Qj4;A zCks2v$tCk^0;=piy4MHl66g3iU+q++0c;0DnR z;1~Ix2o~Nt_{SAuDr=R3U{z0sTmFs|#Wa;!j|Dhbv(4B3j^%3*vR z9UCKa;M2T)f*TaZW)Ez04Gk9GjBh$3t4yL6X2E06qKz(d`dBQFH;n~Hu}+q$s!eb^ zN~~Vx!ONo8;7GX%RjpzQwuxH>G-nF?VCI-vuN*FHqX&g0mTo?H2t13)dQsnZ!lwja z#Dzo8E%bgy;WnjGKpAwA$7;4yS4?8;cgU8{CtYJJhH+b*72~)Ab0m?mHQqTm+P;;O zelK{Ej?0hsJY2lm9*A%=3}u6k|8;sdBvN!ZbohBuGa`6_Ab%1Q&zIjECl{*{H*rKp zZJACs-U|5ZeJzGK{9`Z5t2ARiIEF>}iNkHiX*~4TS_j0XC}O`zf*M<8(#`rh1!urW zin@Y?31-bw_|vAHR&tqhZM$T_B**P@k8S+oGcGq>=FlckCfKV2e{7}5CkRCChZ*Z~ zV~kri^)4JEqLxbAa|G|0156j$NBd>P*u|9FD^`+A6p8oVB71%%wHKIvpk4ki)&e&SBV7(R3b(%g^H#k% zbgJlYL<*-QJ~g-+#`oHy6lSP4>cHviy&0GD2xFWMoLlwvSWFTCtSTl<2Y;%X6BSHO z@@s%4W+PN;l%ls_=A^?efLwhgC{_Z{%mQNMz^$gR^b1aR=HO8ALk{@NR(9Tp+5DkicSPOhB_Q z>hQ20HP1Np#~3UGbBO3rur{^1oY+1Sv=T*b@0>2T>vZ5%;YsQ>bu9<^+#M!g&=qfh1n@BohJBRbShb{b8?XJ*x$J>6`Xin$fg*T4= zgLAl&&g9t3m!orAy8JmVPapcQ;xJ)2dq{7_5bC8mE$A(a@a2gkY(Dy9LOWW-rS5hB zATHjhPUCiO>>Ck#Fa~R&`6alA~-~i zvdb7)-?|VhjL0HJYtL<(gl7)&vgRO6F9#XJE;$PrG znsEIF2{ai}>14{p+^I~(El~E!$myLHL5$r zvG2^0gZ6eDBzfbj6Iv3t{*5QE>M5W)>1|TrH$(wNX_#y*iZ*c+o372F#g`lcUXC2e z(dMJ%_$uy$RmXFXoUyjysC!;!IkBrj_&jr_Gp+)aXo^BYA2i{a;x|HFqenAJ-@unW zL{P_hq|tTC##Qo+7=^=E0E!K`tu-bi8eh{>*u>Je>H|pcTqYSXsSLIRPW3wc!g6GH zIW!In7m|aCYn@fLW3YYY`e3{LhvQTSO$RTvcFP{OBiEb_--I=0lPmEYTBv|M-oDYl z$ySVk);a^pNHJAN&Jov#>hsCE5H_*mXzY9e8U4rsL)ZejUYj~Ry{^tD$!;m&ZI?M1 z(&sDP;W>i4$BlYumzu-#8*HuoCeVJVIf8rNKA8HzAC4PpOKuLf*OtO&kHOSOn>CMt zwB~V+8c~&f_P8dG15>9Ts+v#E=Jyz3J=okHyJyHY+4eh{_#BJ9nSwE(sE=Rz}2;%{T*`q33Z9HK}Z-2~YIivS>aS z?Hrbf2>b3F3CX%@eZ8Kfmcco`vVHIk8Mcku~I+eqJxIE#BLqCMYKehFo}!J z)brRs@_1q+);^9Q2X{@a*VV9J(H6J~li(hscf^?<3&TPOk2nerZgSBcb6}Ak7N*PpJdUR+eF!z%tS+tm~whDXMw(!{2 zKuze~Fkj{D^*8V&M66>jcMkKJpUG{T3W0hdeazdV_kqt~)O0nC?J-)bh_yVUs&2Vo zQEGg6joGfMd&5t?K7ud!J9mkybJonnH$`EDRVa0Ik{}e}(%PUgnJw z=k>g+*w03)Z*0`4n1H%F)R>OiU)suBIjcOCSd#Q=qqeTEH`&-HNotNNmjs81HD8}2 zQ{D!!lsXdb>pfo*jx*Z#a6^txH#aLImL%n*h?)1 zON`@cqHYTo>6v`?1tOe$x=z2iG-tH?5%%Wi_DSft5i*f{keeEE%R&BC4uVS!mSyJ3 zOOeGf+OJ5CmJ$N~Uy&TyM*rcs+#H@nUU^gpS5)G^WSNp+m=kR!PY|KSz((NGl#4iV z=1o#zN&+z?PsEF)*JCd8z};|}LW6PD)?{Uo=Du}8NOP5g-D`xDx@Q^!ijbM7Xy@ynjMHUZ6~ubZ?VZ2b`SuzB!yNMl$eDlzln}`MmTDqK6rH0jZmd z<|4DuLM9HnOAe{YL%8$MPOhySFLfXBBwZD;DlDoRBMYZoeQB&F&PnMJ0kJsTx_K2_ z2%6Xg%}vkW2q1t|+n`{_`T|4Su&vBd;;O%xg`D+WIowm5D@G%j8+NX<=1Z7z?OJJv zoq(0YHF^|JDivq`m5p`6sSvCGsM|1CqGr z-OAzo9EThSaLqhbud=x-)sVx0GSa_mpP{cmNe639R*zJXh?G>j=ptSSVDNgj>a3hw zJk3ubB1(?P*W*+~t}=%R0!N1^goykJ4okZ)L9I9v{7!ns^ct$Q^V6!iX?bZdHfri> zw_DPv)8$xS#EiC>>uys@5rnPJ3w6CaKcunZIOgav_KssaK@_axiL7$fZEwBPSr+-} zWTnMUk$SaNxk7Ef{C)Jfa}MXlJL&#u|1cTQ8XXK&com7SPgPgQ;Wzo#L1G_A`)xBH zXA5t7w-SJq-254!i7Gf$HsGvl`t?KtQXV9gYr78Zbm%t92z>BI-YCL3M!uX=03&+c zYee@Pj2CbAK!4{1E{SX#w?T`}E`z;t01q{2%u)R<0(q)GYBDm4sD685JUB;!sSN+>yQDZGT5Hw=o{8_aK>gX3`5E2La`a znhwm-%O2P+YmR|Al&|JKc&gi6hEvflP?_x+GV3)7eSXkxxsJ^aBkk5b&e%Y7F6$RE z);yKpvbfOmpl5=?wt*S^Q;dBa+fq4lo{ejm6lQzlsc{>8JTkXpTRixaViTwIyK=b5 znxkUvFXL7%2j*~bHAnKzT!zl})@!XT`ACJI{h{+aeQtNHv)`i2J(~zwTRnvaz%`uS8U`f(M=?CU!bu! zFY34JE}iFk#zk)w%mQqO3!xZDzG4|E0@-PC5O|dz%rKc&Fd{W7D!j z=-_Vg4HrBeZ3*^twH&HHcRH+|M}|i9S6Lq{3fo10yE4uYK0CsWEom)^ zht}tSZD~U&E+^S@Ehn*faEG8>q15TjQ8s1?Awcw{Uv_LA9UR2SPKG2U7Z!2m+J;0) zja8tEp+}fEa}cAP96M@|X>K`O8%Hb}ST`TgH3#-3mbf{G(A*o7J2J$YzW$HVvBVrf z2CwD~qf&u9a_2}mxmWp#syQe}j2x65gHfCqX<`Gb9JDY`F3}_O_>UoDa%?yXnTOHL zxiiOQ?<4ziKQ4+jqKJH>Q01s7wO7u*njmbPp4TT{J zC)jS@0!DqEk-oUW%20zF)5;*vU>y{=p(~Fw%U?i6Y-u3$-V%U;67BW{FAQ*mEkQ#r z`WTr@*&fy0+z`y`?ImBv1yjr&WtxfK&H-lx5Gfk2C}47%Vba_+nx7U_RnFKMf`WaJ2PBd{AMdm@dwc3JM^^#Ib)aP@}AnW$UP* zF<*wtXj^hPAJkfuiWUS`IXXvEYk+EJ0F9R+M^9Jys_}wzE=;SOg6kH zC3M>t+av}#oMuyC;94E9QFbB9W<~h*%0+PWGQ>fl>#!UpJZMCcwWM=rZF}Z$eOu$j z^|5Q7`5YuWM(wfTtm_mM9bv;`Q|DG?RmJBbh2$A5<6$58T1<~+2&b>&aynt<`M7hz z5Vqv6I50$QSp)UJdmUMH(v8E9Ya}Rk)kl1fWnJuBR#UZutlFb*_Y+W0SJV~-jq?+{ z9j7<}`y4rKKj5>zAVdSH6DX>QPj)+v1tyQ}F@D17_-0HH(;H$6ZTpyyIOiaiIBsIw z(yuv8n=srCHHTxi_^J)^CHKM9ER&1*dJg_*1FKUTS!3ujrcdsW%~dLk6N~VzQE7!V zb#rh>32!*&xP(VRRL;)zM_L4ItMGtM=3bau7mh zLwb&8lMCk`j6)7qr09~vdvxb(sKyudiPd~pw2!DDXS(&lxjgWP;~chYY%>NxY@%3q z{H*WttZ}x~(Xv@)-FA+(w!`cP@i2Dwo7-dc?~=E8*4VJDcwwm6+RyB9Y{O{RM0B16 z%wwE&PFRy$u!Zp0?^t^y65h*@!;I48l2GogHe zrWm?zZ_=ZodAu|C$l2d(h)k|QoKSpKU|i&hS|T^mayU^_CD7H*>9uxrkak^p3@+ok zM`YAl)F4;R-YC0rRu*;nb%S+|^fN9mF5E}VLWy!);_RLM7o0#5<%k|vbC9XdUiciN zJTUPXkO%piEax6M+%xcjX5f&48$-^>UT`XUj~v2XKp&{7*An%xLsxZ72PW+jqAZ2z z3aD&qD`V+Ft2}a>Urdam{Nlx!SE(61(1d z;H7Jti^>ukQ+v&XN)I!crp-y5bgMm3QL*hfoFvw{4B3dt%h+a-R6DOSQDYA3VeNMB zXjyhrYsghZw6K0u$Pdp9^-(VWS)K*zj}uSqD%xtOCPc;f4s0xay01 zVKJ`N;2hPEvbm^+Tv)e=GOOc=ww#pHQ1}{lv_(L*g=}7GmbbdL&6pSq9}PvV`5ZIm z2*kJ^30658xZ*;-&>X~H<{yr0)urH)sCJoB*Al9sTf5Z#wz+lc^%2N8>y1$v=|IMr zOdLf4hOhz^mGd}bk6^yYIbswx#P*o&9O4$JGl^h+KHFHGqgFth<7-CS(yh?h?^ro2 zP;&3G;%1J_)67jk(?xa))oSIdtq*_H#Pw~C^RBW9g3-;-c-psixm`Sm**S?dhxr{> zeM~*+h7DuAa`sLFatQxW%RqXd;@KK=pjMU3)rbgO?PZorof4~`(M4}!6M|mrYMbRb z$Hcptqfj?-=CyxXOuPl(Z?Ot>h+9clpkmmeZ$=&6xT zLcxC(^wGbQo@KJUQsPwnZgq}3h~psN?hLy;BipEzn8`7yPzHT>m^{0%CG3L4%guK| z$^U=wfir+Bh(7<5dx&07%yvBeNq2Ed8IguZoh}TsJ_E{3QKFuCkyG{<=9049S z?-UWsH;?=}jq44Yxg*ay*0njx{Pjv56(T$T*h4(|ID#_+3L?90`34qVckL&xUO)Mx zX1~$Ll3|lEdh0!rH$Gl6_BHltK60au43F6JN3dN$&KpYphs-q=;xbZm%FlVxqH-t| zoC4{_GW23by?~?u&P6l>q2-W318qG=<%6s54^&DY+B%s-6x>BvzZ63mKts#HU2VX@ zW!e@ClVUV8m(YiJk}CJ>xQkaGcpoG-WNZZDVuCqWtWtJzU;`;4H-uUzoVC}bZAiBi zeB@zFz&Qa3qAf>AvPrcaw#XR?0-7~Jk&lG`UwhZGV@XmhYldb<2ni&_hR@`a?ibuO zpTLR@OIGZVSRf(szRb0Un}p7eSuc-@Wj_dE&Y@!F@$6=FF^FPcSA? zj`<|ib#Rdc{@HsZWpKU8sM{A&`NY^8GjyygtNwiZS8nl2uk^8^29s|*ke_`j4>9cp zSzSpd`*rEk2W4HKGjScH^f~&_-e`l>hpU!5zJlPGy>QMDADGwugvB~GIu=qwc;c15 zCjk^E#B(h6oo9r$e1g#^f^UTTx}%|SoZ1NOLEyY=qe-V>6EVvD|^m)c|5F zX41AVB{ns~z2$90*ET&E?z&UUO-_fDP%F$uJ^9o;W7(S)@?=Y`#h1{>!(SYi`nieo zIMI_XLg}`Nf0NaJ# zrMx=$r{*Pm09>v~w*jZ5hQ zPl&G!`ip4L3%2=>)N`sQKqr-Uk?x*gGoNYoJ0IA%$SPn`?+?!cJ9Q0U}l%H(B z%{^Ofobk@*ODh+lX56ImZp#K<7J9BRf9h?lt9aKjcx3&Vza{R6AD({o+dn-0&o6%c z^zDbQpZ*WnFMsp7r%c>3c%>%FFn*IlhUcIUY^V80Pm)-xXWTFAQONU7m@8#{7$ z_I^F|V9I4n-7DdD@!+e<#bdSiE*|gP$5%i3`TzQ@0}7ABn=*hGrYC={=bSQJzjU1U zMAjK+{=DeX4#qVf-vIdC-!c2sKk&v6MiPGT;pu1Je*N^9TF#uQpZOW*n%WsBk2sIJ zm?QW55D#*u#@+fk>`sS#9(S=|rziQrW-hVhoSey2()@NHzC89<0NBK-ZvoY$pKJYwUnsU%bgc0ne!Ut9wl1dYn|Dck_m%&rASx@Q z%K5%NHTiby*C-9IVtxaWQNmnf0#y!rYY;r-Ac5UD-Jc_%J--U_x$)EQfBoGzKmMlP zW_)`38<>9uuJ1Fu0ZQ_-A-v5heK_&65yE(DlF42HaGz`p3mo-MC-x33qqSk&51?Y< z#M-fF4<=AU{klG}s`z>gz6(1nW~S9bg+$>UV)&3lr4Uj;;m$sduR_rWI@>l zX@`YY1jAcBn91u=eQ?P`^%-;2@aOA;UFw2VEiQ_+_#e>0x=YqRd9z$*$ly>zOUHSh zO>izumy2`r#KBZ6UJ+f}0!p$5-h{T0nCAlOB+Ubkk8hLmp-$ajO~>RrenLns=}%?j zx?#xZq&D^>^>H;kid92b)H;-l<;BAQ1@(|cZ^%eweBizub;BV<*E}<+xY}2H#IJOFGg!;;;PvOaAeST)CCYT?BPg;fSyb?em*32} z_7Q=r2Y&S^j@s4G+7Nsfi|4#{)HX`#6DC#5g202A^r(RV=X_|+kBvAX!ik7nb6OsN zxmAAULx42WN#+fumtd#nGM0eCAe2Wq_|6L0U-+>NN7Ru}95F2x6 zR{}#x+B_KdbysO#dg~c^i$}QHmDvYH?H>>Ifdy-PlSk<&>CJs`-(i>wH0Jd|q08$c zGl?k-3F)rK=!>-mLC5L1@0+|XDig|R4BDX5k{^Up4s&%!4nC*M31>|#k~ml7O?~Cy zWKtGMsv;4`J+6f(zfaSeLX(D4?RIvx;JjFS$T?{SLftRUSb*h!faa1 zSc>Eh&-a^)FDy%y1^d^=brVi)q<*xR)grEH2YYbx{ zoJG?fdu*=4OU{h#^Q%vCKc7b&_sUXxDkSUi5!PZv^(}qWFOFLx{4yiscK4*eUjelc z%&LfdN#e*Gp3Rey!5$)mcI!di+S{_Fq7(I_4lwF0ZiSu;X^{k(*U>k~!glk>2AP zH|BT|XAT0c(LN<3j9UC7y-GDSJPH?A$pxGqDgdYOF}lwJ6gQ%2Zwlg}C_EO;DRDN! zaLa^S@pI_>%IkRYAk>@+zS^TSn9n15n)CD?9@N3nH9|A84(O~6X-=Tx9(%=f{|rJN zRvoW32OXPHz+)7rUY#qn=^b<}LGTT^f-~ogk(GGHWNLlX8SLaHN8^zrgTiKB&ksIv zLUY{oxj1qXZ_NM?xnSnz3U|}2#fBB}4!iaFOdi~fS<{>+uwnncK6rib5kM87tEE!` z_e1E6W}fkyaj)0>o?J6;k>YcBl$zL#2Rk)STsf7<%J=x{C3sP{7sOY23{tcV*~6IC zujeE?vR*Qb2i-Ray7NnEk@A)9zaH6Bj%%;DFVFtsxZdoUk9qKQ%LGd#3FkVzHHLYP z*UW3q9VazqyyMX8#LxAt$FaqTcE%OibtgVOPkhB3x#$A8%W;h>!dY@1%NddS3bfcq z_A5M?`>8!x)u;A&Z6B+;iuB>yPP0cL~eDE@6AVAOZ0zWGbxWn+CXTtac}%g-vD zP9dwfUenbt;puVHH!Ig$9PPm$m#d5ZoJSv!0e8*H;mL+3SKn<2va6!LgR4Ew5*ANC z;Zd`*q=dB!D=z1pRnh zM_3bby}RCytpcnX530r|;vQE9Jg^8W8H~T(gV{K0L)rtAtDdQE_bAoV1J&|c-}S*? zUTrs>2dVHRnUz=2k+MyrwLaNh;lzkoC)(lElT9$$Sf7+oTf@NOF=6IT*Z4BWyp`u1 zt4*G{{A#w2#~w@1d9EdT%VXy)?%X#yKIq^1E9m;xdes_jRx;zB&#v|yulAf({~ec@ z_2P5!AaJpKy+`z-Psd=KKR#aaIIqX*1MgzpRt>LN23KciXI}V|H#wQlSE#fUES%Hb zyf|<*=TQl3)f(N&SRO>JGcjh*9->@OPm-sKmht$LA(wN)vkpAW#sPrBlOJnM-I%j_jV}S84eupJx#J&KJ%U2MVH%d&^FOFy4a~jXZUNpMY_phow@Azre?fp4C zp6~L%(MLOg&q44ys+Urp?q5@R0sA77KaPbXdk<}LlgIQ;^Ofsi+x0{z`We|uV!Pie za>ko8@>;8m!*6_WJ73(FJ$8N>j9mV>ZXalAW2u>k`5gzYxxzf<81wDo7{7WjPa-8S zYWQRxxwq`Q`bZC{DJ6}bR4ei?dzGAUKfVwD4^yfQrLnrwT&Ngtf{U_M2TLz))>kbqtICs28hG;;Gy%TwZ9 zPp;;vEyS#g_#PfDIXu`?mU=@7q^xI+;vIowxwSzN##uMVez1rxL@9lmwKRA$>2w)@ zKo88h$^AX&0jsL)*iN^tJ)0FQ%&RG`u+nOGy$jCiIA}3++0$ucP0CAZ+@~02ud7OCG z(@z+HDW~{L9y6hYr|-oh=7THK2R_j{b>@1`-?I;DQG5N6jv}Yo_GPWeOnUBMK5tNs zMVy)wk50!qx!G{?w!FbnZVOm(gfBqf{Epn8F9KJZo@CQ^$(4< z_acNJXsv^kFH%x-UI?O+95UM@LFSDI;kCAh&&C<&u`ntcnHc-`5p?C8k<_$uRwlFa zAUf3+f1=LKIg#lRZ0aelK>DFqet@3LS%Y1oH$CE?OmgxFX3ocZJp3Fa1@&EMr#^Qa zi09bKwVUSMem^t5O-r14>5OwcTA!2XZsX9g+sb*cUP6aQ@vpaLD>781k zo_O~=Ht0^{ZWX*yY%-f3Qu?0Xnn86|h@tw;$Ed3RKk=u92KY~JX^N?D< z>QmnWv%mZ~W2SPNdo*n0&GRf4=Q4KsH z#9aAyO{}Q*O`_ftVEhGnDgs0O75^%tw#O?L%4%6Oe!fKBs7n;)b1&E!3+Dnks)sOh zc_xE@I4P|5K^Wy31=-)ms%}C!aBZqN=E{RGj=CxAVF#HbRG0+p+aB-Ghx+8dvBE!+ zw{LlT;BPl%q3V{E`ifSG;JPk$qb((cz2VRe>TvBRQA=s!&bUE_sbQnqFII&h{O)e{e>d;h1k2Q*!4zLVo#i%6aLi4tZ36 zx|u}6Y5k)%%7Op#$UaI)<*`2Md7)>Ny(lLSFhs{GJ%R7a#&4&DuQWgtlle}}Oim=R z9_>qdVxl}SR)p)gAWR0=H4$AHaYl3&4;-v?{VPk_oYR*__aU8vS{f7ZK1UyL&V8yP z(g)i_uOIM0v8lOsNK19oeTioUot?p4JdoCFMk7-(SrmuG6ig;-*nrjnt{O=ohcpCh zYJeCXzGNYlCh-NWJlz)v#0XQ;!o{>NF7FfExP&lUbLM70lIJ?C#TfaE^sT)e1VTD$n zd0#*utQIxZ2Zfm7N~bqX>dI@Q8CEkaUzfgG!_Y|!;!N-sTM8T8l0GWcNC8+S+6ADd_p(mJYOs*aXlvc@GYAn8lK3JlDtI4c& z&QotUSY6$5$R%&a?&eF&>XUQT7@K=&JA2oN*7OKQ=A0*=4tavz#m~HO9(kPntjXsi z`NZcD{M4Om^2wW6G=obAr^#Vnc$stLkvy-0tQBX;4Obq8PiA<@Ni2C;b3C!+2A2m; v#ODznu^CI=;!0sHi%&G%Fs2R@rpNySsX3drFe!7o00000NkvXXu0mjfY>-Q* diff --git a/ParseUI/ParseUIDemo/Resources/SimpleQueryCollectionStoryboard.storyboard b/ParseUI/ParseUIDemo/Resources/SimpleQueryCollectionStoryboard.storyboard deleted file mode 100644 index f2265e62a..000000000 --- a/ParseUI/ParseUIDemo/Resources/SimpleQueryCollectionStoryboard.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseUI/ParseUIDemo/Resources/SimpleQueryTableStoryboard.storyboard b/ParseUI/ParseUIDemo/Resources/SimpleQueryTableStoryboard.storyboard deleted file mode 100644 index 0cbb66c5d..000000000 --- a/ParseUI/ParseUIDemo/Resources/SimpleQueryTableStoryboard.storyboard +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseUI/ParseUIDemo/Swift/AppDelegate.swift b/ParseUI/ParseUIDemo/Swift/AppDelegate.swift deleted file mode 100644 index 4d951a50c..000000000 --- a/ParseUI/ParseUIDemo/Swift/AppDelegate.swift +++ /dev/null @@ -1,103 +0,0 @@ -/* -* Copyright (c) 2015, Parse, LLC. All rights reserved. -* -* You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -* copy, modify, and distribute this software in source code or binary form for use -* in connection with the web services and APIs provided by Parse. -* -* As with any software that integrates with the Parse platform, your use of -* this software is subject to the Parse Terms of Service -* [https://www.parse.com/about/terms]. This copyright notice shall be -* included in all copies or substantial portions of the software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -* -*/ - -import UIKit -import ParseCore - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - // MARK: UIApplicationDelegate - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { - Parse.setApplicationId("UdNpOP2XFoEiXLZEBDl6xONmCMH8VjETmnEsl0xJ", clientKey: "wNJFho0fQaQFQ2Fe1x9b67lVBakJiAtFj1Uz30A9") - window = UIWindow(frame: UIScreen.main.bounds) - window?.rootViewController = UINavigationController(rootViewController: UIDemoViewController()) - window?.makeKeyAndVisible() - - DispatchQueue.global(qos: .default).async() { - self.setupTestData() - } - - return true - } - - // MARK: Test Data - - private func setupTestData() { - let todoTitles = [ - "Build Parse", - "Make everything awesome", - "Go out for the longest run", - "Do more stuff", - "Conquer the world", - "Build a house", - "Grow a tree", - "Be awesome", - "Setup an app", - "Do stuff", - "Buy groceries", - "Wash clothes" - ]; - - var objects: [PFObject] = Array() - - do { - let todos = try PFQuery(className: "Todo").findObjects() - if todos.count == 0 { - for (index, title) in todoTitles.enumerated() { - let todo = PFObject(className: "Todo") - todo["title"] = title - todo["priority"] = index % 3 - objects.append(todo) - } - } - } catch {} - - let appNames = [ "Anypic", "Anywall", "f8" ] - do { - let apps = try PFQuery(className: "App").findObjects() - if apps.count == 0 { - for (index, appName) in appNames.enumerated() { - let bundle = Bundle.main - if let fileURL = bundle.url(forResource: String(index), withExtension: "png") { - if let data = try? Data(contentsOf: fileURL) { - let file = PFFileObject(name: fileURL.lastPathComponent, data: data) - let object = PFObject(className: "App") - object["icon"] = file - object["name"] = appName - objects.append(object) - } - } - } - } - } catch {} - - if objects.count != 0 { - do { - try PFObject.saveAll(objects) - } catch {} - } - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/LogInViewController/CustomLogInViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/LogInViewController/CustomLogInViewController.swift deleted file mode 100644 index 59ba336be..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/LogInViewController/CustomLogInViewController.swift +++ /dev/null @@ -1,41 +0,0 @@ -/* -* Copyright (c) 2015, Parse, LLC. All rights reserved. -* -* You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -* copy, modify, and distribute this software in source code or binary form for use -* in connection with the web services and APIs provided by Parse. -* -* As with any software that integrates with the Parse platform, your use of -* this software is subject to the Parse Terms of Service -* [https://www.parse.com/about/terms]. This copyright notice shall be -* included in all copies or substantial portions of the software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -* -*/ - -import UIKit - -import ParseCore -import ParseUI - -class CustomLogInViewController: PFLogInViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - view.backgroundColor = .blue - - let label = UILabel() - label.textColor = .white - label.text = "All Custom!" - label.sizeToFit() - logInView?.logo = label - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift deleted file mode 100644 index bb6c6795d..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift +++ /dev/null @@ -1,42 +0,0 @@ -/* -* Copyright (c) 2015, Parse, LLC. All rights reserved. -* -* You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -* copy, modify, and distribute this software in source code or binary form for use -* in connection with the web services and APIs provided by Parse. -* -* As with any software that integrates with the Parse platform, your use of -* this software is subject to the Parse Terms of Service -* [https://www.parse.com/about/terms]. This copyright notice shall be -* included in all copies or substantial portions of the software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -* -*/ - -import UIKit - -import ParseCore -import ParseUI - -class CustomProductTableViewController: PFProductTableViewController { - - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - let product = objects?[indexPath.row] - if let identifier = product?["productIdentifier"] as? String, - identifier == "Cooper" { - PFPurchase.buyProduct(identifier) { error in - if error == nil { - UIAlertView(title: "Success!", message: "Yes!", delegate: nil, cancelButtonTitle: "OK").show() - } - } - } - super.tableView(tableView, didSelectRowAt: indexPath) - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift deleted file mode 100644 index d93fe60cf..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift +++ /dev/null @@ -1,140 +0,0 @@ -// -// DeletionCollectionViewController.swift -// ParseUIDemo -// -// Created by Richard Ross III on 5/14/15. -// Copyright (c) 2015 Parse Inc. All rights reserved. -// - -import UIKit - -import ParseCore -import ParseUI - -import BoltsSwift - -class DeletionCollectionViewController: PFQueryCollectionViewController, UIAlertViewDelegate { - convenience init(className: String?) { - let layout = UICollectionViewFlowLayout() - layout.sectionInset = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0) - layout.minimumInteritemSpacing = 5.0 - - self.init(collectionViewLayout: layout, className: className) - - title = "Deletion Collection" - if #available(iOS 10.0, *) { - pullToRefreshEnabled = true - } else { - // Fallback on earlier versions - } - objectsPerPage = 10 - paginationEnabled = true - - collectionView?.allowsMultipleSelection = true - - navigationItem.rightBarButtonItems = [ - editButtonItem, - UIBarButtonItem(barButtonSystemItem: .add, target: self, action:#selector(addTodo)) - ] - } - - override func viewWillLayoutSubviews() { - super.viewWillLayoutSubviews() - - if let layout = collectionViewLayout as? UICollectionViewFlowLayout { - let bounds = view.bounds.inset(by: layout.sectionInset) - let sideLength = min(bounds.width, bounds.height) / 2.0 - layout.minimumInteritemSpacing - layout.itemSize = CGSize(width: sideLength, height: sideLength) - } - } - - override func setEditing(_ editing: Bool, animated: Bool) { - super.setEditing(editing, animated: animated) - - if (editing) { - navigationItem.leftBarButtonItem = UIBarButtonItem( - barButtonSystemItem: .trash, - target: self, - action: #selector(deleteSelectedItems) - ) - } else { - navigationItem.leftBarButtonItem = navigationItem.backBarButtonItem - } - } - - @objc - func addTodo() { - if #available(iOS 8.0, *) { - let alertDialog = UIAlertController(title: "Add Todo", message: nil, preferredStyle: .alert) - - var titleTextField : UITextField? = nil - alertDialog.addTextField(configurationHandler: { - titleTextField = $0 - }) - - alertDialog.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) - alertDialog.addAction(UIAlertAction(title: "Save", style: .default) { action in - if let title = titleTextField?.text { - let object = PFObject(className: self.parseClassName!, dictionary: [ "title": title ]) - object.saveEventually().continueOnSuccessWith { _ -> AnyObject in - return self.loadObjects() - } - } - }) - - present(alertDialog, animated: true, completion: nil) - } else { - let alertView = UIAlertView( - title: "Add Todo", - message: "", - delegate: self, - cancelButtonTitle: "Cancel", - otherButtonTitles: "Save" - ) - - alertView.alertViewStyle = .plainTextInput - alertView.textField(at: 0)?.placeholder = "Name" - - alertView.show() - } - } - - @objc - func deleteSelectedItems() { - guard let paths = collectionView?.indexPathsForSelectedItems else { return } - removeObjects(at: paths) - } - - // MARK - UICollectionViewDataSource - - override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath, object: PFObject?) -> PFCollectionViewCell? { - let cell = super.collectionView(collectionView, cellForItemAt: indexPath, object: object) - cell?.textLabel.textAlignment = .center - cell?.textLabel.text = object?["title"] as? String - - cell?.contentView.layer.borderWidth = 1.0 - cell?.contentView.layer.borderColor = UIColor.lightGray.cgColor - - return cell - } - - // MARK - UIAlertViewDelegate - - @objc - func alertView(_ alertView: UIAlertView, didDismissWithButtonIndex buttonIndex: Int) { - if (buttonIndex == alertView.cancelButtonIndex) { - return - } - - if let title = alertView.textField(at: 0)?.text { - let object = PFObject( - className: self.parseClassName!, - dictionary: [ "title": title ] - ) - - object.saveEventually().continueOnSuccessWith { _ -> AnyObject in - return self.loadObjects() - } - } - } -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.swift deleted file mode 100644 index caef91883..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.swift +++ /dev/null @@ -1,89 +0,0 @@ -/* -* Copyright (c) 2015, Parse, LLC. All rights reserved. -* -* You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -* copy, modify, and distribute this software in source code or binary form for use -* in connection with the web services and APIs provided by Parse. -* -* As with any software that integrates with the Parse platform, your use of -* this software is subject to the Parse Terms of Service -* [https://www.parse.com/about/terms]. This copyright notice shall be -* included in all copies or substantial portions of the software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -* -*/ - -import UIKit - -import ParseCore -import ParseUI - -class PaginatedCollectionViewController: PFQueryCollectionViewController { - - // MARK: Init - - convenience init(className: String?) { - let layout = UICollectionViewFlowLayout() - layout.sectionInset = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0) - layout.minimumInteritemSpacing = 5.0 - self.init(collectionViewLayout: layout, className: className) - - title = "Paginated Collection" - if #available(iOS 10.0, *) { - pullToRefreshEnabled = true - } else { - // Fallback on earlier versions - } - objectsPerPage = 10 - paginationEnabled = true - } - - // MARK: UIViewController - - override func viewWillLayoutSubviews() { - super.viewWillLayoutSubviews() - - if let layout = collectionViewLayout as? UICollectionViewFlowLayout { - let bounds = view.bounds.inset(by: layout.sectionInset) - let sideLength = min(bounds.width, bounds.height) / 2.0 - layout.minimumInteritemSpacing - layout.itemSize = CGSize(width: sideLength, height: sideLength) - } - } - - // MARK: Data - - override func queryForCollection() -> PFQuery { - return super.queryForCollection().order(byAscending: "priority") - } - - // MARK: CollectionView - - override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath, object: PFObject?) -> PFCollectionViewCell? { - let cell = super.collectionView(collectionView, cellForItemAt: indexPath, object: object) - cell?.textLabel.textAlignment = .center - - if let title = object?["title"] as? String { - let attributedTitle = NSMutableAttributedString(string: title) - if let priority = object?["priority"] as? Int { - let attributes = [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 13.0), NSAttributedString.Key.foregroundColor : UIColor.gray] - let string = NSAttributedString(string: "\nPriority: \(priority)", attributes: attributes) - attributedTitle.append(string) - } - cell?.textLabel.attributedText = attributedTitle - } else { - cell?.textLabel.attributedText = NSAttributedString() - } - - cell?.contentView.layer.borderWidth = 1.0 - cell?.contentView.layer.borderColor = UIColor.lightGray.cgColor - - return cell - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift deleted file mode 100644 index 9e32e52c4..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift +++ /dev/null @@ -1,159 +0,0 @@ -/* -* Copyright (c) 2015, Parse, LLC. All rights reserved. -* -* You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -* copy, modify, and distribute this software in source code or binary form for use -* in connection with the web services and APIs provided by Parse. -* -* As with any software that integrates with the Parse platform, your use of -* this software is subject to the Parse Terms of Service -* [https://www.parse.com/about/terms]. This copyright notice shall be -* included in all copies or substantial portions of the software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -* -*/ - -import UIKit - -import ParseCore -import ParseUI - -class SimpleCollectionReusableView : UICollectionReusableView { - let label: UILabel = UILabel(frame: .zero) - - override init(frame: CGRect) { - super.init(frame: frame) - - label.textAlignment = .center - addSubview(label) - } - - required init?(coder decoder: NSCoder) { - super.init(coder: decoder) - - label.textAlignment = .center - addSubview(label) - } - - override func layoutSubviews() { - super.layoutSubviews() - - label.frame = bounds - } -} - -class SectionedCollectionViewController: PFQueryCollectionViewController { - - var sections: [Int: [PFObject]] = Dictionary() - var sectionKeys: [Int] = Array() - - // MARK: Init - - convenience init(className: String?) { - let layout = UICollectionViewFlowLayout() - layout.sectionInset = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0) - layout.minimumInteritemSpacing = 5.0 - self.init(collectionViewLayout: layout, className: className) - - title = "Sectioned Collection" - if #available(iOS 10.0, *) { - pullToRefreshEnabled = true - } else { - // Fallback on earlier versions - } - } - - // MARK: UIViewController - - override func viewDidLoad() { - super.viewDidLoad() - - collectionView?.register(SimpleCollectionReusableView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "header") - } - - override func viewWillLayoutSubviews() { - super.viewWillLayoutSubviews() - - if let layout = collectionViewLayout as? UICollectionViewFlowLayout { - let bounds = view.bounds.inset(by: layout.sectionInset) - let sideLength = min(bounds.width, bounds.height) / 2.0 - layout.minimumInteritemSpacing - layout.itemSize = CGSize(width: sideLength, height: sideLength) - } - } - - // MARK: Data - - override func objectsDidLoad(_ error: Error?) { - super.objectsDidLoad(error) - - sections.removeAll(keepingCapacity: false) - for object in objects { - let priority = (object["priority"] as? Int) ?? 0 - var array = sections[priority] ?? Array() - array.append(object) - sections[priority] = array - } - sectionKeys = sections.keys.sorted(by: <) - - collectionView?.reloadData() - } - - override func object(at indexPath: IndexPath?) -> PFObject? { - if let indexPath = indexPath { - let array = sections[sectionKeys[indexPath.section]] - return array?[indexPath.row] - } - return nil - } - -} - -extension SectionedCollectionViewController { - - - override func numberOfSections(in collectionView: UICollectionView) -> Int { - return sections.count - } - - override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - let array = sections[sectionKeys[section]] - return array?.count ?? 0 - } - - override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath, object: PFObject?) -> PFCollectionViewCell? { - let cell = super.collectionView(collectionView, cellForItemAt: indexPath, object: object) - - cell?.textLabel.textAlignment = .center - cell?.textLabel.text = object?["title"] as? String - - cell?.contentView.layer.borderWidth = 1.0 - cell?.contentView.layer.borderColor = UIColor.lightGray.cgColor - - return cell - } - - override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { - if kind == UICollectionView.elementKindSectionHeader, - let view = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "header", for: indexPath) as? SimpleCollectionReusableView { - view.label.text = "Priority \(sectionKeys[indexPath.section])" - return view - } - return super.collectionView(collectionView, viewForSupplementaryElementOfKind: kind, at: indexPath) - } - - override func collectionView(_ collectionView: UICollectionView, - layout collectionViewLayout: UICollectionViewLayout, - referenceSizeForHeaderInSection section: Int) -> CGSize { - if sections.count > 0 { - return CGSize(width: collectionView.bounds.width, height: 40.0) - } - return .zero - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.swift deleted file mode 100644 index 472e0e4c6..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.swift +++ /dev/null @@ -1,88 +0,0 @@ -/* -* Copyright (c) 2015, Parse, LLC. All rights reserved. -* -* You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -* copy, modify, and distribute this software in source code or binary form for use -* in connection with the web services and APIs provided by Parse. -* -* As with any software that integrates with the Parse platform, your use of -* this software is subject to the Parse Terms of Service -* [https://www.parse.com/about/terms]. This copyright notice shall be -* included in all copies or substantial portions of the software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -* -*/ - -import UIKit - -import ParseCore -import ParseUI - -class SimpleCollectionViewController: PFQueryCollectionViewController { - - // MARK: Init - - convenience init(className: String?) { - let layout = UICollectionViewFlowLayout() - layout.sectionInset = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0) - layout.minimumInteritemSpacing = 5.0 - self.init(collectionViewLayout: layout, className: className) - - title = "Simple Collection" - if #available(iOS 10.0, *) { - pullToRefreshEnabled = true - } else { - // Fallback on earlier versions - } - paginationEnabled = false - } - - // MARK: UIViewController - - override func viewWillLayoutSubviews() { - super.viewWillLayoutSubviews() - - if let layout = collectionViewLayout as? UICollectionViewFlowLayout { - let bounds = view.bounds.inset(by: layout.sectionInset) - let sideLength = min(bounds.width, bounds.height) / 2.0 - layout.minimumInteritemSpacing - layout.itemSize = CGSize(width: sideLength, height: sideLength) - } - } - - // MARK: Data - - override func queryForCollection() -> PFQuery { - return super.queryForCollection().order(byAscending: "priority") - } - - // MARK: CollectionView - - override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath, object: PFObject?) -> PFCollectionViewCell? { - let cell = super.collectionView(collectionView, cellForItemAt: indexPath, object: object) - cell?.textLabel.textAlignment = .center - - if let title = object?["title"] as? String { - let attributedTitle = NSMutableAttributedString(string: title) - if let priority = object?["priority"] as? Int { - let attributes = [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 13.0), NSAttributedString.Key.foregroundColor : UIColor.gray] - let string = NSAttributedString(string: "\nPriority: \(priority)", attributes: attributes) - attributedTitle.append(string) - } - cell?.textLabel.attributedText = attributedTitle - } else { - cell?.textLabel.attributedText = NSAttributedString() - } - - cell?.contentView.layer.borderWidth = 1.0 - cell?.contentView.layer.borderColor = UIColor.lightGray.cgColor - - return cell - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.swift deleted file mode 100644 index 520551d8e..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.swift +++ /dev/null @@ -1,79 +0,0 @@ -/* -* Copyright (c) 2015, Parse, LLC. All rights reserved. -* -* You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -* copy, modify, and distribute this software in source code or binary form for use -* in connection with the web services and APIs provided by Parse. -* -* As with any software that integrates with the Parse platform, your use of -* this software is subject to the Parse Terms of Service -* [https://www.parse.com/about/terms]. This copyright notice shall be -* included in all copies or substantial portions of the software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -* -*/ - -import UIKit - -import ParseCore -import ParseUI - -class StoryboardCollectionViewController: PFQueryCollectionViewController { - - // MARK: UIViewController - - override func viewDidLoad() { - super.viewDidLoad() - - if let layout = collectionViewLayout as? UICollectionViewFlowLayout { - layout.sectionInset = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0) - layout.minimumInteritemSpacing = 5.0 - } - } - - override func viewWillLayoutSubviews() { - super.viewWillLayoutSubviews() - - if let layout = collectionViewLayout as? UICollectionViewFlowLayout { - let bounds = view.bounds.inset(by: layout.sectionInset) - let sideLength = min(bounds.width, bounds.height) / 2.0 - layout.minimumInteritemSpacing - layout.itemSize = CGSize(width: sideLength, height: sideLength) - } - } - - // MARK: Data - - override func queryForCollection() -> PFQuery { - return super.queryForCollection().order(byAscending: "priority") - } - - // MARK: CollectionView - - override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath, object: PFObject?) -> PFCollectionViewCell? { - let cell = super.collectionView(collectionView, cellForItemAt: indexPath, object: object) - cell?.textLabel.textAlignment = .center - - if let title = object?["title"] as? String { - let attributedTitle = NSMutableAttributedString(string: title) - if let priority = object?["priority"] as? Int { - let attributes = [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 13.0), NSAttributedString.Key.foregroundColor : UIColor.gray] - let string = NSAttributedString(string: "\nPriority: \(priority)", attributes: attributes) - attributedTitle.append(string) - } - cell?.textLabel.attributedText = attributedTitle - } else { - cell?.textLabel.attributedText = NSAttributedString() - } - - cell?.contentView.layer.borderWidth = 1.0 - cell?.contentView.layer.borderColor = UIColor.lightGray.cgColor - - return cell - } -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.swift deleted file mode 100644 index e934bd39d..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.swift +++ /dev/null @@ -1,78 +0,0 @@ -/* -* Copyright (c) 2015, Parse, LLC. All rights reserved. -* -* You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -* copy, modify, and distribute this software in source code or binary form for use -* in connection with the web services and APIs provided by Parse. -* -* As with any software that integrates with the Parse platform, your use of -* this software is subject to the Parse Terms of Service -* [https://www.parse.com/about/terms]. This copyright notice shall be -* included in all copies or substantial portions of the software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -* -*/ - -import UIKit - -import ParseCore -import ParseUI - -class SubtitleImageCollectionViewController: PFQueryCollectionViewController { - - // MARK: Init - - convenience init(className: String?) { - let layout = UICollectionViewFlowLayout() - layout.sectionInset = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0) - layout.minimumInteritemSpacing = 5.0 - self.init(collectionViewLayout: layout, className: className) - - title = "Image Collection" - if #available(iOS 10.0, *) { - pullToRefreshEnabled = true - } else { - // Fallback on earlier versions - } - paginationEnabled = false - } - - // MARK: UIViewController - - override func viewWillLayoutSubviews() { - super.viewWillLayoutSubviews() - - if let layout = collectionViewLayout as? UICollectionViewFlowLayout { - let bounds = view.bounds.inset(by: layout.sectionInset) - let sideLength = min(bounds.width, bounds.height) / 2.0 - layout.minimumInteritemSpacing - layout.itemSize = CGSize(width: sideLength, height: sideLength) - } - } - - // MARK: CollectionView - - override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath, object: PFObject?) -> PFCollectionViewCell? { - let cell = super.collectionView(collectionView, cellForItemAt: indexPath, object: object) - - cell?.textLabel.textAlignment = .center - cell?.textLabel.text = object?["name"] as? String - - cell?.imageView.file = object?["icon"] as? PFFileObject - if cell?.imageView.image == nil { - cell?.imageView.image = UIImage(named: "Icon.png") - cell?.imageView.loadInBackground() - } - - cell?.contentView.layer.borderWidth = 1.0 - cell?.contentView.layer.borderColor = UIColor.lightGray.cgColor - - return cell - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift deleted file mode 100644 index 34d2d1c1f..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift +++ /dev/null @@ -1,118 +0,0 @@ -// -// DeletionTableViewController.swift -// ParseUIDemo -// -// Created by Richard Ross III on 5/13/15. -// Copyright (c) 2015 Parse Inc. All rights reserved. -// - -import UIKit - -import ParseCore -import ParseUI - -import BoltsSwift - -class DeletionTableViewController: PFQueryTableViewController, UIAlertViewDelegate { - - // MARK: Init - - convenience init(className: String?) { - self.init(style: .plain, className: className) - - title = "Deletion Table" - pullToRefreshEnabled = true - } - - override func viewDidLoad() { - super.viewDidLoad() - - tableView.allowsMultipleSelectionDuringEditing = true - - navigationItem.rightBarButtonItems = [ - editButtonItem, - UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTodo)) - ] - } - - override func setEditing(_ editing: Bool, animated: Bool) { - super.setEditing(editing, animated: animated) - - if (editing) { - navigationItem.leftBarButtonItem = UIBarButtonItem( - barButtonSystemItem: .trash, - target: self, - action: #selector(deleteSelectedItems) - ) - } else { - navigationItem.leftBarButtonItem = navigationItem.backBarButtonItem - } - } - - override func tableView(_ tableView: UITableView, - commit editingStyle: UITableViewCell.EditingStyle, - forRowAt indexPath: IndexPath) { - if (editingStyle == .delete) { - removeObject(at: indexPath) - } - } - - @objc - func addTodo() { - - if #available(iOS 8.0, *) { - let alertDialog = UIAlertController(title: "Add Todo", message: nil, preferredStyle: .alert) - - var titleTextField : UITextField! = nil - alertDialog.addTextField(configurationHandler: { - titleTextField = $0 - }) - - alertDialog.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) - alertDialog.addAction(UIAlertAction(title: "Save", style: .default) { _ in - if let title = titleTextField.text { - let object = PFObject(className: self.parseClassName!, dictionary: [ "title": title ]) - object.saveInBackground().continueOnSuccessWith { _ -> AnyObject in - return self.loadObjects() - } - } - }) - - present(alertDialog, animated: true, completion: nil) - } else { - let alertView = UIAlertView( - title: "Add Todo", - message: "", - delegate: self, - cancelButtonTitle: "Cancel", - otherButtonTitles: "Save" - ) - - alertView.alertViewStyle = .plainTextInput - alertView.textField(at: 0)?.placeholder = "Name" - - alertView.show() - } - } - - @objc - func deleteSelectedItems() { - removeObjects(at: tableView.indexPathsForSelectedRows) - } - - // MARK - UIAlertViewDelegate - - @objc - func alertView(_ alertView: UIAlertView, didDismissWithButtonIndex buttonIndex: Int) { - if (buttonIndex == alertView.cancelButtonIndex) { - return - } - - if let title = alertView.textField(at: 0)?.text { - let object = PFObject(className: self.parseClassName!, dictionary: [ "title": title ]) - object.saveEventually().continueOnSuccessWith { _ -> AnyObject in - return self.loadObjects() - } - } - } -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.swift deleted file mode 100644 index f1596353e..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.swift +++ /dev/null @@ -1,69 +0,0 @@ -/* -* Copyright (c) 2015, Parse, LLC. All rights reserved. -* -* You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -* copy, modify, and distribute this software in source code or binary form for use -* in connection with the web services and APIs provided by Parse. -* -* As with any software that integrates with the Parse platform, your use of -* this software is subject to the Parse Terms of Service -* [https://www.parse.com/about/terms]. This copyright notice shall be -* included in all copies or substantial portions of the software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -* -*/ - -import UIKit - -import ParseCore -import ParseUI - -class PaginatedTableViewController: PFQueryTableViewController { - - // MARK: Init - - convenience init(className: String?) { - self.init(style: .plain, className: className) - - title = "Paginated Table" - pullToRefreshEnabled = true - objectsPerPage = 10 - paginationEnabled = true - } - - // MARK: Data - - override func queryForTable() -> PFQuery { - return super.queryForTable().order(byAscending: "priority") - } - - // MARK: TableView - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath, object: PFObject?) -> PFTableViewCell? { - let cellIdentifier = "cell" - - var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? PFTableViewCell - if cell == nil { - cell = PFTableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier) - } - - cell?.textLabel?.text = object?["title"] as? String - - var subtitle: String - if let priority = object?["priority"] as? Int { - subtitle = "Priority: \(priority)" - } else { - subtitle = "No Priority" - } - cell?.detailTextLabel?.text = subtitle - - return cell - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift deleted file mode 100644 index c7edab07f..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift +++ /dev/null @@ -1,97 +0,0 @@ -/* -* Copyright (c) 2015, Parse, LLC. All rights reserved. -* -* You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -* copy, modify, and distribute this software in source code or binary form for use -* in connection with the web services and APIs provided by Parse. -* -* As with any software that integrates with the Parse platform, your use of -* this software is subject to the Parse Terms of Service -* [https://www.parse.com/about/terms]. This copyright notice shall be -* included in all copies or substantial portions of the software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -* -*/ - -import UIKit - -import ParseCore -import ParseUI - -class SectionedTableViewController: PFQueryTableViewController { - - var sections: [Int: [PFObject]] = Dictionary() - var sectionKeys: [Int] = Array() - - // MARK: Init - - convenience init(className: String?) { - self.init(style: .plain, className: className) - - title = "Sectioned Table" - pullToRefreshEnabled = true - } - - // MARK: Data - - override func objectsDidLoad(_ error: Error?) { - super.objectsDidLoad(error) - - sections.removeAll(keepingCapacity: false) - if let objects = objects { - for object in objects { - let priority = (object["priority"] as? Int) ?? 0 - var array = sections[priority] ?? Array() - array.append(object) - sections[priority] = array - } - } - sectionKeys = sections.keys.sorted(by: <) - - tableView.reloadData() - } - - override func object(at indexPath: IndexPath?) -> PFObject? { - if let indexPath = indexPath { - let array = sections[sectionKeys[indexPath.section]] - return array?[indexPath.row] - } - return nil - } -} - -extension SectionedTableViewController { - - override func numberOfSections(in tableView: UITableView) -> Int { - return sections.count - } - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - let array = sections[sectionKeys[section]] - return array?.count ?? 0 - } - - override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { - return "Priority \(sectionKeys[section])" - } - - override func tableView(_ tableView: UITableView, cellForRowAt: IndexPath, object: PFObject?) -> PFTableViewCell? { - let cellIdentifier = "cell" - - var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? PFTableViewCell - if cell == nil { - cell = PFTableViewCell(style: .default, reuseIdentifier: cellIdentifier) - } - - cell?.textLabel?.text = object?["title"] as? String - - return cell - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SimpleTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SimpleTableViewController.swift deleted file mode 100644 index ac948c151..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SimpleTableViewController.swift +++ /dev/null @@ -1,68 +0,0 @@ -/* -* Copyright (c) 2015, Parse, LLC. All rights reserved. -* -* You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -* copy, modify, and distribute this software in source code or binary form for use -* in connection with the web services and APIs provided by Parse. -* -* As with any software that integrates with the Parse platform, your use of -* this software is subject to the Parse Terms of Service -* [https://www.parse.com/about/terms]. This copyright notice shall be -* included in all copies or substantial portions of the software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -* -*/ - -import UIKit - -import ParseCore -import ParseUI - -class SimpleTableViewController: PFQueryTableViewController { - - // MARK: Init - - convenience init(className: String?) { - self.init(style: .plain, className: className) - - title = "Simple Table" - pullToRefreshEnabled = true - paginationEnabled = false - } - - // MARK: Data - - override func queryForTable() -> PFQuery { - return super.queryForTable().order(byAscending: "priority") - } - - // MARK: TableView - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath, object: PFObject?) -> PFTableViewCell? { - let cellIdentifier = "cell" - - var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? PFTableViewCell - if cell == nil { - cell = PFTableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier) - } - - cell?.textLabel?.text = object?["title"] as? String - - var subtitle: String - if let priority = object?["priority"] as? Int { - subtitle = "Priority: \(priority)" - } else { - subtitle = "No Priority" - } - cell?.detailTextLabel?.text = subtitle - - return cell - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.swift deleted file mode 100644 index 8a8ca41b4..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.swift +++ /dev/null @@ -1,63 +0,0 @@ -/* -* Copyright (c) 2015, Parse, LLC. All rights reserved. -* -* You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -* copy, modify, and distribute this software in source code or binary form for use -* in connection with the web services and APIs provided by Parse. -* -* As with any software that integrates with the Parse platform, your use of -* this software is subject to the Parse Terms of Service -* [https://www.parse.com/about/terms]. This copyright notice shall be -* included in all copies or substantial portions of the software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -* -*/ - -import UIKit - -import ParseCore -import ParseUI - -class StoryboardTableViewController: PFQueryTableViewController { - - // MARK: Data - - override func queryForTable() -> PFQuery { - return super.queryForTable().order(byAscending: "priority") - } - - // MARK: TableView - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath, object: PFObject?) -> PFTableViewCell? { - let cellIdentifier = "cell" - - var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? PFTableViewCell - if cell == nil { - cell = PFTableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier) - } - - var title: String? - var subtitle: String? - - if let object = object { - title = object["title"] as? String - if let priority = object["priority"] as? Int { - subtitle = "Priority: \(priority)" - } else { - subtitle = "No Priority" - } - } - - cell?.textLabel?.text = title - cell?.detailTextLabel?.text = subtitle - - return cell - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.swift deleted file mode 100644 index 65cabb92a..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.swift +++ /dev/null @@ -1,46 +0,0 @@ -/* -* Copyright (c) 2015, Parse, LLC. All rights reserved. -* -* You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -* copy, modify, and distribute this software in source code or binary form for use -* in connection with the web services and APIs provided by Parse. -* -* As with any software that integrates with the Parse platform, your use of -* this software is subject to the Parse Terms of Service -* [https://www.parse.com/about/terms]. This copyright notice shall be -* included in all copies or substantial portions of the software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -* -*/ - -import UIKit - -import ParseCore -import ParseUI - -class SubtitleImageTableViewController: PFQueryTableViewController { - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath, object: PFObject?) -> PFTableViewCell? { - let cellIdentifier = "cell" - - var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? PFTableViewCell - if cell == nil { - cell = PFTableViewCell(style: .value1, reuseIdentifier: cellIdentifier) - } - - cell?.textLabel?.text = object?["name"] as? String - cell?.detailTextLabel?.text = "@parseit" - - cell?.imageView?.image = UIImage(named: "Icon.png") - cell?.imageView?.file = object?["icon"] as? PFFileObject - - return cell - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/SignUpViewController/CustomSignUpViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/SignUpViewController/CustomSignUpViewController.swift deleted file mode 100644 index d9d6fcf2e..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/SignUpViewController/CustomSignUpViewController.swift +++ /dev/null @@ -1,41 +0,0 @@ -/* -* Copyright (c) 2015, Parse, LLC. All rights reserved. -* -* You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -* copy, modify, and distribute this software in source code or binary form for use -* in connection with the web services and APIs provided by Parse. -* -* As with any software that integrates with the Parse platform, your use of -* this software is subject to the Parse Terms of Service -* [https://www.parse.com/about/terms]. This copyright notice shall be -* included in all copies or substantial portions of the software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -* -*/ - -import UIKit - -import ParseCore -import ParseUI - -class CustomSignUpViewController: PFSignUpViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - view.backgroundColor = .blue - - let label = UILabel() - label.textColor = .white - label.text = "All Custom!" - label.sizeToFit() - signUpView?.logo = label - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/Resources/SimpleQueryCollectionStoryboard-Swift.storyboard b/ParseUI/ParseUIDemo/Swift/Resources/SimpleQueryCollectionStoryboard-Swift.storyboard deleted file mode 100644 index 51a145098..000000000 --- a/ParseUI/ParseUIDemo/Swift/Resources/SimpleQueryCollectionStoryboard-Swift.storyboard +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseUI/ParseUIDemo/Swift/Resources/SimpleQueryTableStoryboard-Swift.storyboard b/ParseUI/ParseUIDemo/Swift/Resources/SimpleQueryTableStoryboard-Swift.storyboard deleted file mode 100644 index 00105a56d..000000000 --- a/ParseUI/ParseUIDemo/Swift/Resources/SimpleQueryTableStoryboard-Swift.storyboard +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseUI/ParseUIDemo/Swift/UIDemoViewController.swift b/ParseUI/ParseUIDemo/Swift/UIDemoViewController.swift deleted file mode 100644 index 11739cfdd..000000000 --- a/ParseUI/ParseUIDemo/Swift/UIDemoViewController.swift +++ /dev/null @@ -1,350 +0,0 @@ -/* -* Copyright (c) 2015, Parse, LLC. All rights reserved. -* -* You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -* copy, modify, and distribute this software in source code or binary form for use -* in connection with the web services and APIs provided by Parse. -* -* As with any software that integrates with the Parse platform, your use of -* this software is subject to the Parse Terms of Service -* [https://www.parse.com/about/terms]. This copyright notice shall be -* included in all copies or substantial portions of the software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -* -*/ - -import UIKit - -import ParseCore -import ParseUI - -enum UIDemoType : Int { - case LogInDefault - case LogInUsernamePassword - case LogInPasswordForgotten - case LogInDone - case LogInEmailAsUsername - case LogInAll - case LogInAllNavigation - case LogInCustomizedLogoAndBackground - case SignUpDefault - case SignUpUsernamePassword - case SignUpUsernamePasswordEmail - case SignUpUsernamePasswordEmailSignUp - case SignUpAll - case SignUpEmailAsUsername - case SignUpMinPasswordLength - case SimpleTable - case PaginatedTable - case SectionedTable - case StoryboardTable - case DeletionTable - case ImageTableDefaultStyle - case ImageTableSubtitleStyle - case SimpleCollection - case PaginatedCollection - case SectionedCollection - case StoryboardCollection - case DeletionCollection - case ImageCollection - case Product - case CustomizedProduct - - static var count: Int { - var count = 0 - while let _ = self.init(rawValue: count) { - count = count + 1 - } - return count - } -} - -extension UIDemoType : CustomStringConvertible { - - var description: String { - switch (self) { - case .LogInDefault: - return "Log In Default" - case .LogInUsernamePassword: - return "Log In Username and Password" - case .LogInPasswordForgotten: - return "Log In Password Forgotten" - case .LogInDone: - return "Log In Done Button" - case .LogInEmailAsUsername: - return "Log In Email as Username" - case .LogInAll: - return "Log In All" - case .LogInAllNavigation: - return "Log In All as Navigation" - case .LogInCustomizedLogoAndBackground: - return "Log In Customized Background" - case .SignUpDefault: - return "Sign Up Default" - case .SignUpUsernamePassword: - return "Sign Up Username and Password" - case .SignUpUsernamePasswordEmail: - return "Sign Up Email" - case .SignUpUsernamePasswordEmailSignUp: - return "Sign Up Email And SignUp" - case .SignUpAll: - return "Sign Up All" - case .SignUpEmailAsUsername: - return "Sign Up Email as Username" - case .SignUpMinPasswordLength: - return "Sign Up Minimum Password Length" - case .SimpleTable: - return "Simple Table" - case .PaginatedTable: - return "Paginated Table" - case .SectionedTable: - return "Sectioned Table" - case .StoryboardTable: - return "Simple Storyboard Table" - case .DeletionTable: - return "Deletion Table" - case .ImageTableDefaultStyle: - return "Remote Image Table Default Style" - case .ImageTableSubtitleStyle: - return "Remote Image Table Subtitle Style" - case .SimpleCollection: - return "Simple Collection" - case .PaginatedCollection: - return "Paginated Collection" - case .SectionedCollection: - return "Sectioned Collection" - case .StoryboardCollection: - return "Simple Storyboard Collection" - case .DeletionCollection: - return "Deletion Collection" - case .ImageCollection: - return "Remote Image Collection" - case .Product: - return "Product" - case .CustomizedProduct: - return "Customized Product" - } - } - -} - -class UIDemoViewController: UITableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - title = "ParseUI Demo" - tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") - } - -} - -extension UIDemoViewController { - - override func numberOfSections(in tableView: UITableView) -> Int { - return 1 - } - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return UIDemoType.count - } - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) - cell.textLabel?.text = UIDemoType(rawValue: indexPath.row)?.description - return cell - } -} - -extension UIDemoViewController { - - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - if let demoType = UIDemoType(rawValue: indexPath.row) { - switch (demoType) { - // ----- - // PFLogInViewController - // ----- - case .LogInDefault: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - present(logInViewController, animated: true, completion: nil) - case .LogInUsernamePassword: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .dismissButton] - present(logInViewController, animated: true, completion: nil) - case .LogInPasswordForgotten: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .passwordForgotten, .dismissButton] - present(logInViewController, animated: true, completion: nil) - case .LogInDone: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .logInButton, .dismissButton] - present(logInViewController, animated: true, completion: nil) - case .LogInEmailAsUsername: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .logInButton, .signUpButton, .dismissButton] - logInViewController.emailAsUsername = true - present(logInViewController, animated: true, completion: nil) - case .LogInAll: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .passwordForgotten, .logInButton, .signUpButton, .dismissButton] - if let signUpController = logInViewController.signUpController { - signUpController.delegate = self - signUpController.fields = [.usernameAndPassword, .email, .additional, .signUpButton, .dismissButton] - } - present(logInViewController, animated: true, completion: nil) - case .LogInAllNavigation: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .passwordForgotten, .logInButton, .signUpButton, .dismissButton] - if let signUpViewController = logInViewController.signUpController { - signUpViewController.delegate = self - signUpViewController.fields = [.usernameAndPassword, .email, .additional, .signUpButton, .dismissButton] - } - navigationController?.pushViewController(logInViewController, animated: true) - case .LogInCustomizedLogoAndBackground: - let logInViewController = CustomLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.default] - - let signUpViewController = CustomSignUpViewController() - signUpViewController.delegate = self - signUpViewController.fields = .default - - logInViewController.signUpController = signUpViewController - present(logInViewController, animated: true, completion: nil) - // ----- - // PFSignUpViewController - // ----- - case .SignUpDefault: - let signUpViewController = PFSignUpViewController() - signUpViewController.delegate = self - present(signUpViewController, animated: true, completion: nil) - case .SignUpUsernamePassword: - let signUpViewController = PFSignUpViewController() - signUpViewController.delegate = self - signUpViewController.fields = [.usernameAndPassword, .dismissButton] - present(signUpViewController, animated: true, completion: nil) - case .SignUpUsernamePasswordEmail: - let signUpViewController = PFSignUpViewController() - signUpViewController.delegate = self - signUpViewController.fields = [.usernameAndPassword, .email, .dismissButton] - present(signUpViewController, animated: true, completion: nil) - case .SignUpUsernamePasswordEmailSignUp: - let signUpViewController = PFSignUpViewController() - signUpViewController.delegate = self - signUpViewController.fields = [.usernameAndPassword, .email, .signUpButton, .dismissButton] - present(signUpViewController, animated: true, completion: nil) - case .SignUpAll: - let signUpViewController = PFSignUpViewController() - signUpViewController.delegate = self - signUpViewController.fields = [.usernameAndPassword, .email, .additional, .signUpButton, .dismissButton] - present(signUpViewController, animated: true, completion: nil) - case .SignUpEmailAsUsername: - let signUpViewController = PFSignUpViewController() - signUpViewController.delegate = self - signUpViewController.fields = [.usernameAndPassword, .signUpButton, .dismissButton] - signUpViewController.emailAsUsername = true - present(signUpViewController, animated: true, completion: nil) - case .SignUpMinPasswordLength: - let signUpViewController = PFSignUpViewController() - signUpViewController.delegate = self - signUpViewController.fields = [.usernameAndPassword, .signUpButton, .dismissButton] - signUpViewController.minPasswordLength = 6 - present(signUpViewController, animated: true, completion: nil) - // ----- - // PFQueryTableViewController - // ----- - case .SimpleTable: - let tableViewController = SimpleTableViewController(className: "Todo") - navigationController?.pushViewController(tableViewController, animated: true) - case .PaginatedTable: - let tableViewController = PaginatedTableViewController(className: "Todo") - navigationController?.pushViewController(tableViewController, animated: true) - case .SectionedTable: - let tableViewController = SectionedTableViewController(className: "Todo") - navigationController?.pushViewController(tableViewController, animated: true) - case .StoryboardTable: - let storyboard = UIStoryboard(name: "SimpleQueryTableStoryboard-Swift", bundle: nil) - let tableViewController = storyboard.instantiateViewController(withIdentifier: "StoryboardTableViewController") as? StoryboardTableViewController - navigationController?.pushViewController(tableViewController!, animated: true) - case .DeletionTable: - let tableViewController = DeletionTableViewController(className: "PublicTodo"); - navigationController?.pushViewController(tableViewController, animated: true); - case .ImageTableDefaultStyle: - let tableViewController = PFQueryTableViewController(className: "App") - tableViewController.imageKey = "icon" - tableViewController.textKey = "name" - tableViewController.paginationEnabled = false - tableViewController.placeholderImage = UIImage(named: "Icon.png") - navigationController?.pushViewController(tableViewController, animated: true) - case .ImageTableSubtitleStyle: - let tableViewController = SubtitleImageTableViewController(className: "App") - tableViewController.imageKey = "icon" - tableViewController.textKey = "name" - tableViewController.paginationEnabled = false - tableViewController.placeholderImage = UIImage(named: "Icon.png") - navigationController?.pushViewController(tableViewController, animated: true) - // ----- - // PFQueryCollectionViewController - // ----- - case .SimpleCollection: - let collectionViewController = SimpleCollectionViewController(className: "Todo") - navigationController?.pushViewController(collectionViewController, animated: true) - case .PaginatedCollection: - let collectionViewController = PaginatedCollectionViewController(className: "Todo") - navigationController?.pushViewController(collectionViewController, animated: true) - case .SectionedCollection: - let collectionViewController = SectionedCollectionViewController(className: "Todo") - navigationController?.pushViewController(collectionViewController, animated: true) - case .StoryboardCollection: - let storyboard = UIStoryboard(name: "SimpleQueryCollectionStoryboard-Swift", bundle: nil) - let collectionViewController = storyboard.instantiateViewController(withIdentifier: "StoryboardCollectionViewController") as? StoryboardCollectionViewController - navigationController?.pushViewController(collectionViewController!, animated: true) - case .DeletionCollection: - let collectionViewController = DeletionCollectionViewController(className: "PublicTodo"); - navigationController?.pushViewController(collectionViewController, animated: true) - case .ImageCollection: - let collectionViewController = SubtitleImageCollectionViewController(className: "App") - navigationController?.pushViewController(collectionViewController, animated: true) - // ----- - // PFProductTableViewController - // ----- - case .Product: - let productTableViewController = PFProductTableViewController() - navigationController?.pushViewController(productTableViewController, animated: true) - case .CustomizedProduct: - let productTableViewController = CustomProductTableViewController() - navigationController?.pushViewController(productTableViewController, animated: true) - } - } - } - -} - -extension UIDemoViewController : PFLogInViewControllerDelegate { - - func logInViewController(logInController: PFLogInViewController, didLogInUser user: PFUser) { - dismiss(animated: true, completion: nil) - } - -} - -extension UIDemoViewController : PFSignUpViewControllerDelegate { - - func signUpViewController(signUpController: PFSignUpViewController, didSignUpUser user: PFUser) { - dismiss(animated: true, completion: nil) - } - -} diff --git a/ParseUI/Scripts/convert_images.rb b/ParseUI/Scripts/convert_images.rb deleted file mode 100755 index 4c03f4057..000000000 --- a/ParseUI/Scripts/convert_images.rb +++ /dev/null @@ -1,166 +0,0 @@ -#!/usr/bin/env ruby -# -# Copyright (c) 2014, Parse, LLC. All rights reserved. -# -# You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -# copy, modify, and distribute this software in source code or binary form for use -# in connection with the web services and APIs provided by Parse. -# -# As with any software that integrates with the Parse platform, your use of -# this software is subject to the Parse Terms of Service -# [https://www.parse.com/about/terms]. This copyright 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. -# -# This script generates Objective-C byte arrays from the png images. - -# Usage: ./convert_images.rb [path/to/images/to/convert/] [Name_Of_Output_Class] -# Note the final slash on the path argument. It is necessary. - -require 'time' -require 'fileutils' - -PATH_PREFIX = ARGV[0] -SEARCH_PATH = "#{PATH_PREFIX}**/*.{png,jpg,jpeg,gif}" - -def make_varname(filename) - varname = filename[PATH_PREFIX.length...filename.length] - varname.gsub!("@", "") - varname.gsub!(/[.\/\-]/, "_") - varname -end - -def get_modified_time_from_header(header_filename_with_path, source_filename_with_path) - resource_modified_time = {} # maps resource filename to the file's modified time - if File.exist?(header_filename_with_path) && File.exist?(source_filename_with_path) - File.open(header_filename_with_path, "r") do |header_file| - puts "Collect timestamps of previously generated resource files" - header_file.each_line do |line| - # puts line - match = %r{NSData\s\*\)(.*);//modified:(.*)$}.match(line) - next unless match - - resource_filename = Regexp.last_match[1] - mtime = Regexp.last_match[2] - puts "resource_filename #{resource_filename}" - puts "time #{mtime}" - resource_modified_time[resource_filename] = Time.parse mtime - end - end - end - resource_modified_time -end - -def files_differ(resource_modified_time) - Dir.glob(SEARCH_PATH) do |filename| - filename_varname = make_varname(filename) - if resource_modified_time[filename_varname].nil? - puts "New file #{filename_varname} is added to resources" - return true - end - - if resource_modified_time[filename_varname] != File.mtime(filename) - puts "A resource file #{filename_varname} had been modified since the header was created" - return true - end - resource_modified_time.delete filename_varname - end - - if resource_modified_time.keys.count != 0 - puts "Some files are present in the header but are not present in resources." - puts "This indicates some resource files have been removed since last time PFResource.h was generated." - return true - end - - puts "The set of files in resources and the set of files in header are identical matches" - puts "Not generating resource files" - false -end - -output_path = File.dirname(ARGV[1]) -output_classname = File.basename(ARGV[1]) - -# We write to temp files and copy over temp files to the final files in the end. -# This way, Xcode does not pick up the intermediate result files and flag them as build errors. -# If developers see these temporary build errors, they will inevitably think the script is broken. -FileUtils.mkdir_p(output_path) - -output_header_filename = output_classname + "Temp.h" -output_source_filename = output_classname + "Temp.m" -final_output_header_filename = output_classname + ".h" -final_output_source_filename = output_classname + ".m" -header_filename_with_path = File.join(output_path, output_header_filename) -source_filename_with_path = File.join(output_path, output_source_filename) -final_output_header_filename_with_path = File.join(output_path, final_output_header_filename) -final_output_source_filename_with_path = File.join(output_path, final_output_source_filename) - -if ARGV.nil? || !(ARGV.include?("-f") || ARGV.include?("-forced")) - resource_modified_time = get_modified_time_from_header(final_output_header_filename_with_path, - final_output_source_filename_with_path) - exit if !files_differ(resource_modified_time) -end - -puts "Regenerating resource byte array files" -# generate header and source files -output_header_file = File.open(header_filename_with_path, "w") -output_source_file = File.open(source_filename_with_path, "w") - -output_header_file.write < -@interface #{output_classname} : NSObject -HEREDOC - -output_source_file.write < 0 - result << ", " - end - result << "0x#{byte.to_s(16)}" - count += 1 - end - result << " };\n\n" - - output_header_file.write < true) -FileUtils.rm(source_filename_with_path, :force => true) - -puts "Done regenerating resource byte array files" diff --git a/ParseUI/SignInWithAppleTests/Info.plist b/ParseUI/SignInWithAppleTests/Info.plist deleted file mode 100644 index 64d65ca49..000000000 --- a/ParseUI/SignInWithAppleTests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/ParseUI/SignInWithAppleTests/SignInWithAppleTests.m b/ParseUI/SignInWithAppleTests/SignInWithAppleTests.m deleted file mode 100644 index b74b76ba0..000000000 --- a/ParseUI/SignInWithAppleTests/SignInWithAppleTests.m +++ /dev/null @@ -1,149 +0,0 @@ -// -// SignInWithAppleTests.m -// SignInWithAppleTests -// -// Created by Darren Black on 03/01/2020. -// Copyright © 2020 Parse Inc. All rights reserved. -// - -#import -#import "PFAppleUtils.h" -@import ParseCore; - -@import OCMock; - -@interface SignInWithAppleTests : XCTestCase - -@end - -@interface PFAppleUtils () - -+ (BFTask *)logInInBackgroundWithManager:(PFAppleLoginManager *)manager; - -@end - -@interface PFAppleLoginManager () - -@property (weak, nonatomic) ASAuthorizationController *controller; - -@end - -@interface FakeAuth : NSObject - -@property (nonatomic, strong) id provider; -@property (nonatomic, strong) id credential; - -@end - -@implementation FakeAuth - -@end - -@interface FakeCredential : NSObject - -@property (nonatomic, strong) NSString *user; -@property (nonatomic, strong) NSPersonNameComponents *fullName; -@property (nonatomic, strong) NSData *identityToken; - -@end - -@implementation FakeCredential - -@end - -@implementation SignInWithAppleTests - -- (void)setUp { - // Put setup code here. This method is called before the invocation of each test method in the class. -} - -- (void)tearDown { - // Put teardown code here. This method is called after the invocation of each test method in the class. -} - -- (void)testAppleUtilsLoginSuccess { - - // Create test ASAuthorization and ASAuthorizationAppleIDCredential - FakeAuth *fakeAuth = [FakeAuth new]; - FakeCredential *cred = [FakeCredential new]; - NSString *aString = [NSUUID UUID].UUIDString; - cred.user = aString; - NSPersonNameComponents *name = [[NSPersonNameComponents alloc] init]; - name.givenName = @"Test"; - name.familyName = @"User"; - cred.fullName = name; - NSData *token = [aString dataUsingEncoding:NSUTF8StringEncoding]; - cred.identityToken = token; - fakeAuth.credential = cred; - - // Create stub for PFUser logInWithAuthTypeInBackground - id mockUser = OCMClassMock([PFUser class]); - NSDictionary *authData = @{@"token" : aString, - @"id" : aString }; - PFUser *loggedInUser = [PFUser new]; - OCMStub(ClassMethod([mockUser logInWithAuthTypeInBackground:@"apple" authData:authData])).andReturn([BFTask taskWithResult:loggedInUser]); - - // Create the login task - PFAppleLoginManager *manager = [PFAppleLoginManager new]; - BFTask *logInTask = [PFAppleUtils logInInBackgroundWithManager:manager]; - - XCTestExpectation *expectLoginSuccess = [self expectationWithDescription:@"Login should complete."]; - [logInTask continueWithSuccessBlock:^id _Nullable(BFTask * _Nonnull t) { - XCTAssert(t.result[@"user"] == loggedInUser); - ASAuthorizationAppleIDCredential *credential = t.result[@"credential"]; - XCTAssert([credential.fullName isEqual:cred.fullName]); - XCTAssert([credential.identityToken isEqual:cred.identityToken]); - XCTAssert([credential.user isEqual:cred.user]); - [expectLoginSuccess fulfill]; - return nil; - }]; - - // Call the success callback as Apple would - [manager authorizationController:manager.controller didCompleteWithAuthorization:(ASAuthorization *)fakeAuth]; - [self waitForExpectations:@[expectLoginSuccess] timeout:2]; - - [mockUser stopMocking]; - -} - -- (void)testAppleUtilsLoginFailure { - // Create test ASAuthorization and ASAuthorizationAppleIDCredential - FakeAuth *fakeAuth = [FakeAuth new]; - FakeCredential *cred = [FakeCredential new]; - NSString *aString = [NSUUID UUID].UUIDString; - cred.user = aString; - NSPersonNameComponents *name = [[NSPersonNameComponents alloc] init]; - name.givenName = @"Test"; - name.familyName = @"User"; - cred.fullName = name; - NSData *token = [aString dataUsingEncoding:NSUTF8StringEncoding]; - cred.identityToken = token; - fakeAuth.credential = cred; - - // Create failing stub for PFUser logInWithAuthTypeInBackground - id mockUser = OCMClassMock([PFUser class]); - NSDictionary *authData = @{@"token" : aString, - @"id" : aString }; - NSError *err = [[NSError alloc] initWithDomain:@"org.parseplatform.error" code:1337 userInfo:nil]; - OCMStub(ClassMethod([mockUser logInWithAuthTypeInBackground:@"apple" authData:authData])).andReturn([BFTask taskWithError:err]); - - // Create the login task - PFAppleLoginManager *manager = [PFAppleLoginManager new]; - BFTask *logInTask = [PFAppleUtils logInInBackgroundWithManager:manager]; - - XCTestExpectation *expect = [self expectationWithDescription:@"Task should fail."]; - [logInTask continueWithBlock:^id _Nullable(BFTask * _Nonnull t) { - if (t.error) { - [expect fulfill]; - } - return nil; - }]; - - // Call the success callback as Apple would - [manager authorizationController:manager.controller didCompleteWithAuthorization:(ASAuthorization *)fakeAuth]; - [self waitForExpectations:@[expect] timeout:2]; - - [mockUser stopMocking]; -} - -@end diff --git a/Rakefile b/Rakefile index 34509b27e..a35cbe7cf 100644 --- a/Rakefile +++ b/Rakefile @@ -27,7 +27,6 @@ module Constants File.join(SCRIPT_PATH, 'Parse', 'Parse', 'Resources', 'Parse-OSX.Info.plist'), File.join(SCRIPT_PATH, 'Parse', 'Parse', 'Resources', 'Parse-watchOS.Info.plist'), File.join(SCRIPT_PATH, 'Parse', 'Parse', 'Resources', 'Parse-tvOS.Info.plist'), - File.join(SCRIPT_PATH, 'ParseUI', 'ParseUI', 'Resources', 'Info-iOS.plist'), File.join(SCRIPT_PATH, 'ParseLiveQuery', 'ParseLiveQuery', 'Resources', 'Info.plist'), File.join(SCRIPT_PATH, 'ParseLiveQuery', 'ParseLiveQuery-tvOS', 'Info.plist'), File.join(SCRIPT_PATH, 'ParseLiveQuery', 'ParseLiveQuery-watchOS', 'Info.plist'), @@ -257,65 +256,6 @@ namespace :test do end end - namespace :parseui do - task :all do - Rake::Task['test:parseui:framework'].invoke - Rake::Task['test:parseui:demo_objc'].invoke - Rake::Task['test:parseui:demo_swift'].invoke - end - - task :framework do - task = XCTask::BuildTask.new do |t| - t.directory = SCRIPT_PATH - t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseUI' - t.sdk = 'iphonesimulator' - t.destinations = [ios_simulator] - t.configuration = 'Debug -enableCodeCoverage YES' - t.actions = [XCTask::BuildAction::TEST] - t.formatter = XCTask::BuildFormatter::XCPRETTY - end - unless task.execute - puts 'Failed to build ParseUI' - exit(1) - end - end - - task :demo_objc do - task = XCTask::BuildTask.new do |t| - t.directory = SCRIPT_PATH - t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseUIDemo' - t.sdk = 'iphonesimulator' - t.destinations = [ios_simulator] - t.configuration = 'Debug' - t.actions = build_action - t.formatter = XCTask::BuildFormatter::XCPRETTY - end - unless task.execute - puts 'Failed to build ParseUI Demo.' - exit(1) - end - end - - task :demo_swift do - task = XCTask::BuildTask.new do |t| - t.directory = SCRIPT_PATH - t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseUIDemo-Swift' - t.sdk = 'iphonesimulator' - t.destinations = [ios_simulator] - t.configuration = 'Debug' - t.actions = build_action - t.formatter = XCTask::BuildFormatter::XCPRETTY - end - unless task.execute - puts 'Failed to build iOS ParseUI Swift Demo.' - exit(1) - end - end - end - namespace :parse_live_query do task :all do Rake::Task['test:parse_live_query:ios'].invoke