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 7ff6bcc5d..000000000 Binary files a/ParseUI/ParseUI/Resources/Images/apple_icon.png and /dev/null differ 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 c826f381f..000000000 Binary files a/ParseUI/ParseUI/Resources/Images/apple_icon@2x.png and /dev/null differ diff --git a/ParseUI/ParseUI/Resources/Images/apple_icon@3x.png b/ParseUI/ParseUI/Resources/Images/apple_icon@3x.png deleted file mode 100644 index eb3ec756a..000000000 Binary files a/ParseUI/ParseUI/Resources/Images/apple_icon@3x.png and /dev/null differ diff --git a/ParseUI/ParseUI/Resources/Images/facebook_icon.png b/ParseUI/ParseUI/Resources/Images/facebook_icon.png deleted file mode 100644 index 1d236b317..000000000 Binary files a/ParseUI/ParseUI/Resources/Images/facebook_icon.png and /dev/null differ diff --git a/ParseUI/ParseUI/Resources/Images/facebook_icon@2x.png b/ParseUI/ParseUI/Resources/Images/facebook_icon@2x.png deleted file mode 100644 index de09d02b7..000000000 Binary files a/ParseUI/ParseUI/Resources/Images/facebook_icon@2x.png and /dev/null differ 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 287456bb8..000000000 Binary files a/ParseUI/ParseUI/Resources/Images/facebook_icon@3x.png and /dev/null differ diff --git a/ParseUI/ParseUI/Resources/Images/parse_logo.png b/ParseUI/ParseUI/Resources/Images/parse_logo.png deleted file mode 100644 index 68d8befc2..000000000 Binary files a/ParseUI/ParseUI/Resources/Images/parse_logo.png and /dev/null differ diff --git a/ParseUI/ParseUI/Resources/Images/parse_logo@2x.png b/ParseUI/ParseUI/Resources/Images/parse_logo@2x.png deleted file mode 100644 index f2c3b419d..000000000 Binary files a/ParseUI/ParseUI/Resources/Images/parse_logo@2x.png and /dev/null differ 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 80629f4e6..000000000 Binary files a/ParseUI/ParseUI/Resources/Images/parse_logo@3x.png and /dev/null differ diff --git a/ParseUI/ParseUI/Resources/Images/twitter_icon.png b/ParseUI/ParseUI/Resources/Images/twitter_icon.png deleted file mode 100644 index 386d40b5c..000000000 Binary files a/ParseUI/ParseUI/Resources/Images/twitter_icon.png and /dev/null differ 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 a319f37bc..000000000 Binary files a/ParseUI/ParseUI/Resources/Images/twitter_icon@2x.png and /dev/null differ diff --git a/ParseUI/ParseUI/Resources/Images/twitter_icon@3x.png b/ParseUI/ParseUI/Resources/Images/twitter_icon@3x.png deleted file mode 100644 index d6cc3bd3f..000000000 Binary files a/ParseUI/ParseUI/Resources/Images/twitter_icon@3x.png and /dev/null differ diff --git a/ParseUI/ParseUI/Resources/Info-iOS.plist b/ParseUI/ParseUI/Resources/Info-iOS.plist deleted file mode 100644 index e010b6365..000000000 --- a/ParseUI/ParseUI/Resources/Info-iOS.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - 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 d656c63c6..000000000 Binary files a/ParseUI/ParseUI/Resources/Localization/en.lproj/ParseUI.strings and /dev/null differ 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 cf2015c3e..000000000 Binary files a/ParseUI/ParseUI/Resources/Localization/fr.lproj/ParseUI.strings and /dev/null differ 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 bea566232..000000000 Binary files a/ParseUI/ParseUI/Resources/Localization/he.lproj/ParseUI.strings and /dev/null differ 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 ca1c83bd8..000000000 Binary files a/ParseUI/ParseUI/Resources/Localization/sv.lproj/ParseUI.strings and /dev/null differ 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 c2c9bc03b..000000000 Binary files a/ParseUI/ParseUIDemo/Resources/0.png and /dev/null differ diff --git a/ParseUI/ParseUIDemo/Resources/1.png b/ParseUI/ParseUIDemo/Resources/1.png deleted file mode 100644 index 57115b9a4..000000000 Binary files a/ParseUI/ParseUIDemo/Resources/1.png and /dev/null differ diff --git a/ParseUI/ParseUIDemo/Resources/2.png b/ParseUI/ParseUIDemo/Resources/2.png deleted file mode 100644 index c0b0f5ea8..000000000 Binary files a/ParseUI/ParseUIDemo/Resources/2.png and /dev/null differ diff --git a/ParseUI/ParseUIDemo/Resources/Icon.png b/ParseUI/ParseUIDemo/Resources/Icon.png deleted file mode 100644 index a4414e2cc..000000000 Binary files a/ParseUI/ParseUIDemo/Resources/Icon.png and /dev/null differ 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