Commit 7273edbfdf0b9044d791ccf08e2b5e619bde4432

Authored by Cao yang
1 parent c7483c8b
Exists in parentassistant

优化页面布局,添加alamofireImage

Showing 79 changed files with 6426 additions and 3058 deletions   Show diff stats
ParentAssistant/ParentAssistant.xcodeproj/project.pbxproj
... ... @@ -80,6 +80,7 @@
80 80 ADC9AB88207C940700348EF1 /* ProgramViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC9AB87207C940700348EF1 /* ProgramViewController.swift */; };
81 81 ADE33B312062202300BEA6E6 /* Macro.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE33B302062202300BEA6E6 /* Macro.swift */; };
82 82 ADF159612069E00000A9485D /* CalendarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADF159602069E00000A9485D /* CalendarView.swift */; };
  83 + ADF15E7620883D1B00381EE1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = ADF15E7520883D1B00381EE1 /* Assets.xcassets */; };
83 84 BF388469205A4DE900A240EF /* StudentClassInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF388468205A4DE900A240EF /* StudentClassInfo.swift */; };
84 85 BF38846C205A58F800A240EF /* YXMessageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF38846B205A58F800A240EF /* YXMessageManager.swift */; };
85 86 BF38846E205A5A0000A240EF /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF38846D205A59FE00A240EF /* MobileCoreServices.framework */; };
... ... @@ -125,7 +126,6 @@
125 126 BF7A4C36204CD55300460463 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF7A4C35204CD55300460463 /* ViewController.swift */; };
126 127 BF7A4C3C204CD55300460463 /* ParentAssistant.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = BF7A4C3A204CD55300460463 /* ParentAssistant.xcdatamodeld */; };
127 128 BF7A4C4C204CD55500460463 /* ParentAssistantUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF7A4C4B204CD55500460463 /* ParentAssistantUITests.swift */; };
128   - BF7A4C84204E338500460463 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BF7A4C7E204E338400460463 /* Assets.xcassets */; };
129 129 BF7A4C85204E338500460463 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BF7A4C7F204E338400460463 /* LaunchScreen.storyboard */; };
130 130 BF7A4C86204E338500460463 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BF7A4C81204E338400460463 /* Main.storyboard */; };
131 131 BFA7443A207DB6EE00845D30 /* ActivationSchoolCardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA74439207DB6EE00845D30 /* ActivationSchoolCardViewController.swift */; };
... ... @@ -258,6 +258,7 @@
258 258 ADC9AB87207C940700348EF1 /* ProgramViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgramViewController.swift; sourceTree = "<group>"; };
259 259 ADE33B302062202300BEA6E6 /* Macro.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Macro.swift; sourceTree = "<group>"; };
260 260 ADF159602069E00000A9485D /* CalendarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarView.swift; sourceTree = "<group>"; };
  261 + ADF15E7520883D1B00381EE1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
261 262 BF388468205A4DE900A240EF /* StudentClassInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudentClassInfo.swift; sourceTree = "<group>"; };
262 263 BF38846B205A58F800A240EF /* YXMessageManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YXMessageManager.swift; sourceTree = "<group>"; };
263 264 BF38846D205A59FE00A240EF /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
... ... @@ -308,7 +309,6 @@
308 309 BF7A4C4B204CD55500460463 /* ParentAssistantUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParentAssistantUITests.swift; sourceTree = "<group>"; };
309 310 BF7A4C4D204CD55500460463 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
310 311 BF7A4C56204CE7F600460463 /* ParentAssistant-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ParentAssistant-Bridging-Header.h"; sourceTree = "<group>"; };
311   - BF7A4C7E204E338400460463 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
312 312 BF7A4C80204E338400460463 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
313 313 BF7A4C82204E338400460463 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
314 314 BF7A4C83204E338400460463 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
... ... @@ -753,9 +753,9 @@
753 753 isa = PBXGroup;
754 754 children = (
755 755 BFEAAADB20525F1F0072FAAF /* PrefixHeader.pch */,
756   - BF7A4C7E204E338400460463 /* Assets.xcassets */,
757 756 BF7A4C7F204E338400460463 /* LaunchScreen.storyboard */,
758 757 BF7A4C81204E338400460463 /* Main.storyboard */,
  758 + ADF15E7520883D1B00381EE1 /* Assets.xcassets */,
759 759 BF7A4C83204E338400460463 /* Info.plist */,
760 760 );
761 761 path = "Supporting Files";
... ... @@ -980,6 +980,7 @@
980 980 599364FC204E742000C8B371 /* ChannelSelectViewCollectionViewCell.xib in Resources */,
981 981 ADC9AB78207C65FC00348EF1 /* GrowSubjectCell.xib in Resources */,
982 982 ADC9AB80207C672800348EF1 /* SceneTopCell.xib in Resources */,
  983 + ADF15E7620883D1B00381EE1 /* Assets.xcassets in Resources */,
983 984 599365252050D03900C8B371 /* Evaluation.storyboard in Resources */,
984 985 5980BF672061048A00F4A35E /* Address.plist in Resources */,
985 986 BF38847C205CDE1B00A240EF /* JS.storyboard in Resources */,
... ... @@ -1004,7 +1005,6 @@
1004 1005 BF67F3BC20590A2F002FDC61 /* Info-iOS.plist in Resources */,
1005 1006 AD4BA4AD20819CAD00F83F13 /* ReportHeaderCollectionViewCell.xib in Resources */,
1006 1007 AD64A2C5207F28EB00B25E80 /* ProgramVacateBodyTableViewCell.xib in Resources */,
1007   - BF7A4C84204E338500460463 /* Assets.xcassets in Resources */,
1008 1008 BF7A4C85204E338500460463 /* LaunchScreen.storyboard in Resources */,
1009 1009 AD122AC6208442BC00C7D0AD /* ProgramVacateImageCell.xib in Resources */,
1010 1010 ADC9AB82207C673300348EF1 /* SceneMiddleCell.xib in Resources */,
... ... @@ -1044,6 +1044,7 @@
1044 1044 inputPaths = (
1045 1045 "${SRCROOT}/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-frameworks.sh",
1046 1046 "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework",
  1047 + "${BUILT_PRODUCTS_DIR}/AlamofireImage/AlamofireImage.framework",
1047 1048 "${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework",
1048 1049 "${BUILT_PRODUCTS_DIR}/HandyJSON/HandyJSON.framework",
1049 1050 "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework",
... ... @@ -1056,6 +1057,7 @@
1056 1057 name = "[CP] Embed Pods Frameworks";
1057 1058 outputPaths = (
1058 1059 "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework",
  1060 + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AlamofireImage.framework",
1059 1061 "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DZNEmptyDataSet.framework",
1060 1062 "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/HandyJSON.framework",
1061 1063 "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework",
... ...
ParentAssistant/ParentAssistant.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/xcschememanagement.plist
... ... @@ -7,7 +7,7 @@
7 7 <key>ParentAssistant.xcscheme</key>
8 8 <dict>
9 9 <key>orderHint</key>
10   - <integer>10</integer>
  10 + <integer>11</integer>
11 11 </dict>
12 12 </dict>
13 13 </dict>
... ...
ParentAssistant/ParentAssistant.xcworkspace/xcuserdata/caoyang.xcuserdatad/UserInterfaceState.xcuserstate
No preview for this file type
ParentAssistant/ParentAssistant/Classes/controllers/Grow/GrowViewController.swift
... ... @@ -10,12 +10,11 @@ import UIKit
10 10  
11 11 class GrowViewController: UIViewController,UIScrollViewDelegate {
12 12  
13   - var ZJBNavH = 44.0
14 13 //MARK: - 标题数据
15 14 //标题
16 15 lazy var titleView = {() -> UIView in
17 16 let title = UIScrollView()
18   - title.frame = CGRect(x:0,y:0,width:getScreenWidth(),height:44)
  17 + title.frame = CGRect(x:0,y:0,width:200,height:44)
19 18 title.backgroundColor = Theme.topBarColor()
20 19 return title
21 20 }()
... ... @@ -51,7 +50,9 @@ class GrowViewController: UIViewController,UIScrollViewDelegate {
51 50 super.viewDidLoad()
52 51 titleArr = ["应用","报告"]
53 52 //设置导航栏标题
54   - self.navigationItem.titleView = titleView
  53 + self.navigationItem.titleView = self.titleView
  54 + self.navigationItem.titleView?.center.x = screenWidth/2
  55 + print(self.navigationItem.titleView!.frame)
55 56 self.view.addSubview(contentScrollView)
56 57  
57 58 self.title = "成长"
... ... @@ -153,10 +154,10 @@ class GrowViewController: UIViewController,UIScrollViewDelegate {
153 154 btn.setTitleColor(UIColor.white, for: .normal)
154 155 btn.tag = i
155 156 btn.addTarget(self, action: #selector(clickTitleAction(btn:)), for:UIControlEvents.touchUpInside)
156   - btn.frame.size = CGSize.init(width: 40, height: ZJBNavH)
  157 + btn.frame.size = CGSize.init(width: 40, height: navigationBarHeight!)
157 158  
158   - let widht = getScreenWidth()
159   - btn.center = CGPoint.init(x: widht/4*(1+CGFloat(i))-26, y: CGFloat(ZJBNavH/2))
  159 + let centerX = titleView.frame.size.width/4
  160 + btn.center = CGPoint.init(x: centerX+centerX*2*CGFloat(i), y: CGFloat(navigationBarHeight!/2))
160 161 btnWidthArr.append(btn.frame.size.width)
161 162  
162 163 titleBtnArr.append(btn)
... ...
ParentAssistant/ParentAssistant/Classes/controllers/Grow/Program/ProgramCheckViewController.swift
... ... @@ -22,12 +22,22 @@ class ProgramCheckViewController: UIViewController,UITableViewDelegate,UITableVi
22 22 return table
23 23 }()
24 24  
  25 + var studentName:String?
  26 + lazy var formatter = {()->DateFormatter in
  27 + let matter = DateFormatter.init()
  28 + matter.dateFormat = "yyyy-MM-dd"
  29 + return matter
  30 + }()
25 31 var viewData = Array<StudentCardModel>()
26 32  
27 33  
28 34 override func viewDidLoad() {
29 35 super.viewDidLoad()
  36 +
  37 + self.studentName = AccountManager.shared.rawUserInfo?.contentData()["studentClass"][0]["studentName"].string
  38 +
30 39 self.view.addSubview(self.tableView)
  40 +
31 41 // Do any additional setup after loading the view.
32 42 downLoadDataFromNet()
33 43 }
... ... @@ -40,7 +50,7 @@ class ProgramCheckViewController: UIViewController,UITableViewDelegate,UITableVi
40 50 SVProgressHUD.dismiss()
41 51 if error == nil && JSON.fromString(backData)!["status"].intValue == 1 {
42 52 let data = JSON.fromString(backData)!["data"].arrayValue
43   -
  53 + print(backData!)
44 54 for i in 0..<data.count {
45 55 let dic = data[i].dictionary
46 56 if let model = StudentCardModel.deserialize(from: dic){
... ... @@ -71,9 +81,15 @@ class ProgramCheckViewController: UIViewController,UITableViewDelegate,UITableVi
71 81  
72 82 if indexPath.row == 0 {
73 83 let cell = tableView.dequeueReusableCell(withIdentifier: "GrowCheckUpTableViewCell", for: indexPath) as! GrowCheckUpTableViewCell
  84 + cell.checkCount.text = "\(self.viewData.count)"
  85 + cell.checkDate.text = self.formatter.string(from: Date())
  86 + cell.checkName.text = studentName
74 87 return cell
75 88 }else{
76 89 let cell = tableView.dequeueReusableCell(withIdentifier: "GrowCheckDownTableViewCell", for: indexPath) as! GrowCheckDownTableViewCell
  90 + let model = self.viewData[indexPath.row-1]
  91 + cell.studentParents.text = "尊敬的\(studentName!)家长"
  92 + cell.setCellData(model: model)
77 93 return cell
78 94 }
79 95 }
... ...
ParentAssistant/ParentAssistant/Classes/controllers/Grow/Program/ProgramViewController.swift
... ... @@ -26,8 +26,14 @@ class ProgramViewController: UIViewController,UITableViewDelegate,UITableViewDat
26 26 super.viewDidLoad()
27 27 self.view.backgroundColor = backGroundColor
28 28  
29   - let isCheck = true
30   -
  29 + var isCheck = true
  30 + if AccountManager.shared.isOnline() {
  31 + if AccountManager.shared.rawUserInfo!.contentData()["studentClass"].arrayValue.count == 0 {
  32 + isCheck = false
  33 + }else{
  34 + isCheck = true
  35 + }
  36 + }
31 37 if isCheck {
32 38 self.view.addSubview(self.tableView)
33 39 }else{
... ...
ParentAssistant/ParentAssistant/Classes/controllers/Grow/Report/MoralViewController.swift
... ... @@ -13,7 +13,7 @@ class MoralViewController: UIViewController,UITableViewDelegate,UITableViewDataS
13 13 lazy var tableView = {()->UITableView in
14 14  
15 15 let table = UITableView.init(frame: CGRect.init(x: 0, y: 0, width: screenWidth, height: screenHeight-navigationBarHeight!-statusBarHeight-10))
16   - table.backgroundColor = UIColor.init(red: 235/255, green: 235/255, blue: 241/255, alpha: 1)
  16 + table.backgroundColor = backGroundColor
17 17 table.delegate = self
18 18 table.dataSource = self
19 19 table.separatorStyle = UITableViewCellSeparatorStyle.none
... ... @@ -69,7 +69,7 @@ class MoralViewController: UIViewController,UITableViewDelegate,UITableViewDataS
69 69 case 0:
70 70 return 240
71 71 case 1:
72   - return 240
  72 + return 280
73 73 case 2:
74 74 return 70
75 75 default:
... ...
ParentAssistant/ParentAssistant/Classes/controllers/Grow/Report/SceneDetailViewController.swift
... ... @@ -45,7 +45,7 @@ class SceneDetailViewController: UIViewController,UITableViewDataSource,UITableV
45 45 case 0:
46 46 return 240
47 47 case 1:
48   - return 250
  48 + return 300
49 49 case 2:
50 50 return 70
51 51 default:
... ...
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckDownTableViewCell.swift
... ... @@ -18,6 +18,13 @@ class GrowCheckDownTableViewCell: UITableViewCell {
18 18 // Initialization code
19 19 self.backgroundColor = backgroundColor
20 20 }
  21 +
  22 + func setCellData(model:StudentCardModel){
  23 +
  24 + self.studentMessage.text = model.situation
  25 + self.studentImage.setImageWithUrl(urlStr: model.head_image, placeholder: "program_loadfail")
  26 + }
  27 +
21 28  
22 29 override func setSelected(_ selected: Bool, animated: Bool) {
23 30 super.setSelected(selected, animated: animated)
... ...
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckDownTableViewCell.xib
... ... @@ -13,18 +13,18 @@
13 13 <objects>
14 14 <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
15 15 <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
16   - <tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="GrowCheckDownTableViewCell" rowHeight="148" id="KGk-i7-Jjw" customClass="GrowCheckDownTableViewCell" customModule="ParentAssistant" customModuleProvider="target">
17   - <rect key="frame" x="0.0" y="0.0" width="320" height="148"/>
  16 + <tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="GrowCheckDownTableViewCell" rowHeight="179" id="KGk-i7-Jjw" customClass="GrowCheckDownTableViewCell" customModule="ParentAssistant" customModuleProvider="target">
  17 + <rect key="frame" x="0.0" y="0.0" width="320" height="179"/>
18 18 <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
19 19 <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
20   - <rect key="frame" x="0.0" y="0.0" width="320" height="147.5"/>
  20 + <rect key="frame" x="0.0" y="0.0" width="320" height="178.5"/>
21 21 <autoresizingMask key="autoresizingMask"/>
22 22 <subviews>
23 23 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="M2G-AT-SGp">
24   - <rect key="frame" x="10" y="0.0" width="300" height="147.5"/>
  24 + <rect key="frame" x="10" y="0.0" width="300" height="178.5"/>
25 25 <subviews>
26 26 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" text="down" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Jwf-rl-f67">
27   - <rect key="frame" x="9.5" y="30" width="1" height="117.5"/>
  27 + <rect key="frame" x="9.5" y="30" width="1" height="148.5"/>
28 28 <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
29 29 <constraints>
30 30 <constraint firstAttribute="width" constant="1" id="oLs-xY-7rY"/>
... ... @@ -59,10 +59,10 @@
59 59 <nil key="highlightedColor"/>
60 60 </label>
61 61 <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="report_teacher" translatesAutoresizingMaskIntoConstraints="NO" id="SPG-e7-fgN">
62   - <rect key="frame" x="25" y="76.5" width="100" height="60"/>
  62 + <rect key="frame" x="25" y="76.5" width="120" height="78"/>
63 63 <constraints>
64   - <constraint firstAttribute="width" constant="100" id="VO7-To-XAp"/>
65   - <constraint firstAttribute="height" constant="60" id="i62-A6-AJc"/>
  64 + <constraint firstAttribute="width" constant="120" id="VO7-To-XAp"/>
  65 + <constraint firstAttribute="height" constant="78" id="i62-A6-AJc"/>
66 66 </constraints>
67 67 </imageView>
68 68 </subviews>
... ... @@ -98,7 +98,7 @@
98 98 <outlet property="studentMessage" destination="Poh-Qh-ybX" id="I4b-qR-mT8"/>
99 99 <outlet property="studentParents" destination="CSJ-Ct-dJH" id="pU9-Ds-VC7"/>
100 100 </connections>
101   - <point key="canvasLocation" x="25" y="-62"/>
  101 + <point key="canvasLocation" x="25" y="-46.5"/>
102 102 </tableViewCell>
103 103 </objects>
104 104 <resources>
... ...
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckUpTableViewCell.swift
... ... @@ -15,11 +15,11 @@ class GrowCheckUpTableViewCell: UITableViewCell {
15 15 @IBOutlet weak var checkCount: UILabel!
16 16 override func awakeFromNib() {
17 17 super.awakeFromNib()
18   - self.backgroundColor = backgroundColor
  18 + self.backgroundColor = backGroundColor
19 19  
20 20 // Initialization code
21 21 }
22   -
  22 +
23 23 override func setSelected(_ selected: Bool, animated: Bool) {
24 24 super.setSelected(selected, animated: animated)
25 25  
... ...
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/EducationDetailCell.swift
... ... @@ -9,8 +9,6 @@
9 9 import UIKit
10 10  
11 11 class EducationDetailCell: UITableViewCell {
12   -
13   - @IBOutlet weak var lineChartView: UIView!
14 12  
15 13 var customLineChart = LineChartView()
16 14  
... ... @@ -18,9 +16,10 @@ class EducationDetailCell: UITableViewCell {
18 16 super.awakeFromNib()
19 17 self.backgroundColor = backgroundColor
20 18  
21   - let rect = self.lineChartView.bounds
22   - print(rect)
  19 + let rect = CGRect.init(x: 10, y: 60, width: screenWidth-20, height: self.bounds.size.height-60)
23 20 customLineChart = LineChartView.init(frame: rect)
  21 +
  22 + print("linechart frame = \(customLineChart.frame)")
24 23 customLineChart.drawUI(xLableArr: nil)
25 24 let arr1 = [4,4,2,1,3]
26 25 let arr2 = [2,1,4,4,5]
... ... @@ -29,8 +28,7 @@ class EducationDetailCell: UITableViewCell {
29 28 customLineChart.drawLine(point: arr2, color: UIColorWithRGB(R: 220, G: 0, B: 16))
30 29  
31 30  
32   -
33   - self.lineChartView.addSubview(customLineChart)
  31 + self.addSubview(customLineChart)
34 32  
35 33  
36 34 // Initialization code
... ...
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/EducationDetailCell.xib
... ... @@ -12,7 +12,7 @@
12 12 <objects>
13 13 <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
14 14 <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
15   - <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="educationDetail" rowHeight="280" id="kpS-dg-IFL" customClass="EducationDetailCell" customModule="ParentAssistant" customModuleProvider="target">
  15 + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="educationDetail" id="kpS-dg-IFL" customClass="EducationDetailCell" customModule="ParentAssistant" customModuleProvider="target">
16 16 <rect key="frame" x="0.0" y="0.0" width="375" height="280"/>
17 17 <autoresizingMask key="autoresizingMask"/>
18 18 <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="kpS-dg-IFL" id="pme-x3-3eS">
... ... @@ -56,9 +56,6 @@
56 56 </userDefinedRuntimeAttribute>
57 57 </userDefinedRuntimeAttributes>
58 58 </view>
59   - <view contentMode="scaleToFill" restorationIdentifier="moralLineChart" translatesAutoresizingMaskIntoConstraints="NO" id="RJ2-NP-DNZ">
60   - <rect key="frame" x="0.0" y="38" width="355" height="231"/>
61   - </view>
62 59 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="今日" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qaG-rY-RUN">
63 60 <rect key="frame" x="96.5" y="10" width="31" height="18"/>
64 61 <fontDescription key="fontDescription" type="system" pointSize="15"/>
... ... @@ -70,15 +67,11 @@
70 67 <constraints>
71 68 <constraint firstItem="qaG-rY-RUN" firstAttribute="leading" secondItem="I73-88-oNc" secondAttribute="trailing" constant="10" id="0VJ-ew-dod"/>
72 69 <constraint firstItem="I73-88-oNc" firstAttribute="top" secondItem="8hE-eE-nri" secondAttribute="top" constant="10" id="3ah-ko-qBu"/>
73   - <constraint firstItem="RJ2-NP-DNZ" firstAttribute="leading" secondItem="8hE-eE-nri" secondAttribute="leading" id="6wR-aq-VMa"/>
74 70 <constraint firstItem="2Pj-Ux-aqd" firstAttribute="top" secondItem="8hE-eE-nri" secondAttribute="top" constant="10" id="7b1-G7-LVt"/>
75 71 <constraint firstItem="2Pj-Ux-aqd" firstAttribute="leading" secondItem="VqB-il-dfx" secondAttribute="trailing" constant="10" id="GZJ-vN-dbK"/>
76 72 <constraint firstItem="qaG-rY-RUN" firstAttribute="trailing" secondItem="8hE-eE-nri" secondAttribute="centerX" constant="-50" id="LRa-1p-yGT"/>
77   - <constraint firstItem="RJ2-NP-DNZ" firstAttribute="top" secondItem="qaG-rY-RUN" secondAttribute="bottom" constant="10" id="S9B-Er-RCb"/>
78 73 <constraint firstItem="qaG-rY-RUN" firstAttribute="top" secondItem="8hE-eE-nri" secondAttribute="top" constant="10" id="SWr-TX-5hh"/>
79 74 <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="2Pj-Ux-aqd" secondAttribute="trailing" constant="20" symbolic="YES" id="k19-Pj-S17"/>
80   - <constraint firstAttribute="trailing" secondItem="RJ2-NP-DNZ" secondAttribute="trailing" id="kt1-Cj-ldP"/>
81   - <constraint firstAttribute="bottom" secondItem="RJ2-NP-DNZ" secondAttribute="bottom" id="oGz-vP-Jcg"/>
82 75 <constraint firstItem="VqB-il-dfx" firstAttribute="top" secondItem="8hE-eE-nri" secondAttribute="top" constant="10" id="vBE-rf-4b9"/>
83 76 <constraint firstItem="2Pj-Ux-aqd" firstAttribute="leading" secondItem="8hE-eE-nri" secondAttribute="centerX" constant="50" id="w8g-zR-VZj"/>
84 77 </constraints>
... ... @@ -97,9 +90,6 @@
97 90 <constraint firstAttribute="bottom" secondItem="8hE-eE-nri" secondAttribute="bottom" id="jpA-IM-rG5"/>
98 91 </constraints>
99 92 </tableViewCellContentView>
100   - <connections>
101   - <outlet property="lineChartView" destination="RJ2-NP-DNZ" id="8HI-zl-yxp"/>
102   - </connections>
103 93 </tableViewCell>
104 94 </objects>
105 95 </document>
... ...
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/LineChartView.swift
... ... @@ -18,6 +18,8 @@ class LineChartView: UIView {
18 18 private let xCount = 5
19 19 //最大绩点分数
20 20 private let GPA = 5
  21 + //横坐标间隔高度
  22 + private var yCellHeight : CGFloat = 0
21 23 //储存横纵坐标,画线用
22 24 private var xCenterArr = Array<CGFloat>()
23 25 private var yCenterArr = Array<CGFloat>()
... ... @@ -33,11 +35,12 @@ class LineChartView: UIView {
33 35 private var dateArr = Array<Array<Int>>()
34 36 //显示的数字
35 37 var yLabArray = Array<UILabel>()
36   -
  38 +
37 39 override init(frame: CGRect) {
38 40 super.init(frame: frame)
39   - print("frame==\(frame)")
40   -
  41 + if !frame.isEmpty {
  42 + self.yCellHeight = self.bounds.size.height/(CGFloat(yCount)+1)
  43 + }
41 44 }
42 45 func drawUI(xLableArr:Array<String>?){
43 46  
... ... @@ -50,33 +53,33 @@ class LineChartView: UIView {
50 53 //设置纵坐标
51 54 private func drawY() {
52 55  
53   - let yHeight = (self.bounds.height-60)/CGFloat(yCount)
  56 + let yHeight = yCellHeight
54 57 for index in 0..<yCount{
55   - let yLab = UILabel.init(frame: CGRect.init(x: 10, y: CGFloat(index)*yHeight, width: 20, height: 20))
  58 + let yLab = UILabel.init(frame: CGRect.init(x: 20, y: CGFloat(index)*yHeight, width: 20, height: 20))
56 59 yLab.text = "\(GPA-index)"
57 60 yLab.textColor = UIColorWithRGB(R: 119, G: 119, B: 119)
58 61 yLab.font = UIFont.systemFont(ofSize: 14)
59 62 self.addSubview(yLab)
60 63  
61   - let lineLab = UILabel.init(frame: CGRect.init(x: 30, y: yLab.center.y, width: screenWidth-60, height: 0.4))
  64 + let lineLab = UILabel.init(frame: CGRect.init(x: 40, y: yLab.center.y, width: self.bounds.size.width-80, height: 0.4))
62 65 lineLab.backgroundColor = UIColorWithRGB(R: 190, G: 190, B: 190)
63 66 self.addSubview(lineLab)
64 67  
65 68 yMoveLaArr.append(yLab)
66   - yCenterArr.append(yLab.frame.origin.y+10)
  69 + yCenterArr.append(lineLab.frame.origin.y)
67 70 }
68 71 }
69 72 //设置横坐标
70 73 private func drawX() {
71   - let xWidth = (screenWidth-20)/CGFloat(yCount)
  74 + let xWidth = (self.bounds.size.width)/CGFloat(yCount)
72 75 for index in 0..<xCount {
73   - let nameBtn = UIButton.init(frame: CGRect.init(x: xWidth+CGFloat(index)*xWidth, y: self.bounds.height-70, width: 40, height: 25))
  76 + let nameBtn = UIButton.init(frame: CGRect.init(x: xWidth+CGFloat(index)*xWidth, y: yCellHeight*6-10, width: 40, height: 30))
74 77 nameBtn.setTitle(xLabArr[index], for: UIControlState.normal)
75 78 nameBtn.setTitleColor(UIColorWithRGB(R: 119, G: 119, B: 119), for: UIControlState.normal)
76 79 nameBtn.titleLabel!.textAlignment = .center
77 80 nameBtn.titleLabel!.font = UIFont.systemFont(ofSize: 13)
78   -// nameBtn.backgroundColor = UIColor.orange
79 81 nameBtn.tag = index
  82 +// nameBtn.backgroundColor = UIColor.orange
80 83 self.addSubview(nameBtn)
81 84  
82 85 nameBtn.addTarget(self, action: #selector(touchXAction(tap:)), for: UIControlEvents.touchUpInside)
... ... @@ -89,12 +92,11 @@ class LineChartView: UIView {
89 92 func drawLine(point:Array<Int>,color:UIColor){
90 93  
91 94 let pointArr = swichPoint(arr: point)
92   -
93 95 let drawLayer = DrawLayer()
94 96 drawLayer.xPointArr = xCenterArr
95 97 drawLayer.yPointArr = [yCenterArr[pointArr[0]],yCenterArr[pointArr[1]],yCenterArr[pointArr[2]],yCenterArr[pointArr[3]],yCenterArr[pointArr[4]]]
96 98 drawLayer.bounds = self.bounds
97   - drawLayer.position = self.center
  99 + drawLayer.position = CGPoint.init(x: self.bounds.size.width/2, y: self.bounds.size.height/2)
98 100 drawLayer.lineColor = color
99 101 self.layer.addSublayer(drawLayer)
100 102 drawLayer.setNeedsDisplay()
... ... @@ -121,15 +123,15 @@ class LineChartView: UIView {
121 123 //X轴下划线
122 124 let movePath = CGMutablePath()
123 125 movePath.move(to: CGPoint.init(x: xCenterArr[index], y: yCenterArr[0]))
124   - movePath.addLine(to: CGPoint.init(x: xCenterArr[index], y: 10+5*(self.bounds.height-60)/CGFloat(yCount)))
  126 + movePath.addLine(to: CGPoint.init(x: xCenterArr[index], y: 10+5*(self.bounds.height/(CGFloat(yCount)+1))))
125 127 lineLayer.path = movePath
126 128  
127 129 xMoveLayer.strokeColor = UIColorWithRGB(R: 92, G: 145, B: 230).cgColor
128 130 xMoveLayer.lineWidth = 2
129 131 self.layer.addSublayer(xMoveLayer)
130 132 let movePath2 = CGMutablePath()
131   - movePath2.move(to: CGPoint.init(x: xCenterArr[index]-15, y: self.bounds.height-45))
132   - movePath2.addLine(to: CGPoint.init(x: xCenterArr[index]+15, y: self.bounds.height-45))
  133 + movePath2.move(to: CGPoint.init(x: xCenterArr[index]-15, y: yCellHeight*6+20))
  134 + movePath2.addLine(to: CGPoint.init(x: xCenterArr[index]+15, y: yCellHeight*6+20))
133 135 xMoveLayer.path = movePath2
134 136  
135 137 if yLabArray.count == dateArr.count {
... ... @@ -200,7 +202,6 @@ class DrawLayer: CALayer {
200 202  
201 203 for i in 0..<xPointArr.count {
202 204 context.fillEllipse(in: CGRect.init(x: xPointArr[i]-5, y: yPointArr[i]-5, width: 10, height: 10))
203   -
204 205 }
205 206 //折线
206 207 context.setStrokeColor(lineColor.cgColor)
... ...
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/MoralDetailCell.xib
... ... @@ -6,6 +6,7 @@
6 6 <dependencies>
7 7 <deployment identifier="iOS"/>
8 8 <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
  9 + <capability name="Alignment constraints with different attributes" minToolsVersion="5.1"/>
9 10 <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
10 11 </dependencies>
11 12 <objects>
... ... @@ -19,55 +20,55 @@
19 20 <autoresizingMask key="autoresizingMask"/>
20 21 <subviews>
21 22 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UBb-dh-88b">
22   - <rect key="frame" x="10" y="10" width="355" height="260.5"/>
  23 + <rect key="frame" x="10" y="10" width="355" height="261"/>
23 24 <subviews>
24 25 <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="moral_bg" translatesAutoresizingMaskIntoConstraints="NO" id="1gV-1s-gHe">
25   - <rect key="frame" x="0.0" y="0.0" width="355" height="260.5"/>
  26 + <rect key="frame" x="0.0" y="0.0" width="355" height="261"/>
26 27 </imageView>
27 28 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="德育得分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pNK-6b-MsE">
28   - <rect key="frame" x="40" y="15" width="61.5" height="18"/>
  29 + <rect key="frame" x="0.0" y="15" width="177" height="18"/>
29 30 <fontDescription key="fontDescription" type="system" pointSize="15"/>
30 31 <color key="textColor" red="0.050980392159999999" green="0.1647058824" blue="0.45882352939999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
31 32 <color key="highlightedColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
32 33 </label>
33 34 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="4.3分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9pn-Mt-3mm">
34   - <rect key="frame" x="34" y="48" width="75" height="36"/>
  35 + <rect key="frame" x="51.5" y="48" width="75" height="36"/>
35 36 <fontDescription key="fontDescription" type="system" pointSize="30"/>
36 37 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
37 38 <color key="highlightedColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
38 39 </label>
39 40 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="第三名" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DIr-ge-gbf">
40   - <rect key="frame" x="227" y="50" width="91" height="36"/>
  41 + <rect key="frame" x="220.5" y="50" width="91" height="36"/>
41 42 <fontDescription key="fontDescription" type="system" pointSize="30"/>
42 43 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
43 44 <nil key="highlightedColor"/>
44 45 </label>
45 46 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="同期上升1.1分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="J9G-OC-0Wu">
46   - <rect key="frame" x="24.5" y="104" width="93.5" height="18"/>
  47 + <rect key="frame" x="42.5" y="104" width="94" height="18"/>
47 48 <fontDescription key="fontDescription" type="system" pointSize="15"/>
48 49 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
49 50 <nil key="highlightedColor"/>
50 51 </label>
51 52 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="同期上升5名" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oaU-aV-pPx">
52   - <rect key="frame" x="229.5" y="106" width="86" height="18"/>
  53 + <rect key="frame" x="223.5" y="106" width="86" height="18"/>
53 54 <fontDescription key="fontDescription" type="system" pointSize="15"/>
54 55 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
55 56 <nil key="highlightedColor"/>
56 57 </label>
57 58 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="2018年03月03号" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Mz0-Fx-X1P">
58   - <rect key="frame" x="210" y="15" width="125" height="20"/>
  59 + <rect key="frame" x="177" y="15" width="178" height="20"/>
59 60 <fontDescription key="fontDescription" type="system" pointSize="16"/>
60 61 <color key="textColor" red="0.08235294118" green="0.39607843139999999" blue="0.75294117650000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
61 62 <color key="highlightedColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
62 63 </label>
63 64 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="高于平均分1.1分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="anx-4P-Hux">
64   - <rect key="frame" x="16.5" y="132" width="109" height="18"/>
  65 + <rect key="frame" x="34.5" y="132" width="109" height="18"/>
65 66 <fontDescription key="fontDescription" type="system" pointSize="15"/>
66 67 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
67 68 <nil key="highlightedColor"/>
68 69 </label>
69 70 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="高于平均排名1.1名" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CeX-B7-f6o">
70   - <rect key="frame" x="210.5" y="134" width="124" height="18"/>
  71 + <rect key="frame" x="204.5" y="134" width="124" height="18"/>
71 72 <fontDescription key="fontDescription" type="system" pointSize="15"/>
72 73 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
73 74 <nil key="highlightedColor"/>
... ... @@ -81,32 +82,44 @@
81 82 <color key="textColor" red="0.08235294118" green="0.39607843139999999" blue="0.75294117650000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
82 83 <nil key="highlightedColor"/>
83 84 </label>
  85 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="lbQ-AR-MQY">
  86 + <rect key="frame" x="177" y="-1" width="1" height="1"/>
  87 + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  88 + <constraints>
  89 + <constraint firstAttribute="height" constant="1" id="Xna-pd-OOn"/>
  90 + <constraint firstAttribute="width" constant="1" id="dFb-JU-J4K"/>
  91 + </constraints>
  92 + </view>
84 93 </subviews>
85 94 <color key="backgroundColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
86 95 <constraints>
87 96 <constraint firstItem="1gV-1s-gHe" firstAttribute="leading" secondItem="UBb-dh-88b" secondAttribute="leading" id="7Hd-yK-MLm"/>
88 97 <constraint firstItem="anx-4P-Hux" firstAttribute="top" secondItem="J9G-OC-0Wu" secondAttribute="bottom" constant="10" id="9FD-EM-rTI"/>
89 98 <constraint firstItem="9pn-Mt-3mm" firstAttribute="centerX" secondItem="pNK-6b-MsE" secondAttribute="centerX" id="AnT-t2-Vaz"/>
90   - <constraint firstItem="Mz0-Fx-X1P" firstAttribute="trailing" secondItem="UBb-dh-88b" secondAttribute="trailing" constant="-20" id="DUF-fk-aMY"/>
91 99 <constraint firstItem="Wkw-bn-xrx" firstAttribute="top" secondItem="anx-4P-Hux" secondAttribute="bottom" constant="20" id="Gcq-Dr-wY8"/>
92 100 <constraint firstItem="oaU-aV-pPx" firstAttribute="top" secondItem="DIr-ge-gbf" secondAttribute="bottom" constant="20" id="I4a-rl-CwG"/>
93 101 <constraint firstItem="J9G-OC-0Wu" firstAttribute="centerX" secondItem="9pn-Mt-3mm" secondAttribute="centerX" id="ILE-XR-PgX"/>
94 102 <constraint firstItem="9pn-Mt-3mm" firstAttribute="top" secondItem="pNK-6b-MsE" secondAttribute="bottom" constant="15" id="JcF-eO-1Tf"/>
  103 + <constraint firstItem="Mz0-Fx-X1P" firstAttribute="leading" secondItem="lbQ-AR-MQY" secondAttribute="leading" id="MS0-9w-Uvm"/>
95 104 <constraint firstItem="anx-4P-Hux" firstAttribute="centerX" secondItem="9pn-Mt-3mm" secondAttribute="centerX" id="N8e-Tq-OFC"/>
96 105 <constraint firstItem="DIr-ge-gbf" firstAttribute="centerX" secondItem="Mz0-Fx-X1P" secondAttribute="centerX" id="PeQ-3p-wPu"/>
97 106 <constraint firstItem="DIr-ge-gbf" firstAttribute="top" secondItem="Mz0-Fx-X1P" secondAttribute="bottom" constant="15" id="QlN-Um-QRE"/>
98 107 <constraint firstItem="CeX-B7-f6o" firstAttribute="centerX" secondItem="DIr-ge-gbf" secondAttribute="centerX" id="S5f-mc-kLf"/>
  108 + <constraint firstItem="lbQ-AR-MQY" firstAttribute="centerX" secondItem="pNK-6b-MsE" secondAttribute="trailing" id="Vg2-k6-E6F"/>
  109 + <constraint firstItem="pNK-6b-MsE" firstAttribute="leading" secondItem="UBb-dh-88b" secondAttribute="leading" id="VkM-DG-kJc"/>
99 110 <constraint firstAttribute="bottom" secondItem="1gV-1s-gHe" secondAttribute="bottom" id="WmH-Yr-1VA"/>
100 111 <constraint firstAttribute="trailing" secondItem="1gV-1s-gHe" secondAttribute="trailing" id="Yrr-Y6-K8b"/>
101 112 <constraint firstItem="CeX-B7-f6o" firstAttribute="top" secondItem="oaU-aV-pPx" secondAttribute="bottom" constant="10" id="bAv-aS-0Ml"/>
  113 + <constraint firstItem="lbQ-AR-MQY" firstAttribute="bottom" secondItem="UBb-dh-88b" secondAttribute="top" id="cTo-iD-BdK"/>
102 114 <constraint firstItem="oaU-aV-pPx" firstAttribute="centerX" secondItem="DIr-ge-gbf" secondAttribute="centerX" id="dQ5-qu-b7Z"/>
103 115 <constraint firstItem="pNK-6b-MsE" firstAttribute="top" secondItem="UBb-dh-88b" secondAttribute="top" constant="15" id="fIQ-aq-1Q2"/>
104 116 <constraint firstAttribute="trailing" secondItem="Wkw-bn-xrx" secondAttribute="trailing" constant="20" id="ikn-5j-7Yc"/>
105   - <constraint firstItem="pNK-6b-MsE" firstAttribute="leading" secondItem="UBb-dh-88b" secondAttribute="leading" constant="40" id="ipG-Xz-pen"/>
106 117 <constraint firstItem="J9G-OC-0Wu" firstAttribute="top" secondItem="9pn-Mt-3mm" secondAttribute="bottom" constant="20" id="n4e-bY-kc9"/>
107 118 <constraint firstItem="Wkw-bn-xrx" firstAttribute="leading" secondItem="UBb-dh-88b" secondAttribute="leading" constant="20" id="njK-jj-BrM"/>
  119 + <constraint firstItem="lbQ-AR-MQY" firstAttribute="centerX" secondItem="UBb-dh-88b" secondAttribute="centerX" id="pud-lO-4OH"/>
108 120 <constraint firstItem="1gV-1s-gHe" firstAttribute="top" secondItem="UBb-dh-88b" secondAttribute="top" id="r0a-Sd-FcU"/>
109 121 <constraint firstItem="Mz0-Fx-X1P" firstAttribute="top" secondItem="UBb-dh-88b" secondAttribute="top" constant="15" id="s6T-Ua-Fvo"/>
  122 + <constraint firstAttribute="trailing" secondItem="Mz0-Fx-X1P" secondAttribute="trailing" id="z8n-O1-c5F"/>
110 123 </constraints>
111 124 <userDefinedRuntimeAttributes>
112 125 <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
... ...
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/MoralTableViewCell.xib
... ... @@ -6,7 +6,6 @@
6 6 <dependencies>
7 7 <deployment identifier="iOS"/>
8 8 <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
9   - <capability name="Alignment constraints with different attributes" minToolsVersion="5.1"/>
10 9 <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
11 10 </dependencies>
12 11 <objects>
... ... @@ -36,25 +35,25 @@
36 35 <color key="highlightedColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
37 36 </label>
38 37 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="4.3分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="j0A-jN-fqh">
39   - <rect key="frame" x="42.5" y="60" width="75" height="36"/>
  38 + <rect key="frame" x="0.0" y="60" width="177" height="36"/>
40 39 <fontDescription key="fontDescription" type="system" pointSize="30"/>
41 40 <color key="textColor" red="0.19058823590000001" green="0.6052491069" blue="0.92507088179999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
42 41 <color key="highlightedColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
43 42 </label>
44 43 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="第三名" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8d1-dG-Pi6">
45   - <rect key="frame" x="229.5" y="60" width="91" height="36"/>
  44 + <rect key="frame" x="177" y="60" width="178" height="36"/>
46 45 <fontDescription key="fontDescription" type="system" pointSize="30"/>
47 46 <color key="textColor" red="0.1980733871" green="0.57266002890000001" blue="0.92558294529999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
48 47 <nil key="highlightedColor"/>
49 48 </label>
50 49 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="获得 A- 评分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2GV-uC-noJ">
51   - <rect key="frame" x="29" y="136" width="102.5" height="21.5"/>
  50 + <rect key="frame" x="38" y="136" width="102.5" height="21.5"/>
52 51 <fontDescription key="fontDescription" type="system" pointSize="18"/>
53 52 <color key="textColor" red="0.1980733871" green="0.57266002890000001" blue="0.92558294529999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
54 53 <nil key="highlightedColor"/>
55 54 </label>
56 55 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="名次上升1名" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="L60-yA-m2f">
57   - <rect key="frame" x="225" y="136" width="100" height="21.5"/>
  56 + <rect key="frame" x="216" y="136" width="100" height="21.5"/>
58 57 <fontDescription key="fontDescription" type="system" pointSize="18"/>
59 58 <color key="textColor" red="0.1980733871" green="0.57266002890000001" blue="0.92558294529999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
60 59 <nil key="highlightedColor"/>
... ... @@ -68,26 +67,39 @@
68 67 <color key="textColor" red="0.091986544429999997" green="0.17189717290000001" blue="0.63014686109999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
69 68 <nil key="highlightedColor"/>
70 69 </label>
  70 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cJw-CI-3DA">
  71 + <rect key="frame" x="177" y="134.5" width="1" height="1"/>
  72 + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  73 + <constraints>
  74 + <constraint firstAttribute="height" constant="1" id="Xjs-Yt-RTC"/>
  75 + <constraint firstAttribute="width" constant="1" id="ur8-61-C3p"/>
  76 + </constraints>
  77 + </view>
71 78 </subviews>
72 79 <color key="backgroundColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
73 80 <constraints>
  81 + <constraint firstItem="cJw-CI-3DA" firstAttribute="centerY" secondItem="Vef-nQ-dGv" secondAttribute="centerY" id="3Pr-4U-nTn"/>
74 82 <constraint firstItem="cKf-6S-lhj" firstAttribute="centerY" secondItem="aWL-Tx-0UW" secondAttribute="centerY" id="5mN-fH-D4I"/>
75 83 <constraint firstItem="j0A-jN-fqh" firstAttribute="top" secondItem="Vef-nQ-dGv" secondAttribute="top" constant="60" id="96O-AW-As9"/>
76 84 <constraint firstItem="aWL-Tx-0UW" firstAttribute="leading" secondItem="Vef-nQ-dGv" secondAttribute="leading" id="BYt-px-Cjn"/>
77   - <constraint firstItem="8d1-dG-Pi6" firstAttribute="centerX" secondItem="Vef-nQ-dGv" secondAttribute="trailing" constant="-80" id="DUf-vl-R8M"/>
  85 + <constraint firstItem="j0A-jN-fqh" firstAttribute="leading" secondItem="Vef-nQ-dGv" secondAttribute="leading" id="CSz-vX-K1Y"/>
  86 + <constraint firstItem="cJw-CI-3DA" firstAttribute="centerX" secondItem="Vef-nQ-dGv" secondAttribute="centerX" id="Igi-Zf-6RJ"/>
78 87 <constraint firstItem="2GV-uC-noJ" firstAttribute="centerX" secondItem="j0A-jN-fqh" secondAttribute="centerX" id="LGc-Jp-07j"/>
79 88 <constraint firstItem="L60-yA-m2f" firstAttribute="top" secondItem="8d1-dG-Pi6" secondAttribute="bottom" constant="40" id="MaK-uL-fPP"/>
80 89 <constraint firstItem="2GV-uC-noJ" firstAttribute="top" secondItem="j0A-jN-fqh" secondAttribute="bottom" constant="40" id="Ryr-Gh-VGZ"/>
81 90 <constraint firstItem="8d1-dG-Pi6" firstAttribute="top" secondItem="Vef-nQ-dGv" secondAttribute="top" constant="60" id="SsE-55-O6O"/>
82   - <constraint firstItem="j0A-jN-fqh" firstAttribute="centerX" secondItem="Vef-nQ-dGv" secondAttribute="leading" constant="80" id="WBT-bt-FLd"/>
  91 + <constraint firstItem="8d1-dG-Pi6" firstAttribute="leading" secondItem="cJw-CI-3DA" secondAttribute="trailing" constant="-1" id="TLG-Jg-bYT"/>
  92 + <constraint firstItem="j0A-jN-fqh" firstAttribute="trailing" secondItem="cJw-CI-3DA" secondAttribute="leading" id="WBT-bt-FLd"/>
83 93 <constraint firstAttribute="bottom" secondItem="9Ae-se-wQu" secondAttribute="bottom" constant="30" id="YNw-rs-gHW"/>
84 94 <constraint firstItem="L60-yA-m2f" firstAttribute="centerX" secondItem="8d1-dG-Pi6" secondAttribute="centerX" id="a47-3Y-yeG"/>
85 95 <constraint firstAttribute="trailing" secondItem="9Ae-se-wQu" secondAttribute="trailing" constant="20" id="a9O-Jn-TPZ"/>
86 96 <constraint firstItem="aWL-Tx-0UW" firstAttribute="top" secondItem="Vef-nQ-dGv" secondAttribute="top" id="aiN-4Q-1yb"/>
87 97 <constraint firstAttribute="trailing" secondItem="aWL-Tx-0UW" secondAttribute="trailing" id="avu-SY-2Fa"/>
  98 + <constraint firstItem="8d1-dG-Pi6" firstAttribute="leading" secondItem="j0A-jN-fqh" secondAttribute="trailing" id="dvm-xj-rjO"/>
88 99 <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="cKf-6S-lhj" secondAttribute="trailing" constant="20" symbolic="YES" id="g1h-6M-v2g"/>
89 100 <constraint firstItem="9Ae-se-wQu" firstAttribute="leading" secondItem="Vef-nQ-dGv" secondAttribute="leading" constant="20" id="jZW-7n-dLT"/>
90 101 <constraint firstItem="cKf-6S-lhj" firstAttribute="leading" secondItem="Vef-nQ-dGv" secondAttribute="leading" constant="15" id="ube-1E-bnY"/>
  102 + <constraint firstAttribute="trailing" secondItem="8d1-dG-Pi6" secondAttribute="trailing" id="xNb-PU-QRm"/>
91 103 </constraints>
92 104 <userDefinedRuntimeAttributes>
93 105 <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
... ...
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneMiddleCell.swift
... ... @@ -9,8 +9,6 @@
9 9 import UIKit
10 10  
11 11 class SceneMiddleCell: UITableViewCell {
12   -
13   - @IBOutlet weak var lineChartView: UIView!
14 12  
15 13 var customLineChart = LineChartView()
16 14 override func awakeFromNib() {
... ... @@ -18,7 +16,7 @@ class SceneMiddleCell: UITableViewCell {
18 16 self.backgroundColor = backgroundColor
19 17  
20 18 // Initialization code
21   - let rect = self.lineChartView.bounds
  19 + let rect = CGRect.init(x: 0, y: 60, width: screenWidth-20, height: self.bounds.size.height-60)
22 20 customLineChart = LineChartView.init(frame: rect)
23 21 let customXLabArr = ["03/12","03/13","03/14","03/15","03/16"]
24 22  
... ... @@ -33,7 +31,7 @@ class SceneMiddleCell: UITableViewCell {
33 31 customLineChart.drawLine(point: arr2, color: UIColorWithRGB(R: 92, G: 145, B: 230))
34 32 customLineChart.drawLine(point: arr3, color: UIColorWithRGB(R: 255, G: 213, B: 79))
35 33  
36   - self.lineChartView.addSubview(customLineChart)
  34 + self.addSubview(customLineChart)
37 35  
38 36 }
39 37  
... ...
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneMiddleCell.xib
... ... @@ -22,10 +22,6 @@
22 22 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UP8-EA-Pvf">
23 23 <rect key="frame" x="10" y="10" width="355" height="290"/>
24 24 <subviews>
25   - <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="EX8-hi-C7V">
26   - <rect key="frame" x="0.0" y="50" width="355" height="230"/>
27   - <color key="backgroundColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
28   - </view>
29 25 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Euo-rc-pzV">
30 26 <rect key="frame" x="0.0" y="5" width="355" height="40"/>
31 27 <subviews>
... ... @@ -112,11 +108,7 @@
112 108 <constraints>
113 109 <constraint firstItem="Euo-rc-pzV" firstAttribute="top" secondItem="UP8-EA-Pvf" secondAttribute="top" constant="5" id="2B8-aB-sus"/>
114 110 <constraint firstAttribute="trailing" secondItem="Euo-rc-pzV" secondAttribute="trailing" id="2xB-Rs-xQX"/>
115   - <constraint firstItem="EX8-hi-C7V" firstAttribute="top" secondItem="Euo-rc-pzV" secondAttribute="bottom" constant="5" id="7BK-xg-bOp"/>
116 111 <constraint firstItem="Euo-rc-pzV" firstAttribute="leading" secondItem="UP8-EA-Pvf" secondAttribute="leading" id="8rG-CN-KBe"/>
117   - <constraint firstAttribute="trailing" secondItem="EX8-hi-C7V" secondAttribute="trailing" id="GO7-C2-oIL"/>
118   - <constraint firstAttribute="bottom" secondItem="EX8-hi-C7V" secondAttribute="bottom" constant="10" id="IQA-zR-tk4"/>
119   - <constraint firstItem="EX8-hi-C7V" firstAttribute="leading" secondItem="UP8-EA-Pvf" secondAttribute="leading" id="nGt-3M-965"/>
120 112 </constraints>
121 113 <userDefinedRuntimeAttributes>
122 114 <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
... ... @@ -133,9 +125,6 @@
133 125 <constraint firstAttribute="bottom" secondItem="UP8-EA-Pvf" secondAttribute="bottom" id="hhO-9X-73m"/>
134 126 </constraints>
135 127 </tableViewCellContentView>
136   - <connections>
137   - <outlet property="lineChartView" destination="EX8-hi-C7V" id="vtG-wv-efK"/>
138   - </connections>
139 128 </tableViewCell>
140 129 </objects>
141 130 </document>
... ...
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneTopCell.xib
... ... @@ -6,7 +6,7 @@
6 6 <dependencies>
7 7 <deployment identifier="iOS"/>
8 8 <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
9   - <capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
  9 + <capability name="Alignment constraints with different attributes" minToolsVersion="5.1"/>
10 10 <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
11 11 </dependencies>
12 12 <objects>
... ... @@ -23,45 +23,40 @@
23 23 <rect key="frame" x="10" y="10" width="355" height="240"/>
24 24 <subviews>
25 25 <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="report_teacher" translatesAutoresizingMaskIntoConstraints="NO" id="0kV-Bn-EIO">
26   - <rect key="frame" x="20" y="20" width="127" height="192"/>
27   - <constraints>
28   - <constraint firstAttribute="width" secondItem="0kV-Bn-EIO" secondAttribute="height" multiplier="127:192" id="CuM-VD-Mgs"/>
29   - <constraint firstAttribute="width" constant="127" id="LeU-PR-uoB"/>
30   - <constraint firstAttribute="height" constant="192" id="iMM-Kj-jq5"/>
31   - </constraints>
  26 + <rect key="frame" x="20" y="20" width="137.5" height="200"/>
32 27 </imageView>
33 28 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="文明礼仪" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fRm-iU-0FL">
34   - <rect key="frame" x="167" y="15" width="73.5" height="21.5"/>
  29 + <rect key="frame" x="177.5" y="20" width="73.5" height="21.5"/>
35 30 <fontDescription key="fontDescription" type="system" pointSize="18"/>
36 31 <color key="textColor" red="0.08235294118" green="0.39607843139999999" blue="0.75294117650000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
37 32 <nil key="highlightedColor"/>
38 33 </label>
39 34 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="得分: 85 分" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YFd-xW-bAd">
40   - <rect key="frame" x="167" y="45" width="91.5" height="21.5"/>
  35 + <rect key="frame" x="177.5" y="51.5" width="91.5" height="21.5"/>
41 36 <fontDescription key="fontDescription" type="system" pointSize="18"/>
42 37 <color key="textColor" red="0.45098039220000002" green="0.70980392160000005" blue="0.96078431369999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
43 38 <nil key="highlightedColor"/>
44 39 </label>
45 40 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="绩点: 4.3 分" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Mdz-WW-0e2">
46   - <rect key="frame" x="167" y="76.5" width="95.5" height="21.5"/>
  41 + <rect key="frame" x="177.5" y="83" width="95.5" height="21.5"/>
47 42 <fontDescription key="fontDescription" type="system" pointSize="18"/>
48 43 <color key="textColor" red="0.45098039220000002" green="0.70980392160000005" blue="0.96078431369999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
49 44 <nil key="highlightedColor"/>
50 45 </label>
51 46 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="等级: A-" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Q56-f5-Ki6">
52   - <rect key="frame" x="167" y="108" width="66" height="21.5"/>
  47 + <rect key="frame" x="177.5" y="114.5" width="66" height="21.5"/>
53 48 <fontDescription key="fontDescription" type="system" pointSize="18"/>
54 49 <color key="textColor" red="0.45098039220000002" green="0.70980392160000005" blue="0.96078431369999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
55 50 <nil key="highlightedColor"/>
56 51 </label>
57 52 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="指导意见:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="GHz-Xc-z3v">
58   - <rect key="frame" x="167" y="149.5" width="65.5" height="18"/>
  53 + <rect key="frame" x="177.5" y="146" width="65.5" height="18"/>
59 54 <fontDescription key="fontDescription" type="system" pointSize="15"/>
60 55 <color key="textColor" red="0.08235294118" green="0.30980392159999998" blue="0.70196078429999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
61 56 <nil key="highlightedColor"/>
62 57 </label>
63 58 <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" text="与上次相比有进步,保持文明礼仪,注意行为规范" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="DW2-7f-liU">
64   - <rect key="frame" x="162" y="167.5" width="183" height="62.5"/>
  59 + <rect key="frame" x="177.5" y="169" width="167.5" height="61"/>
65 60 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
66 61 <color key="textColor" red="0.08235294118" green="0.30980392159999998" blue="0.70196078429999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
67 62 <fontDescription key="fontDescription" type="system" pointSize="12"/>
... ... @@ -70,27 +65,24 @@
70 65 </subviews>
71 66 <color key="backgroundColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
72 67 <constraints>
73   - <constraint firstItem="Mdz-WW-0e2" firstAttribute="top" secondItem="YFd-xW-bAd" secondAttribute="bottom" constant="10" id="1aS-1q-3rl"/>
74   - <constraint firstItem="YFd-xW-bAd" firstAttribute="leading" secondItem="fRm-iU-0FL" secondAttribute="leading" id="Btj-Lq-PNu"/>
75   - <constraint firstItem="GHz-Xc-z3v" firstAttribute="leading" secondItem="fRm-iU-0FL" secondAttribute="leading" id="DPe-Lj-kLt"/>
76   - <constraint firstItem="0kV-Bn-EIO" firstAttribute="leading" secondItem="Qt1-rh-kBe" secondAttribute="leading" constant="20" id="ENN-nr-sIL"/>
77   - <constraint firstItem="YFd-xW-bAd" firstAttribute="top" secondItem="fRm-iU-0FL" secondAttribute="top" constant="30" id="HWr-gR-6xL"/>
78   - <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Mdz-WW-0e2" secondAttribute="trailing" constant="20" symbolic="YES" id="QVc-T2-fp7"/>
79   - <constraint firstAttribute="bottom" secondItem="DW2-7f-liU" secondAttribute="bottom" constant="10" id="R8u-sF-q0I"/>
80   - <constraint firstItem="0kV-Bn-EIO" firstAttribute="top" secondItem="Qt1-rh-kBe" secondAttribute="top" constant="20" id="T56-gW-qDD"/>
81   - <constraint firstAttribute="trailing" secondItem="DW2-7f-liU" secondAttribute="trailing" constant="10" id="UX4-8h-gEJ"/>
82   - <constraint firstItem="fRm-iU-0FL" firstAttribute="top" secondItem="Qt1-rh-kBe" secondAttribute="top" constant="15" id="V6B-9A-Zqc"/>
83   - <constraint firstItem="DW2-7f-liU" firstAttribute="leading" secondItem="0kV-Bn-EIO" secondAttribute="trailing" constant="15" id="Yjl-oR-nri"/>
84   - <constraint firstItem="fRm-iU-0FL" firstAttribute="leading" secondItem="0kV-Bn-EIO" secondAttribute="trailing" constant="20" id="ZSm-YT-5GG"/>
85   - <constraint firstItem="Q56-f5-Ki6" firstAttribute="top" secondItem="Mdz-WW-0e2" secondAttribute="bottom" constant="10" id="cjY-7W-lco"/>
86   - <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="fRm-iU-0FL" secondAttribute="trailing" constant="20" symbolic="YES" id="doC-AH-F5v"/>
87   - <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Q56-f5-Ki6" secondAttribute="trailing" constant="20" symbolic="YES" id="hze-Hn-z46"/>
88   - <constraint firstItem="Mdz-WW-0e2" firstAttribute="leading" secondItem="fRm-iU-0FL" secondAttribute="leading" id="j5J-0f-iTJ"/>
89   - <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="GHz-Xc-z3v" secondAttribute="trailing" constant="20" symbolic="YES" id="law-iT-HfB"/>
90   - <constraint firstItem="GHz-Xc-z3v" firstAttribute="top" secondItem="Q56-f5-Ki6" secondAttribute="bottom" constant="20" id="mce-jv-MW6"/>
91   - <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="YFd-xW-bAd" secondAttribute="trailing" constant="20" symbolic="YES" id="q17-sT-ycf"/>
92   - <constraint firstItem="Q56-f5-Ki6" firstAttribute="leading" secondItem="fRm-iU-0FL" secondAttribute="leading" id="rwH-Co-iSg"/>
93   - <constraint firstItem="DW2-7f-liU" firstAttribute="top" secondItem="GHz-Xc-z3v" secondAttribute="bottom" id="uwQ-WS-I1G"/>
  68 + <constraint firstItem="0kV-Bn-EIO" firstAttribute="leading" secondItem="Qt1-rh-kBe" secondAttribute="leading" constant="20" id="22f-sW-e0K"/>
  69 + <constraint firstItem="Q56-f5-Ki6" firstAttribute="top" secondItem="Mdz-WW-0e2" secondAttribute="bottom" constant="10" id="3M2-xb-Loy"/>
  70 + <constraint firstItem="GHz-Xc-z3v" firstAttribute="top" secondItem="Q56-f5-Ki6" secondAttribute="bottom" constant="10" id="Ajv-61-BoL"/>
  71 + <constraint firstItem="fRm-iU-0FL" firstAttribute="leading" secondItem="0kV-Bn-EIO" secondAttribute="trailing" constant="20" id="DR0-Dn-3Dn"/>
  72 + <constraint firstItem="YFd-xW-bAd" firstAttribute="leading" secondItem="fRm-iU-0FL" secondAttribute="leading" id="IB9-1Z-rbV"/>
  73 + <constraint firstItem="fRm-iU-0FL" firstAttribute="leading" secondItem="Qt1-rh-kBe" secondAttribute="centerX" id="K3a-RL-ADv"/>
  74 + <constraint firstItem="DW2-7f-liU" firstAttribute="top" secondItem="GHz-Xc-z3v" secondAttribute="bottom" constant="5" id="MI2-Ub-TBa"/>
  75 + <constraint firstItem="DW2-7f-liU" firstAttribute="leading" secondItem="Qt1-rh-kBe" secondAttribute="centerX" id="Q7d-LV-UEw"/>
  76 + <constraint firstItem="0kV-Bn-EIO" firstAttribute="top" secondItem="Qt1-rh-kBe" secondAttribute="top" constant="20" id="RFG-LA-ndp"/>
  77 + <constraint firstAttribute="bottom" secondItem="0kV-Bn-EIO" secondAttribute="bottom" constant="20" id="SlH-Q8-nOa"/>
  78 + <constraint firstItem="Q56-f5-Ki6" firstAttribute="leading" secondItem="fRm-iU-0FL" secondAttribute="leading" id="WBz-0O-usS"/>
  79 + <constraint firstItem="GHz-Xc-z3v" firstAttribute="leading" secondItem="Q56-f5-Ki6" secondAttribute="leading" id="bNc-fr-ElR"/>
  80 + <constraint firstItem="Mdz-WW-0e2" firstAttribute="leading" secondItem="fRm-iU-0FL" secondAttribute="leading" id="bkd-Lm-GcY"/>
  81 + <constraint firstAttribute="bottom" secondItem="DW2-7f-liU" secondAttribute="bottom" constant="10" id="fE7-Ju-xC8"/>
  82 + <constraint firstAttribute="trailing" secondItem="DW2-7f-liU" secondAttribute="trailing" constant="10" id="hSd-Fa-Cjl"/>
  83 + <constraint firstItem="YFd-xW-bAd" firstAttribute="top" secondItem="fRm-iU-0FL" secondAttribute="bottom" constant="10" id="i0b-MY-9qe"/>
  84 + <constraint firstItem="Mdz-WW-0e2" firstAttribute="top" secondItem="YFd-xW-bAd" secondAttribute="bottom" constant="10" id="qEY-Em-PTV"/>
  85 + <constraint firstItem="fRm-iU-0FL" firstAttribute="top" secondItem="Qt1-rh-kBe" secondAttribute="top" constant="20" id="sU8-eu-rZ2"/>
94 86 </constraints>
95 87 <userDefinedRuntimeAttributes>
96 88 <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
... ...
ParentAssistant/ParentAssistant/Classes/controllers/my/My.storyboard
... ... @@ -701,7 +701,7 @@
701 701 <nil key="highlightedColor"/>
702 702 </label>
703 703 <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入密码:6-16个字符" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="gCl-Eo-o16">
704   - <rect key="frame" x="8" y="15.5" width="359" height="19"/>
  704 + <rect key="frame" x="8" y="15.5" width="325" height="19"/>
705 705 <nil key="textColor"/>
706 706 <fontDescription key="fontDescription" type="system" pointSize="14"/>
707 707 <textInputTraits key="textInputTraits" keyboardType="numbersAndPunctuation" returnKeyType="done" secureTextEntry="YES"/>
... ... @@ -736,7 +736,7 @@
736 736 <constraint firstItem="hJh-bv-QHJ" firstAttribute="leading" secondItem="ZzP-2M-6De" secondAttribute="leading" constant="8" id="7yX-1H-WJI"/>
737 737 <constraint firstItem="gCl-Eo-o16" firstAttribute="leading" secondItem="ZzP-2M-6De" secondAttribute="leading" constant="8" id="VJU-f4-B9i"/>
738 738 <constraint firstItem="gCl-Eo-o16" firstAttribute="centerY" secondItem="ZzP-2M-6De" secondAttribute="centerY" id="fOp-xR-BIv"/>
739   - <constraint firstItem="gCl-Eo-o16" firstAttribute="centerX" secondItem="ZzP-2M-6De" secondAttribute="centerX" id="lLM-KQ-8r7"/>
  739 + <constraint firstItem="LZQ-J0-sNe" firstAttribute="leading" secondItem="gCl-Eo-o16" secondAttribute="trailing" constant="5" id="oe6-Yk-iHm"/>
740 740 <constraint firstAttribute="trailing" secondItem="LZQ-J0-sNe" secondAttribute="trailing" constant="10" id="ylc-el-X0w"/>
741 741 </constraints>
742 742 </tableViewCellContentView>
... ...
ParentAssistant/ParentAssistant/Classes/util/network.swift
... ... @@ -8,6 +8,7 @@
8 8  
9 9 import Foundation
10 10 import Alamofire
  11 +import AlamofireImage
11 12 //http工具
12 13 final class KHttp{
13 14 private static func http(method:HTTPMethod,url:String,parameters: [String: AnyObject]? = nil,encoding: ParameterEncoding = URLEncoding.default,headers:[String: String]?=nil,completionHandler: @escaping (String?, NSError?) -> ()){
... ... @@ -287,3 +288,28 @@ func httpJsonResule(jsonString:String?,error:NSError?,successHandler:(JSON)-&gt;Voi
287 288 }
288 289 }
289 290 }
  291 +
  292 +// MARK: - 对UIImageView的网络加载图片扩展
  293 +extension UIImageView {
  294 +
  295 + /// 网络加载图片
  296 + ///
  297 + /// - Parameters:
  298 + /// - urlStr: 图片网络地址字符串
  299 + /// - placeholder: 默认替代图片
  300 + func setImageWithUrl(urlStr:String,placeholder:String?) {
  301 + if !(urlStr.isEmpty){
  302 + let imageUrl = URL.init(string: urlStr)
  303 + if placeholder == nil {
  304 + self.af_setImage(withURL: imageUrl!)
  305 + }else{
  306 + self.af_setImage(withURL: imageUrl!, placeholderImage: UIImage.init(named: placeholder!))
  307 + }
  308 + }else{
  309 + if let image = placeholder {
  310 + self.image = UIImage.init(named: image)
  311 + }
  312 + }
  313 + }
  314 +}
  315 +
... ...
ParentAssistant/ParentAssistant/Classes/util/utils.swift
... ... @@ -9,6 +9,7 @@
9 9 import UIKit
10 10 import QuickLook
11 11 import Photos
  12 +
12 13 //MARK: - 服务器和log打印设置
13 14 class Debug{
14 15 static let enable=false//是否打印log
... ... @@ -589,6 +590,7 @@ extension UIViewController{
589 590 }
590 591 }
591 592  
  593 +
592 594 func getPercentEncodingString(str:String) -> String {
593 595 return String(describing: str.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)
594 596 }
... ...
ParentAssistant/ParentAssistant/Supporting Files/Assets.xcassets/report/program_loadfail.imageset/Contents.json 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "idiom" : "universal",
  9 + "filename" : "program_loadfail@2x.png",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "version" : 1,
  19 + "author" : "xcode"
  20 + }
  21 +}
0 22 \ No newline at end of file
... ...
ParentAssistant/ParentAssistant/Supporting Files/Assets.xcassets/report/program_loadfail.imageset/program_loadfail@2x.png 0 → 100644

74.5 KB

ParentAssistant/Podfile
... ... @@ -5,7 +5,8 @@ inhibit_all_warnings!
5 5 target 'ParentAssistant' do
6 6  
7 7 pod 'HandyJSON', '~> 4.1.1'
8   - pod 'Alamofire','~>4.0.1'
  8 + pod 'Alamofire','~>4.7.2'
  9 + pod 'AlamofireImage','~> 3.3.1'
9 10 pod 'SDWebImage','~>3.8.2'
10 11 pod 'Toast','~>3.1.0'
11 12 pod 'XRCarouselView','~>2.5.6'
... ... @@ -18,5 +19,4 @@ target &#39;ParentAssistant&#39; do
18 19 pod 'SVProgressHUD','~>2.2.5'
19 20 pod 'NIMSDK_LITE','~>4.9.0'
20 21 pod 'SwiftHash','~>2.0.1'
21   -
22 22 end
... ...
ParentAssistant/Podfile.lock
1 1 PODS:
2   - - Alamofire (4.0.1)
  2 + - Alamofire (4.7.2)
  3 + - AlamofireImage (3.3.1):
  4 + - Alamofire (~> 4.5)
3 5 - DZNEmptyDataSet (1.8.1)
4 6 - HandyJSON (4.1.1)
5 7 - NIMSDK_LITE (4.9.0)
... ... @@ -19,7 +21,8 @@ PODS:
19 21 - XRCarouselView (2.5.6)
20 22  
21 23 DEPENDENCIES:
22   - - Alamofire (~> 4.0.1)
  24 + - Alamofire (~> 4.7.2)
  25 + - AlamofireImage (~> 3.3.1)
23 26 - DZNEmptyDataSet (~> 1.8.1)
24 27 - HandyJSON (~> 4.1.1)
25 28 - NIMSDK_LITE (~> 4.9.0)
... ... @@ -35,7 +38,8 @@ DEPENDENCIES:
35 38 - XRCarouselView (~> 2.5.6)
36 39  
37 40 SPEC CHECKSUMS:
38   - Alamofire: 7682d43245de14874acd142ec137b144aa1dd335
  41 + Alamofire: e4fa87002c137ba2d8d634d2c51fabcda0d5c223
  42 + AlamofireImage: 3b35b586853abaf94ca1250f4e94cff3c21a4c0d
39 43 DZNEmptyDataSet: 9525833b9e68ac21c30253e1d3d7076cc828eaa7
40 44 HandyJSON: 3a3de917c4118767ffe41c29b5acba23409649f4
41 45 NIMSDK_LITE: a69a019544299a1b597db6ebf98927f5e12fa17c
... ... @@ -50,6 +54,6 @@ SPEC CHECKSUMS:
50 54 UMCSecurityPlugins: 0831a08f3988f3cea9f1d3a7626cd9bee4fef150
51 55 XRCarouselView: 52529f924d26ee4787f9bd958150800b73e60922
52 56  
53   -PODFILE CHECKSUM: ef5a2eedc2a762110d9f7458ad01512ced09aba0
  57 +PODFILE CHECKSUM: fb172574c836b57e7c792807c655a091aff17050
54 58  
55 59 COCOAPODS: 1.4.0
... ...
ParentAssistant/Pods/Alamofire/LICENSE
1   -Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  1 +Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
2 2  
3 3 Permission is hereby granted, free of charge, to any person obtaining a copy
4 4 of this software and associated documentation files (the "Software"), to deal
... ...
ParentAssistant/Pods/Alamofire/README.md
1   -![Alamofire: Elegant Networking in Swift](https://raw.githubusercontent.com/Alamofire/Alamofire/assets/alamofire.png)
  1 +![Alamofire: Elegant Networking in Swift](https://raw.githubusercontent.com/Alamofire/Alamofire/master/alamofire.png)
2 2  
3 3 [![Build Status](https://travis-ci.org/Alamofire/Alamofire.svg?branch=master)](https://travis-ci.org/Alamofire/Alamofire)
4 4 [![CocoaPods Compatible](https://img.shields.io/cocoapods/v/Alamofire.svg)](https://img.shields.io/cocoapods/v/Alamofire.svg)
5 5 [![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
6   -[![Platform](https://img.shields.io/cocoapods/p/Alamofire.svg?style=flat)](http://cocoadocs.org/docsets/Alamofire)
  6 +[![Platform](https://img.shields.io/cocoapods/p/Alamofire.svg?style=flat)](https://alamofire.github.io/Alamofire)
7 7 [![Twitter](https://img.shields.io/badge/twitter-@AlamofireSF-blue.svg?style=flat)](http://twitter.com/AlamofireSF)
  8 +[![Gitter](https://badges.gitter.im/Alamofire/Alamofire.svg)](https://gitter.im/Alamofire/Alamofire?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
8 9  
9 10 Alamofire is an HTTP networking library written in Swift.
10 11  
... ... @@ -14,16 +15,16 @@ Alamofire is an HTTP networking library written in Swift.
14 15 - [Migration Guides](#migration-guides)
15 16 - [Communication](#communication)
16 17 - [Installation](#installation)
17   -- [Usage](#usage)
18   - - **Intro -** [Making a Request](#making-a-request), [Response Handling](#response-handling), [Response Validation](#response-validation), [Response Caching](#response-caching)
19   - - **HTTP -** [HTTP Methods](#http-methods), [Parameter Encoding](#parameter-encoding), [HTTP Headers](#http-headers), [Authentication](#authentication)
20   - - **Large Data -** [Downloading Data to a File](#downloading-data-to-a-file), [Uploading Data to a Server](#uploading-data-to-a-server)
21   - - **Tools -** [Statistical Metrics](#statistical-metrics), [cURL Command Output](#curl-command-output)
22   -- [Advanced Usage](#advanced-usage)
23   - - **URL Session -** [Session Manager](#session-manager), [Session Delegate](#session-delegate), [Request](#request)
24   - - **Routing -** [Routing Requests](#routing-requests), [Adapting and Retrying Requests](#adapting-and-retrying-requests)
25   - - **Model Objects -** [Custom Response Serialization](#custom-response-serialization)
26   - - **Connection -** [Security](#security), [Network Reachability](#network-reachability)
  18 +- [Usage](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md)
  19 + - **Intro -** [Making a Request](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#making-a-request), [Response Handling](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-handling), [Response Validation](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-validation), [Response Caching](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-caching)
  20 + - **HTTP -** [HTTP Methods](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#http-methods), [Parameter Encoding](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#parameter-encoding), [HTTP Headers](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#http-headers), [Authentication](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#authentication)
  21 + - **Large Data -** [Downloading Data to a File](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#downloading-data-to-a-file), [Uploading Data to a Server](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#uploading-data-to-a-server)
  22 + - **Tools -** [Statistical Metrics](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#statistical-metrics), [cURL Command Output](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#curl-command-output)
  23 +- [Advanced Usage](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md)
  24 + - **URL Session -** [Session Manager](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#session-manager), [Session Delegate](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#session-delegate), [Request](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#request)
  25 + - **Routing -** [Routing Requests](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#routing-requests), [Adapting and Retrying Requests](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#adapting-and-retrying-requests)
  26 + - **Model Objects -** [Custom Response Serialization](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#custom-response-serialization)
  27 + - **Connection -** [Security](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#security), [Network Reachability](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#network-reachability)
27 28 - [Open Radars](#open-radars)
28 29 - [FAQ](#faq)
29 30 - [Credits](#credits)
... ... @@ -44,7 +45,7 @@ Alamofire is an HTTP networking library written in Swift.
44 45 - [x] TLS Certificate and Public Key Pinning
45 46 - [x] Network Reachability
46 47 - [x] Comprehensive Unit and Integration Test Coverage
47   -- [x] [Complete Documentation](http://cocoadocs.org/docsets/Alamofire)
  48 +- [x] [Complete Documentation](https://alamofire.github.io/Alamofire)
48 49  
49 50 ## Component Libraries
50 51  
... ... @@ -55,9 +56,9 @@ In order to keep Alamofire focused specifically on core networking implementatio
55 56  
56 57 ## Requirements
57 58  
58   -- iOS 9.0+ / macOS 10.11+ / tvOS 9.0+ / watchOS 2.0+
59   -- Xcode 8.0+
60   -- Swift 3.0+
  59 +- iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+
  60 +- Xcode 8.3+
  61 +- Swift 3.1+
61 62  
62 63 ## Migration Guides
63 64  
... ... @@ -83,7 +84,7 @@ In order to keep Alamofire focused specifically on core networking implementatio
83 84 $ gem install cocoapods
84 85 ```
85 86  
86   -> CocoaPods 1.1.0+ is required to build Alamofire 4.0.0+.
  87 +> CocoaPods 1.1+ is required to build Alamofire 4.0+.
87 88  
88 89 To integrate Alamofire into your Xcode project using CocoaPods, specify it in your `Podfile`:
89 90  
... ... @@ -93,7 +94,7 @@ platform :ios, &#39;10.0&#39;
93 94 use_frameworks!
94 95  
95 96 target '<Your Target Name>' do
96   - pod 'Alamofire', '~> 4.0'
  97 + pod 'Alamofire', '~> 4.7'
97 98 end
98 99 ```
99 100  
... ... @@ -117,1591 +118,85 @@ $ brew install carthage
117 118 To integrate Alamofire into your Xcode project using Carthage, specify it in your `Cartfile`:
118 119  
119 120 ```ogdl
120   -github "Alamofire/Alamofire" ~> 4.0
  121 +github "Alamofire/Alamofire" ~> 4.7
121 122 ```
122 123  
123 124 Run `carthage update` to build the framework and drag the built `Alamofire.framework` into your Xcode project.
124 125  
125   -### Manually
126   -
127   -If you prefer not to use either of the aforementioned dependency managers, you can integrate Alamofire into your project manually.
128   -
129   -#### Embedded Framework
130   -
131   -- Open up Terminal, `cd` into your top-level project directory, and run the following command "if" your project is not initialized as a git repository:
132   -
133   -```bash
134   -$ git init
135   -```
136   -
137   -- Add Alamofire as a git [submodule](http://git-scm.com/docs/git-submodule) by running the following command:
138   -
139   -```bash
140   -$ git submodule add https://github.com/Alamofire/Alamofire.git
141   -```
142   -
143   -- Open the new `Alamofire` folder, and drag the `Alamofire.xcodeproj` into the Project Navigator of your application's Xcode project.
144   -
145   - > It should appear nested underneath your application's blue project icon. Whether it is above or below all the other Xcode groups does not matter.
146   -
147   -- Select the `Alamofire.xcodeproj` in the Project Navigator and verify the deployment target matches that of your application target.
148   -- Next, select your application project in the Project Navigator (blue project icon) to navigate to the target configuration window and select the application target under the "Targets" heading in the sidebar.
149   -- In the tab bar at the top of that window, open the "General" panel.
150   -- Click on the `+` button under the "Embedded Binaries" section.
151   -- You will see two different `Alamofire.xcodeproj` folders each with two different versions of the `Alamofire.framework` nested inside a `Products` folder.
152   -
153   - > It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `Alamofire.framework`.
154   -
155   -- Select the top `Alamofire.framework` for iOS and the bottom one for OS X.
156   -
157   - > You can verify which one you selected by inspecting the build log for your project. The build target for `Alamofire` will be listed as either `Alamofire iOS`, `Alamofire macOS`, `Alamofire tvOS` or `Alamofire watchOS`.
158   -
159   -- And that's it!
160   -
161   -> The `Alamofire.framework` is automagically added as a target dependency, linked framework and embedded framework in a copy files build phase which is all you need to build on the simulator and a device.
162   -
163   ----
164   -
165   -## Usage
166   -
167   -### Making a Request
168   -
169   -```swift
170   -import Alamofire
171   -
172   -Alamofire.request("https://httpbin.org/get")
173   -```
174   -
175   -### Response Handling
176   -
177   -Handling the `Response` of a `Request` made in Alamofire involves chaining a response handler onto the `Request`.
178   -
179   -```swift
180   -Alamofire.request("https://httpbin.org/get").responseJSON { response in
181   - print(response.request) // original URL request
182   - print(response.response) // HTTP URL response
183   - print(response.data) // server data
184   - print(response.result) // result of response serialization
185   -
186   - if let JSON = response.result.value {
187   - print("JSON: \(JSON)")
188   - }
189   -}
190   -```
191   -
192   -In the above example, the `responseJSON` handler is appended to the `Request` to be executed once the `Request` is complete. Rather than blocking execution to wait for a response from the server, a [callback](http://en.wikipedia.org/wiki/Callback_%28computer_programming%29) in the form of a closure is specified to handle the response once it's received. The result of a request is only available inside the scope of a response closure. Any execution contingent on the response or data received from the server must be done within a response closure.
193   -
194   -> Networking in Alamofire is done _asynchronously_. Asynchronous programming may be a source of frustration to programmers unfamiliar with the concept, but there are [very good reasons](https://developer.apple.com/library/ios/qa/qa1693/_index.html) for doing it this way.
195   -
196   -Alamofire contains five different response handlers by default including:
197   -
198   -```swift
199   -// Response Handler - Unserialized Response
200   -func response(
201   - queue: DispatchQueue?,
202   - completionHandler: @escaping (DefaultDownloadResponse) -> Void)
203   - -> Self
204   -
205   -// Response Data Handler - Serialized into Data
206   -func responseData(
207   - queue: DispatchQueue?,
208   - completionHandler: @escaping (DataResponse<Data>) -> Void)
209   - -> Self
210   -
211   -// Response String Handler - Serialized into String
212   -func responseString(
213   - queue: DispatchQueue?,
214   - encoding: String.Encoding?,
215   - completionHandler: @escaping (DataResponse<String>) -> Void)
216   - -> Self
217   -
218   -// Response JSON Handler - Serialized into Any
219   -func responseJSON(
220   - queue: DispatchQueue?,
221   - completionHandler: @escaping (DataResponse<Any>) -> Void)
222   - -> Self
223   -
224   -// Response PropertyList (plist) Handler - Serialized into Any
225   -func responsePropertyList(
226   - queue: DispatchQueue?,
227   - completionHandler: @escaping (DataResponse<Any>) -> Void))
228   - -> Self
229   -```
230   -
231   -None of the response handlers perform any validation of the `HTTPURLResponse` it gets back from the server.
232   -
233   -> For example, response status codes in the `400..<499` and `500..<599` ranges do NOT automatically trigger an `Error`. Alamofire uses [Response Validation](#response-validation) method chaining to achieve this.
234   -
235   -#### Response Handler
236   -
237   -The `response` handler does NOT evaluate any of the response data. It merely forwards on all information directly from the URL session delegate. It is the Alamofire equivalent of using `cURL` to execute a `Request`.
238   -
239   -```swift
240   -Alamofire.request("https://httpbin.org/get").response { response in
241   - print("Request: \(response.request)")
242   - print("Response: \(response.response)")
243   - print("Error: \(response.data)")
244   -
245   - if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) {
246   - print("Data: \(utf8Text)")
247   - }
248   -}
249   -```
250   -
251   -> We strongly encourage you to leverage the other response serializers taking advantage of `Response` and `Result` types.
252   -
253   -#### Response Data Handler
254   -
255   -The `responseData` handler uses the `responseDataSerializer` (the object that serializes the server data into some other type) to extract the `Data` returned by the server. If no errors occur and `Data` is returned, the response `Result` will be a `.success` and the `value` will be of type `Data`.
256   -
257   -```swift
258   -Alamofire.request("https://httpbin.org/get").responseData { response in
259   - debugPrint("All Response Info: \(response)")
260   -
261   - if let data = response.result.value, let utf8Text = String(data: data, encoding: .utf8) {
262   - print("Data: \(utf8Text)")
263   - }
264   -}
265   -```
266   -
267   -#### Response String Handler
268   -
269   -The `responseString` handler uses the `responseStringSerializer` to convert the `Data` returned by the server into a `String` with the specified encoding. If no errors occur and the server data is successfully serialized into a `String`, the response `Result` will be a `.success` and the `value` will be of type `String`.
270   -
271   -```swift
272   -Alamofire.request("https://httpbin.org/get").responseString { response in
273   - print("Success: \(response.result.isSuccess)")
274   - print("Response String: \(response.result.value)")
275   -}
276   -```
277   -
278   -> If no encoding is specified, Alamofire will use the text encoding specified in the `HTTPURLResponse` from the server. If the text encoding cannot be determined by the server response, it defaults to `.isoLatin1`.
279   -
280   -#### Response JSON Handler
281   -
282   -The `responseJSON` handler uses the `responseJSONSerializer` to convert the `Data` returned by the server into an `Any` type using the specified `JSONSerialization.ReadingOptions`. If no errors occur and the server data is successfully serialized into a JSON object, the response `Result` will be a `.success` and the `value` will be of type `Any`.
283   -
284   -```swift
285   -Alamofire.request("https://httpbin.org/get").responseJSON { response in
286   - debugPrint(response)
287   -
288   - if let json = response.result.value {
289   - print("JSON: \(json)")
290   - }
291   -}
292   -```
293   -
294   -> All JSON serialization is handled by the `JSONSerialization` API in the `Foundation` framework.
295   -
296   -#### Chained Response Handlers
297   -
298   -Response handlers can even be chained:
299   -
300   -```swift
301   -Alamofire.request("https://httpbin.org/get")
302   - .responseString { response in
303   - print("Response String: \(response.result.value)")
304   - }
305   - .responseJSON { response in
306   - print("Response JSON: \(response.result.value)")
307   - }
308   -```
309   -
310   -> It is important to note that using multiple response handlers on the same `Request` requires the server data to be serialized multiple times. Once for each response handler.
311   -
312   -#### Response Handler Queue
313   -
314   -Response handlers by default are executed on the main dispatch queue. However, a custom dispatch queue can be provided instead.
315   -
316   -```swift
317   -let utilityQueue = DispatchQueue.global(qos: .utility)
318   -
319   -Alamofire.request("https://httpbin.org/get").responseJSON(queue: utilityQueue) { response in
320   - print("Executing response handler on utility queue")
321   -}
322   -```
323   -
324   -### Response Validation
325   -
326   -By default, Alamofire treats any completed request to be successful, regardless of the content of the response. Calling `validate` before a response handler causes an error to be generated if the response had an unacceptable status code or MIME type.
327   -
328   -#### Manual Validation
329   -
330   -```swift
331   -Alamofire.request("https://httpbin.org/get")
332   - .validate(statusCode: 200..<300)
333   - .validate(contentType: ["application/json"])
334   - .response { response in
335   - switch response.result {
336   - case .success:
337   - print("Validation Successful")
338   - case .failure(let error):
339   - print(error)
340   - }
341   - }
342   -```
343   -
344   -#### Automatic Validation
345   -
346   -Automatically validates status code within `200...299` range, and that the `Content-Type` header of the response matches the `Accept` header of the request, if one is provided.
347   -
348   -```swift
349   -Alamofire.request("https://httpbin.org/get").validate().responseJSON { response in
350   - switch response.result {
351   - case .success:
352   - print("Validation Successful")
353   - case .failure(let error):
354   - print(error)
355   - }
356   -}
357   -```
358   -
359   -### Response Caching
360   -
361   -Response Caching is handled on the system framework level by [`URLCache`](https://developer.apple.com/reference/foundation/urlcache). It provides a composite in-memory and on-disk cache and lets you manipulate the sizes of both the in-memory and on-disk portions.
362   -
363   -> By default, Alamofire leverages the shared `URLCache`. In order to customize it, see the [Session Manager Configurations](#session-manager-configurations) section.
364   -
365   -### HTTP Methods
366   -
367   -The `HTTPMethod` enumeration lists the HTTP methods defined in [RFC 7231 §4.3](http://tools.ietf.org/html/rfc7231#section-4.3):
368   -
369   -```swift
370   -public enum HTTPMethod: String {
371   - case options = "OPTIONS"
372   - case get = "GET"
373   - case head = "HEAD"
374   - case post = "POST"
375   - case put = "PUT"
376   - case patch = "PATCH"
377   - case delete = "DELETE"
378   - case trace = "TRACE"
379   - case connect = "CONNECT"
380   -}
381   -```
382   -
383   -These values can be passed as the `method` argument to the `Alamofire.request` API:
384   -
385   -```swift
386   -Alamofire.request("https://httpbin.org/get") // method defaults to `.get`
387   -
388   -Alamofire.request("https://httpbin.org/post", method: .post)
389   -Alamofire.request("https://httpbin.org/put", method: .put)
390   -Alamofire.request("https://httpbin.org/delete", method: .delete)
391   -```
392   -
393   -> The `Alamofire.request` method parameter defaults to `.get`.
394   -
395   -### Parameter Encoding
396   -
397   -Alamofire supports three types of parameter encoding including: `URL`, `JSON` and `PropertyList`. It can also support any custom encoding that conforms to the `ParameterEncoding` protocol.
398   -
399   -#### URL Encoding
400   -
401   -The `URLEncoding` type creates a url-encoded query string to be set as or appended to any existing URL query string or set as the HTTP body of the URL request. Whether the query string is set or appended to any existing URL query string or set as the HTTP body depends on the `Destination` of the encoding. The `Destination` enumeration has three cases:
402   -
403   -- `.methodDependent` - Applies encoded query string result to existing query string for `GET`, `HEAD` and `DELETE` requests and sets as the HTTP body for requests with any other HTTP method.
404   -- `.queryString` - Sets or appends encoded query string result to existing query string.
405   -- `.httpBody` - Sets encoded query string result as the HTTP body of the URL request.
406   -
407   -The `Content-Type` HTTP header field of an encoded request with HTTP body is set to `application/x-www-form-urlencoded; charset=utf-8`. Since there is no published specification for how to encode collection types, the convention of appending `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for nested dictionary values (`foo[bar]=baz`).
408   -
409   -##### GET Request With URL-Encoded Parameters
410   -
411   -```swift
412   -let parameters: Parameters = ["foo": "bar"]
413   -
414   -// All three of these calls are equivalent
415   -Alamofire.request("https://httpbin.org/get", parameters: parameters) // encoding defaults to `URLEncoding.default`
416   -Alamofire.request("https://httpbin.org/get", parameters: parameters, encoding: URLEncoding.default)
417   -Alamofire.request("https://httpbin.org/get", parameters: parameters, encoding: URLEncoding(destination: .methodDependent))
418   -
419   -// https://httpbin.org/get?foo=bar
420   -```
421   -
422   -##### POST Request With URL-Encoded Parameters
423   -
424   -```swift
425   -let parameters: Parameters = [
426   - "foo": "bar",
427   - "baz": ["a", 1],
428   - "qux": [
429   - "x": 1,
430   - "y": 2,
431   - "z": 3
432   - ]
433   -]
434   -
435   -// All three of these calls are equivalent
436   -Alamofire.request("https://httpbin.org/post", parameters: parameters)
437   -Alamofire.request("https://httpbin.org/post", parameters: parameters, encoding: URLEncoding.default)
438   -Alamofire.request("https://httpbin.org/post", parameters: parameters, encoding: URLEncoding.httpBody)
439   -
440   -// HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3
441   -```
442   -
443   -#### JSON Encoding
444   -
445   -The `JSONEncoding` type creates a JSON representation of the parameters object, which is set as the HTTP body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/json`.
446   -
447   -##### POST Request with JSON-Encoded Parameters
448   -
449   -```swift
450   -let parameters: Parameters = [
451   - "foo": [1,2,3],
452   - "bar": [
453   - "baz": "qux"
454   - ]
455   -]
456   -
457   -// Both calls are equivalent
458   -Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters, encoding: JSONEncoding.default)
459   -Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters, encoding: JSONEncoding(options: []))
460   -
461   -// HTTP body: {"foo": [1, 2, 3], "bar": {"baz": "qux"}}
462   -```
463   -
464   -#### Property List Encoding
465   -
466   -The `PropertyListEncoding` uses `PropertyListSerialization` to create a plist representation of the parameters object, according to the associated format and write options values, which is set as the body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/x-plist`.
467   -
468   -#### Custom Encoding
469   -
470   -In the event that the provided `ParameterEncoding` types do not meet your needs, you can create your own custom encoding. Here's a quick example of how you could build a custom `JSONStringArrayEncoding` type to encode a JSON string array onto a `Request`.
471   -
472   -```swift
473   -struct JSONStringArrayEncoding: ParameterEncoding {
474   - private let array: [String]
475   -
476   - init(array: [String]) {
477   - self.array = array
478   - }
479   -
480   - func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
481   - var urlRequest = urlRequest.urlRequest
482   -
483   - let data = try JSONSerialization.data(withJSONObject: array, options: [])
484   -
485   - if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil {
486   - urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
487   - }
488   -
489   - urlRequest.httpBody = data
490   -
491   - return urlRequest
492   - }
493   -}
494   -```
495   -
496   -#### Manual Parameter Encoding of a URLRequest
497   -
498   -The `ParameterEncoding` APIs can be used outside of making network requests.
499   -
500   -```swift
501   -let url = URL(string: "https://httpbin.org/get")!
502   -var urlRequest = URLRequest(url: url)
503   -
504   -let parameters: Parameters = ["foo": "bar"]
505   -let encodedURLRequest = try URLEncoding.queryString.encode(urlRequest, with: parameters)
506   -```
507   -
508   -### HTTP Headers
509   -
510   -Adding a custom HTTP header to a `Request` is supported directly in the global `request` method. This makes it easy to attach HTTP headers to a `Request` that can be constantly changing.
511   -
512   -```swift
513   -let headers: HTTPHeaders = [
514   - "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
515   - "Accept": "application/json"
516   -]
517   -
518   -Alamofire.request("https://httpbin.org/headers", headers: headers).responseJSON { response in
519   - debugPrint(response)
520   -}
521   -```
522   -
523   -> For HTTP headers that do not change, it is recommended to set them on the `URLSessionConfiguration` so they are automatically applied to any `URLSessionTask` created by the underlying `URLSession`. For more information, see the [Session Manager Configurations](#session-manager-configurations) section.
524   -
525   -The default Alamofire `SessionManager` provides a default set of headers for every `Request`. These include:
526   -
527   -- `Accept-Encoding`, which defaults to `gzip;q=1.0, compress;q=0.5`, per [RFC 7230 §4.2.3](https://tools.ietf.org/html/rfc7230#section-4.2.3).
528   -- `Accept-Language`, which defaults to up to the top 6 preferred languages on the system, formatted like `en;q=1.0`, per [RFC 7231 §5.3.5](https://tools.ietf.org/html/rfc7231#section-5.3.5).
529   -- `User-Agent`, which contains versioning information about the current app. For example: `iOS Example/1.0 (com.alamofire.iOS-Example; build:1; iOS 10.0.0) Alamofire/4.0.0`, per [RFC 7231 §5.5.3](https://tools.ietf.org/html/rfc7231#section-5.5.3).
530   -
531   -If you need to customize these headers, a custom `URLSessionManagerConfiguration` should be created, the `defaultHTTPHeaders` property updated and the configuration applied to a new `SessionManager` instance.
532   -
533   -### Authentication
534   -
535   -Authentication is handled on the system framework level by [`URLCredential`](https://developer.apple.com/reference/foundation/nsurlcredential) and [`URLAuthenticationChallenge`](https://developer.apple.com/reference/foundation/urlauthenticationchallenge).
536   -
537   -**Supported Authentication Schemes**
538   -
539   -- [HTTP Basic](http://en.wikipedia.org/wiki/Basic_access_authentication)
540   -- [HTTP Digest](http://en.wikipedia.org/wiki/Digest_access_authentication)
541   -- [Kerberos](http://en.wikipedia.org/wiki/Kerberos_%28protocol%29)
542   -- [NTLM](http://en.wikipedia.org/wiki/NT_LAN_Manager)
543   -
544   -#### HTTP Basic Authentication
545   -
546   -The `authenticate` method on a `Request` will automatically provide a `URLCredential` to a `URLAuthenticationChallenge` when appropriate:
547   -
548   -```swift
549   -let user = "user"
550   -let password = "password"
551   -
552   -Alamofire.request("https://httpbin.org/basic-auth/\(user)/\(password)")
553   - .authenticate(user: user, password: password)
554   - .responseJSON { response in
555   - debugPrint(response)
556   - }
557   -```
558   -
559   -Depending upon your server implementation, an `Authorization` header may also be appropriate:
560   -
561   -```swift
562   -let user = "user"
563   -let password = "password"
564   -
565   -var headers: HTTPHeaders = [:]
566   -
567   -if let authorizationHeader = Request.authorizationHeader(user: user, password: password) {
568   - headers[authorizationHeader.key] = authorizationHeader.value
569   -}
570   -
571   -Alamofire.request("https://httpbin.org/basic-auth/user/password", headers: headers)
572   - .responseJSON { response in
573   - debugPrint(response)
574   - }
575   -```
576   -
577   -#### Authentication with URLCredential
578   -
579   -```swift
580   -let user = "user"
581   -let password = "password"
582   -
583   -let credential = URLCredential(user: user, password: password, persistence: .forSession)
584   -
585   -Alamofire.request("https://httpbin.org/basic-auth/\(user)/\(password)")
586   - .authenticate(usingCredential: credential)
587   - .responseJSON { response in
588   - debugPrint(response)
589   - }
590   -```
591   -
592   -> It is important to note that when using a `URLCredential` for authentication, the underlying `URLSession` will actually end up making two requests if a challenge is issued by the server. The first request will not include the credential which "may" trigger a challenge from the server. The challenge is then received by Alamofire, the credential is appended and the request is retried by the underlying `URLSession`.
593   -
594   -### Downloading Data to a File
595   -
596   -Requests made in Alamofire that fetch data from a server can download the data in-memory or on-disk. The `Alamofire.request` APIs used in all the examples so far always downloads the server data in-memory. This is great for smaller payloads because it's more efficient, but really bad for larger payloads because the download could run your entire application out-of-memory. Because of this, you can also use the `Alamofire.download` APIs to download the server data to a temporary file on-disk.
597   -
598   -```swift
599   -Alamofire.download("https://httpbin.org/image/png").responseData { response in
600   - if let data = response.result.value {
601   - let image = UIImage(data: data)
602   - }
603   -}
604   -```
605   -
606   -> The `Alamofire.download` APIs should also be used if you need to download data while your app is in the background. For more information, please see the [Session Manager Configurations](#session-manager-configurations) section.
607   -
608   -#### Download File Destination
609   -
610   -You can also provide a `DownloadFileDestination` closure to move the file from the temporary directory to a final destination. Before the temporary file is actually moved to the `destinationURL`, the `DownloadOptions` specified in the closure will be executed. The two currently supported `DownloadOptions` are:
611   -
612   -- `.createIntermediateDirectories` - Creates intermediate directories for the destination URL if specified.
613   -- `.removePreviousFile` - Removes a previous file from the destination URL if specified.
614   -
615   -```swift
616   -let destination: DownloadRequest.DownloadFileDestination = { _, _ in
617   - let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
618   - let fileURL = documentsURL.appendPathComponent("pig.png")
619   -
620   - return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
621   -}
622   -
623   -Alamofire.download(urlString, to: destination).response { response in
624   - print(response)
625   -
626   - if response.result.isSuccess, let imagePath = response.destinationURL?.path {
627   - let image = UIImage(contentsOfFile: imagePath)
628   - }
629   -}
630   -```
631   -
632   -You can also use the suggested download destination API.
633   -
634   -```swift
635   -let destination = DownloadRequest.suggestedDownloadDestination(directory: .documentDirectory)
636   -Alamofire.download("https://httpbin.org/image/png", to: destination)
637   -```
638   -
639   -#### Download Progress
640   -
641   -Many times it can be helpful to report download progress to the user. Any `DownloadRequest` can report download progress using the `downloadProgress` API.
642   -
643   -```swift
644   -Alamofire.download("https://httpbin.org/image/png")
645   - .downloadProgress { progress in
646   - print("Download Progress: \(progress.fractionCompleted)")
647   - }
648   - .responseData { response in
649   - if let data = response.result.value {
650   - let image = UIImage(data: data)
651   - }
652   - }
653   -```
654   -
655   -The `downloadProgress` API also takes a `queue` parameter which defines which `DispatchQueue` the download progress closure should be called on.
656   -
657   -```swift
658   -let utilityQueue = DispatchQueue.global(qos: .utility)
659   -
660   -Alamofire.download("https://httpbin.org/image/png")
661   - .downloadProgress(queue: utilityQueue) { progress in
662   - print("Download Progress: \(progress.fractionCompleted)")
663   - }
664   - .responseData { response in
665   - if let data = response.result.value {
666   - let image = UIImage(data: data)
667   - }
668   - }
669   -```
670   -
671   -#### Resuming a Download
672   -
673   -If a `DownloadRequest` is cancelled or interrupted, the underlying URL session may generate resume data for the active `DownloadRequest`. If this happens, the resume data can be re-used to restart the `DownloadRequest` where it left off. The resume data can be accessed through the download response, then reused when trying to restart the request.
674   -
675   -```swift
676   -class ImageRequestor {
677   - private var resumeData: Data?
678   - private var image: UIImage?
679   -
680   - func fetchImage(completion: (UIImage?) -> Void) {
681   - guard image == nil else { completion(image) ; return }
682   -
683   - let destination: DownloadRequest.DownloadFileDestination = { _, _ in
684   - let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
685   - let fileURL = documentsURL.appendPathComponent("pig.png")
686   -
687   - return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
688   - }
689   -
690   - let request: DownloadRequest
691   -
692   - if let resumeData = resumeData {
693   - request = Alamofire.download(resumingWith: resumeData)
694   - } else {
695   - request = Alamofire.download("https://httpbin.org/image/png")
696   - }
697   -
698   - request.responseData { response in
699   - switch response.result {
700   - case .success(let data):
701   - self.image = UIImage(data: data)
702   - case .failure:
703   - self.resumeData = response.resumeData
704   - }
705   - }
706   - }
707   -}
708   -```
709   -
710   -### Uploading Data to a Server
711   -
712   -When sending relatively small amounts of data to a server using JSON or URL encoded parameters, the `Alamofire.request` APIs are usually sufficient. If you need to send much larger amounts of data from a file URL or an `InputStream`, then the `Alamofire.upload` APIs are what you want to use.
713   -
714   -> The `Alamofire.upload` APIs should also be used if you need to upload data while your app is in the background. For more information, please see the [Session Manager Configurations](#session-manager-configurations) section.
715   -
716   -#### Uploading Data
717   -
718   -```swift
719   -let imageData = UIPNGRepresentation(image)!
720   -
721   -Alamofire.upload(imageData, to: "https://httpbin.org/post").responseJSON { response in
722   - debugPrint(response)
723   -}
724   -```
725   -
726   -#### Uploading a File
727   -
728   -```swift
729   -let fileURL = Bundle.main.url(forResource: "video", withExtension: "mov")
730   -
731   -Alamofire.upload(fileURL, to: "https://httpbin.org/post").responseJSON { response in
732   - debugPrint(response)
733   -}
734   -```
735   -
736   -#### Uploading Multipart Form Data
737   -
738   -```swift
739   -Alamofire.upload(
740   - multipartFormData: { multipartFormData in
741   - multipartFormData.append(unicornImageURL, withName: "unicorn")
742   - multipartFormData.append(rainbowImageURL, withName: "rainbow")
743   - },
744   - to: "https://httpbin.org/post",
745   - encodingCompletion: { encodingResult in
746   - switch encodingResult {
747   - case .success(let upload, _, _):
748   - upload.responseJSON { response in
749   - debugPrint(response)
750   - }
751   - case .failure(let encodingError):
752   - print(encodingError)
753   - }
754   - }
755   -)
756   -```
757   -
758   -#### Upload Progress
759   -
760   -While your user is waiting for their upload to complete, sometimes it can be handy to show the progress of the upload to the user. Any `UploadRequest` can report both upload progress and download progress of the response data using the `uploadProgress` and `downloadProgress` APIs.
761   -
762   -```swift
763   -let fileURL = Bundle.main.url(forResource: "video", withExtension: "mov")
764   -
765   -Alamofire.upload(fileURL, to: "https://httpbin.org/post")
766   - .uploadProgress { progress in // main queue by default
767   - print("Upload Progress: \(progress.fractionCompleted)")
768   - }
769   - .downloadProgress { progress in // main queue by default
770   - print("Download Progress: \(progress.fractionCompleted)")
771   - }
772   - .responseJSON { response in
773   - debugPrint(response)
774   - }
775   -```
776   -
777   -### Statistical Metrics
778   -
779   -#### Timeline
780   -
781   -Alamofire collects timings throughout the lifecycle of a `Request` and creates a `Timeline` object exposed as a property on all response types.
782   -
783   -```swift
784   -Alamofire.request("https://httpbin.org/get").responseJSON { response in
785   - print(response.timeline)
786   -}
787   -```
788   -
789   -The above reports the following `Timeline` info:
790   -
791   -- `Latency`: 0.428 seconds
792   -- `Request Duration`: 0.428 seconds
793   -- `Serialization Duration`: 0.001 seconds
794   -- `Total Duration`: 0.429 seconds
795   -
796   -#### URL Session Task Metrics
797   -
798   -In iOS and tvOS 10 and macOS 10.12, Apple introduced the new [URLSessionTaskMetrics](https://developer.apple.com/reference/foundation/urlsessiontaskmetrics) APIs. The task metrics encapsulate some fantastic statistical information about the request and response execution. The API is very similar to the `Timeline`, but provides many more statistics that Alamofire doesn't have access to compute. The metrics can be accessed through any response type.
799   -
800   -```swift
801   -Alamofire.request("https://httpbin.org/get").responseJSON { response in
802   - print(response.metrics)
803   -}
804   -```
805   -
806   -It's important to note that these APIs are only available on iOS and tvOS 10 and macOS 10.12. Therefore, depending on your deployment target, you may need to use these inside availability checks:
807   -
808   -```swift
809   -Alamofire.request("https://httpbin.org/get").responseJSON { response in
810   - if #available(iOS 10.0. *) {
811   - print(response.metrics)
812   - }
813   -}
814   -```
815   -
816   -### cURL Command Output
817   -
818   -Debugging platform issues can be frustrating. Thankfully, Alamofire `Request` objects conform to both the `CustomStringConvertible` and `CustomDebugStringConvertible` protocols to provide some VERY helpful debugging tools.
819   -
820   -#### CustomStringConvertible
821   -
822   -```swift
823   -let request = Alamofire.request("https://httpbin.org/ip")
824   -
825   -print(request)
826   -// GET https://httpbin.org/ip (200)
827   -```
828   -
829   -#### CustomDebugStringConvertible
830   -
831   -```swift
832   -let request = Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"])
833   -debugPrint(request)
834   -```
835   -
836   -Outputs:
837   -
838   -```bash
839   -$ curl -i \
840   - -H "User-Agent: Alamofire/4.0.0" \
841   - -H "Accept-Encoding: gzip;q=1.0, compress;q=0.5" \
842   - -H "Accept-Language: en;q=1.0,fr;q=0.9,de;q=0.8,zh-Hans;q=0.7,zh-Hant;q=0.6,ja;q=0.5" \
843   - "https://httpbin.org/get?foo=bar"
844   -```
845   -
846   ----
847   -
848   -## Advanced Usage
849   -
850   -Alamofire is built on `URLSession` and the Foundation URL Loading System. To make the most of this framework, it is recommended that you be familiar with the concepts and capabilities of the underlying networking stack.
851   -
852   -**Recommended Reading**
853   -
854   -- [URL Loading System Programming Guide](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html)
855   -- [URLSession Class Reference](https://developer.apple.com/reference/foundation/nsurlsession)
856   -- [URLCache Class Reference](https://developer.apple.com/reference/foundation/urlcache)
857   -- [URLAuthenticationChallenge Class Reference](https://developer.apple.com/reference/foundation/urlauthenticationchallenge)
858   -
859   -### Session Manager
860   -
861   -Top-level convenience methods like `Alamofire.request` use a default instance of `Alamofire.SessionManager`, which is configured with the default `URLSessionConfiguration`.
862   -
863   -As such, the following two statements are equivalent:
864   -
865   -```swift
866   -Alamofire.request("https://httpbin.org/get")
867   -```
868   -
869   -```swift
870   -let sessionManager = Alamofire.SessionManager.default
871   -sessionManager.request("https://httpbin.org/get")
872   -```
873   -
874   -Applications can create session managers for background and ephemeral sessions, as well as new managers that customize the default session configuration, such as for default headers (`httpAdditionalHeaders`) or timeout interval (`timeoutIntervalForRequest`).
875   -
876   -#### Creating a Session Manager with Default Configuration
877   -
878   -```swift
879   -let configuration = URLSessionConfiguration.default
880   -let sessionManager = Alamofire.SessionManager(configuration: configuration)
881   -```
882   -
883   -#### Creating a Session Manager with Background Configuration
884   -
885   -```swift
886   -let configuration = URLSessionConfiguration.background(withIdentifier: "com.example.app.background")
887   -let sessionManager = Alamofire.SessionManager(configuration: configuration)
888   -```
889   -
890   -#### Creating a Session Manager with Ephemeral Configuration
891   -
892   -```swift
893   -let configuration = URLSessionConfiguration.ephemeral
894   -let sessionManager = Alamofire.SessionManager(configuration: configuration)
895   -```
896   -
897   -#### Modifying the Session Configuration
898   -
899   -```swift
900   -var defaultHeaders = Alamofire.SessionManager.default.defaultHTTPHeaders
901   -defaultHeaders["DNT"] = "1 (Do Not Track Enabled)"
902   -
903   -let configuration = URLSessionConfiguration.default
904   -configuration.httpAdditionalHeaders = defaultHeaders
905   -
906   -let sessionManager = Alamofire.SessionManager(configuration: configuration)
907   -```
908   -
909   -> This is **not** recommended for `Authorization` or `Content-Type` headers. Instead, use the `headers` parameter in the top-level `Alamofire.request` APIs, `URLRequestConvertible` and `ParameterEncoding`, respectively.
910   -
911   -### Session Delegate
912   -
913   -By default, an Alamofire `SessionManager` instance creates a `SessionDelegate` object to handle all the various types of delegate callbacks that are generated by the underlying `URLSession`. The implementations of each delegate method handle the most common use cases for these types of calls abstracting the complexity away from the top-level APIs. However, advanced users may find the need to override the default functionality for various reasons.
914   -
915   -#### Override Closures
916   -
917   -The first way to customize the `SessionDelegate` behavior is through the use of the override closures. Each closure gives you the ability to override the implementation of the matching `SessionDelegate` API, yet still use the default implementation for all other APIs. This makes it easy to customize subsets of the delegate functionality. Here are a few examples of some of the override closures available:
918   -
919   -```swift
920   -/// Overrides default behavior for URLSessionDelegate method `urlSession(_:didReceive:completionHandler:)`.
921   -open var sessionDidReceiveChallenge: ((URLSession, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))?
922   -
923   -/// Overrides default behavior for URLSessionDelegate method `urlSessionDidFinishEvents(forBackgroundURLSession:)`.
924   -open var sessionDidFinishEventsForBackgroundURLSession: ((URLSession) -> Void)?
925   -
926   -/// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)`.
927   -open var taskWillPerformHTTPRedirection: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest) -> URLRequest?)?
928   -
929   -/// Overrides default behavior for URLSessionDataDelegate method `urlSession(_:dataTask:willCacheResponse:completionHandler:)`.
930   -open var dataTaskWillCacheResponse: ((URLSession, URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)?
931   -```
932   -
933   -The following is a short example of how to use the `taskWillPerformHTTPRedirection` to avoid following redirects to any `apple.com` domains.
934   -
935   -```swift
936   -let sessionManager = Alamofire.SessionManager(configuration: URLSessionConfiguration.default)
937   -let delegate: Alamofire.SessionDelegate = sessionManager.delegate
938   -
939   -delegate.taskWillPerformHTTPRedirection = { session, task, response, request in
940   - var finalRequest = request
941   -
942   - if
943   - let originalRequest = task.originalRequest,
944   - let urlString = originalRequest.url?.urlString,
945   - urlString.contains("apple.com")
946   - {
947   - finalRequest = originalRequest
948   - }
949   -
950   - return finalRequest
951   -}
952   -```
953   -
954   -#### Subclassing
955   -
956   -Another way to override the default implementation of the `SessionDelegate` is to subclass it. Subclassing allows you completely customize the behavior of the API or to create a proxy for the API and still use the default implementation. Creating a proxy allows you to log events, emit notifications, provide pre and post hook implementations, etc. Here's a quick example of subclassing the `SessionDelegate` and logging a message when a redirect occurs.
957   -
958   -```swift
959   -class LoggingSessionDelegate: SessionDelegate {
960   - override func urlSession(
961   - _ session: URLSession,
962   - task: URLSessionTask,
963   - willPerformHTTPRedirection response: HTTPURLResponse,
964   - newRequest request: URLRequest,
965   - completionHandler: @escaping (URLRequest?) -> Void)
966   - {
967   - print("URLSession will perform HTTP redirection to request: \(request)")
968   -
969   - super.urlSession(
970   - session,
971   - task: task,
972   - willPerformHTTPRedirection: response,
973   - newRequest: request,
974   - completionHandler: completionHandler
975   - )
976   - }
977   -}
978   -```
979   -
980   -Generally speaking, either the default implementation or the override closures should provide the necessary functionality required. Subclassing should only be used as a last resort.
981   -
982   -> It is important to keep in mind that the `subdelegates` are initialized and destroyed in the default implementation. Be careful when subclassing to not introduce memory leaks.
983   -
984   -### Request
985   -
986   -The result of a `request`, `download`, `upload` or `stream` methods are a `DataRequest`, `DownloadRequest`, `UploadRequest` and `StreamRequest` which all inherit from `Request`. All `Request` instances are always created by an owning session manager, and never initialized directly.
987   -
988   -Each subclass has specialized methods such as `authenticate`, `validate`, `responseJSON` and `uploadProgress` that each return the caller instance in order to facilitate method chaining.
989   -
990   -Requests can be suspended, resumed and cancelled:
991   -
992   -- `suspend()`: Suspends the underlying task and dispatch queue.
993   -- `resume()`: Resumes the underlying task and dispatch queue. If the owning manager does not have `startRequestsImmediately` set to `true`, the request must call `resume()` in order to start.
994   -- `cancel()`: Cancels the underlying task, producing an error that is passed to any registered response handlers.
995   -
996   -### Routing Requests
997   -
998   -As apps grow in size, it's important to adopt common patterns as you build out your network stack. An important part of that design is how to route your requests. The Alamofire `URLConvertible` and `URLRequestConvertible` protocols along with the `Router` design pattern are here to help.
999   -
1000   -#### URLConvertible
1001   -
1002   -Types adopting the `URLConvertible` protocol can be used to construct URLs, which are then used to construct URL requests internally. `String`, `URL`, and `URLComponents` conform to `URLConvertible` by default, allowing any of them to be passed as `url` parameters to the `request`, `upload`, and `download` methods:
1003   -
1004   -```swift
1005   -let urlString = "https://httpbin.org/post"
1006   -Alamofire.request(urlString, method: .post)
1007   -
1008   -let url = URL(string: urlString)!
1009   -Alamofire.request(url, method: .post)
1010   -
1011   -let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true)
1012   -Alamofire.request(.post, URLComponents)
1013   -```
1014   -
1015   -Applications interacting with web applications in a significant manner are encouraged to have custom types conform to `URLConvertible` as a convenient way to map domain-specific models to server resources.
1016   -
1017   -##### Type-Safe Routing
1018   -
1019   -```swift
1020   -extension User: URLConvertible {
1021   - static let baseURLString = "https://example.com"
1022   -
1023   - func asURL() throws -> URL {
1024   - let urlString = User.baseURLString + "/users/\(username)/"
1025   - return try urlString.asURL()
1026   - }
1027   -}
1028   -```
1029   -
1030   -```swift
1031   -let user = User(username: "mattt")
1032   -Alamofire.request(user) // https://example.com/users/mattt
1033   -```
1034   -
1035   -#### URLRequestConvertible
1036   -
1037   -Types adopting the `URLRequestConvertible` protocol can be used to construct URL requests. `URLRequest` conforms to `URLRequestConvertible` by default, allowing it to be passed into `request`, `upload`, and `download` methods directly (this is the recommended way to specify custom HTTP body for individual requests):
1038   -
1039   -```swift
1040   -let url = URL(string: "https://httpbin.org/post")!
1041   -var urlRequest = URLRequest(url: url)
1042   -urlRequest.httpMethod = "POST"
1043   -
1044   -let parameters = ["foo": "bar"]
1045   -
1046   -do {
1047   - urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: [])
1048   -} catch {
1049   - // No-op
1050   -}
1051   -
1052   -urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
1053   -
1054   -Alamofire.request(urlRequest)
1055   -```
1056   -
1057   -Applications interacting with web applications in a significant manner are encouraged to have custom types conform to `URLRequestConvertible` as a way to ensure consistency of requested endpoints. Such an approach can be used to abstract away server-side inconsistencies and provide type-safe routing, as well as manage authentication credentials and other state.
1058   -
1059   -##### API Parameter Abstraction
1060   -
1061   -```swift
1062   -enum Router: URLRequestConvertible {
1063   - case search(query: String, page: Int)
1064   -
1065   - static let baseURLString = "https://example.com"
1066   - static let perPage = 50
1067   -
1068   - // MARK: URLRequestConvertible
1069   -
1070   - func asURLRequest() throws -> URLRequest {
1071   - let result: (path: String, parameters: Parameters) = {
1072   - switch self {
1073   - case let .search(query, page) where page > 0:
1074   - return ("/search", ["q": query, "offset": Router.perPage * page])
1075   - case let .search(query, _):
1076   - return ("/search", ["q": query])
1077   - }
1078   - }()
1079   -
1080   - let url = try Router.baseURLString.asURL()
1081   - let urlRequest = URLRequest(url: url.appendingPathComponent(result.path))
1082   -
1083   - return try URLEncoding.default.encode(urlRequest, with: result.parameters)
1084   - }
1085   -}
1086   -```
1087   -
1088   -```swift
1089   -Alamofire.request(Router.search(query: "foo bar", page: 1)) // ?q=foo%20bar&offset=50
1090   -```
1091   -
1092   -##### CRUD & Authorization
1093   -
1094   -```swift
1095   -import Alamofire
1096   -
1097   -enum Router: URLRequestConvertible {
1098   - case createUser(parameters: Parameters)
1099   - case readUser(username: String)
1100   - case updateUser(username: String, parameters: Parameters)
1101   - case destroyUser(username: String)
1102   -
1103   - static let baseURLString = "https://example.com"
1104   -
1105   - var method: HTTPMethod {
1106   - switch self {
1107   - case .createUser:
1108   - return .post
1109   - case .readUser:
1110   - return .get
1111   - case .updateUser:
1112   - return .put
1113   - case .destroyUser:
1114   - return .delete
1115   - }
1116   - }
1117   -
1118   - var path: String {
1119   - switch self {
1120   - case .createUser:
1121   - return "/users"
1122   - case .readUser(let username):
1123   - return "/users/\(username)"
1124   - case .updateUser(let username, _):
1125   - return "/users/\(username)"
1126   - case .destroyUser(let username):
1127   - return "/users/\(username)"
1128   - }
1129   - }
1130   -
1131   - // MARK: URLRequestConvertible
1132   -
1133   - func asURLRequest() throws -> URLRequest {
1134   - let url = try Router.baseURLString.asURL()
1135   -
1136   - var urlRequest = URLRequest(url: url.appendingPathComponent(path))
1137   - urlRequest.httpMethod = method.rawValue
1138   -
1139   - switch self {
1140   - case .createUser(let parameters):
1141   - urlRequest = try URLEncoding.default.encode(urlRequest, with: parameters)
1142   - case .updateUser(_, let parameters):
1143   - urlRequest = try URLEncoding.default.encode(urlRequest, with: parameters)
1144   - default:
1145   - break
1146   - }
1147   -
1148   - return urlRequest
1149   - }
1150   -}
1151   -```
1152   -
1153   -```swift
1154   -Alamofire.request(Router.readUser("mattt")) // GET /users/mattt
1155   -```
1156   -
1157   -### Adapting and Retrying Requests
1158   -
1159   -Most web services these days are behind some sort of authentication system. One of the more common ones today is OAuth. This generally involves generating an access token authorizing your application or user to call the various supported web services. While creating these initial access tokens can be laborsome, it can be even more complicated when your access token expires and you need to fetch a new one. There are many thread-safety issues that need to be considered.
1160   -
1161   -The `RequestAdapter` and `RequestRetrier` protocols were created to make it much easier to create a thread-safe authentication system for a specific set of web services.
1162   -
1163   -#### RequestAdapter
1164   -
1165   -The `RequestAdapter` protocol allows each `Request` made on a `SessionManager` to be inspected and adapted before being created. One very specific way to use an adapter is to append an `Authorization` header to requests behind a certain type of authentication.
1166   -
1167   -```swift
1168   -class AccessTokenAdapter: RequestAdapter {
1169   - private let accessToken: String
1170   -
1171   - init(accessToken: String) {
1172   - self.accessToken = accessToken
1173   - }
1174   -
1175   - func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
1176   - var urlRequest = urlRequest
1177   -
1178   - if urlRequest.urlString.hasPrefix("https://httpbin.org") {
1179   - urlRequest.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization")
1180   - }
1181   -
1182   - return urlRequest
1183   - }
1184   -}
1185   -```
1186   -
1187   -```swift
1188   -let sessionManager = SessionManager()
1189   -sessionManager.adapter = AccessTokenAdapter(accessToken: "1234")
1190   -
1191   -sessionManager.request("https://httpbin.org/get")
1192   -```
  126 +### Swift Package Manager
1193 127  
1194   -#### RequestRetrier
  128 +The [Swift Package Manager](https://swift.org/package-manager/) is a tool for automating the distribution of Swift code and is integrated into the `swift` compiler. It is in early development, but Alamofire does support its use on supported platforms.
1195 129  
1196   -The `RequestRetrier` protocol allows a `Request` that encountered an `Error` while being executed to be retried. When using both the `RequestAdapter` and `RequestRetrier` protocols together, you can create credential refresh systems for OAuth1, OAuth2, Basic Auth and even exponential backoff retry policies. The possibilities are endless. Here's an example of how you could implement a refresh flow for OAuth2 access tokens.
  130 +Once you have your Swift package set up, adding Alamofire as a dependency is as easy as adding it to the `dependencies` value of your `Package.swift`.
1197 131  
1198   -> **DISCLAIMER:** This is **NOT** a global `OAuth2` solution. It is merely an example demonstrating how one could use the `RequestAdapter` in conjunction with the `RequestRetrier` to create a thread-safe refresh system.
1199   -
1200   -> To reiterate, **do NOT copy** this sample code and drop it into a production application. This is merely an example. Each authentication system must be tailored to a particular platform and authentication type.
1201   -
1202   -```swift
1203   -class OAuth2Handler: RequestAdapter, RequestRetrier {
1204   - private typealias RefreshCompletion = (_ succeeded: Bool, _ accessToken: String?, _ refreshToken: String?) -> Void
1205   -
1206   - private let sessionManager: SessionManager = {
1207   - let configuration = URLSessionConfiguration.default
1208   - configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
1209   -
1210   - return SessionManager(configuration: configuration)
1211   - }()
1212   -
1213   - private let lock = NSLock()
1214   -
1215   - private var clientID: String
1216   - private var baseURLString: String
1217   - private var accessToken: String
1218   - private var refreshToken: String
1219   -
1220   - private var isRefreshing = false
1221   - private var requestsToRetry: [RequestRetryCompletion] = []
1222   -
1223   - // MARK: - Initialization
1224   -
1225   - public init(clientID: String, baseURLString: String, accessToken: String, refreshToken: String) {
1226   - self.clientID = clientID
1227   - self.baseURLString = baseURLString
1228   - self.accessToken = accessToken
1229   - self.refreshToken = refreshToken
1230   - }
1231   -
1232   - // MARK: - RequestAdapter
1233   -
1234   - func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
1235   - if let url = urlRequest.url, url.urlString.hasPrefix(baseURLString) {
1236   - var urlRequest = urlRequest
1237   - urlRequest.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization")
1238   - return urlRequest
1239   - }
1240   -
1241   - return urlRequest
1242   - }
1243   -
1244   - // MARK: - RequestRetrier
1245   -
1246   - func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {
1247   - lock.lock() ; defer { lock.unlock() }
1248   -
1249   - if let response = request.task.response as? HTTPURLResponse, response.statusCode == 401 {
1250   - requestsToRetry.append(completion)
1251   -
1252   - if !isRefreshing {
1253   - refreshTokens { [weak self] succeeded, accessToken, refreshToken in
1254   - guard let strongSelf = self else { return }
1255   -
1256   - strongSelf.lock.lock() ; defer { strongSelf.lock.unlock() }
1257   -
1258   - if let accessToken = accessToken, let refreshToken = refreshToken {
1259   - strongSelf.accessToken = accessToken
1260   - strongSelf.refreshToken = refreshToken
1261   - }
1262   -
1263   - strongSelf.requestsToRetry.forEach { $0(succeeded, 0.0) }
1264   - strongSelf.requestsToRetry.removeAll()
1265   - }
1266   - }
1267   - } else {
1268   - completion(false, 0.0)
1269   - }
1270   - }
1271   -
1272   - // MARK: - Private - Refresh Tokens
1273   -
1274   - private func refreshTokens(completion: @escaping RefreshCompletion) {
1275   - guard !isRefreshing else { return }
1276   -
1277   - isRefreshing = true
1278   -
1279   - let urlString = "\(baseURLString)/oauth2/token"
1280   -
1281   - let parameters: [String: Any] = [
1282   - "access_token": accessToken,
1283   - "refresh_token": refreshToken,
1284   - "client_id": clientID,
1285   - "grant_type": "refresh_token"
1286   - ]
1287   -
1288   - sessionManager.request(urlString, method: .post, parameters: parameters, encoding: JSONEncoding.default)
1289   - .responseJSON { [weak self] response in
1290   - guard let strongSelf = self else { return }
1291   -
1292   - if let json = response.result.value as? [String: String] {
1293   - completion(true, json["access_token"], json["refresh_token"])
1294   - } else {
1295   - completion(false, nil, nil)
1296   - }
1297   -
1298   - strongSelf.isRefreshing = false
1299   - }
1300   - }
1301   -}
1302   -```
1303   -
1304   -```swift
1305   -let baseURLString = "https://some.domain-behind-oauth2.com"
1306   -
1307   -let oauthHandler = OAuth2Handler(
1308   - clientID: "12345678",
1309   - baseURLString: baseURLString,
1310   - accessToken: "abcd1234",
1311   - refreshToken: "ef56789a"
1312   -)
1313   -
1314   -let sessionManager = SessionManager()
1315   -sessionManager.adapter = oauthHandler
1316   -sessionManager.retrier = oauthHandler
1317   -
1318   -let urlString = "\(baseURLString)/some/endpoint"
1319   -
1320   -sessionManager.request(urlString).validate().responseJSON { response in
1321   - debugPrint(response)
1322   -}
1323   -```
1324   -
1325   -Once the `OAuth2Handler` is applied as both the `adapter` and `retrier` for the `SessionManager`, it will handle an invalid access token error by automatically refreshing the access token and retrying all failed requests in the same order they failed.
1326   -
1327   -> If you needed them to execute in the same order they were created, you could sort them by their task identifiers.
1328   -
1329   -The example above only checks for a `401` response code which is not nearly robust enough, but does demonstrate how one could check for an invalid access token error. In a production application, one would want to check the `realm` and most likely the `www-authenticate` header response although it depends on the OAuth2 implementation.
1330   -
1331   -Another important note is that this authentication system could be shared between multiple session managers. For example, you may need to use both a `default` and `ephemeral` session configuration for the same set of web services. The example above allows the same `oauthHandler` instance to be shared across multiple session managers to manage the single refresh flow.
1332   -
1333   -### Custom Response Serialization
1334   -
1335   -#### Handling Errors
1336   -
1337   -Before implementing custom response serializers or object serialization methods, it's important to consider how to handle any errors that may occur. There are two basic options: passing existing errors along unmodified, to be dealt with at response time; or, wrapping all errors in an `Error` type specific to your app.
1338   -
1339   -For example, here's a simple `BackendError` enum which will be used in later examples:
1340   -
1341   -```swift
1342   -enum BackendError: Error {
1343   - case network(error: Error) // Capture any underlying Error from the URLSession API
1344   - case dataSerialization(error: Error)
1345   - case jsonSerialization(error: Error)
1346   - case xmlSerialization(error: Error)
1347   - case objectSerialization(reason: String)
1348   -}
1349   -```
1350   -
1351   -#### Creating a Custom Response Serializer
1352   -
1353   -Alamofire provides built-in response serialization for strings, JSON, and property lists, but others can be added in extensions on `Alamofire.DataRequest` and / or `Alamofire.DownloadRequest`.
1354   -
1355   -For example, here's how a response handler using [Ono](https://github.com/mattt/Ono) might be implemented:
1356   -
1357   -```swift
1358   -extension DataRequest {
1359   - static func xmlResponseSerializer() -> DataResponseSerializer<ONOXMLDocument> {
1360   - return DataResponseSerializer { request, response, data, error in
1361   - // Pass through any underlying URLSession error to the .network case.
1362   - guard error == nil else { return .failure(BackendError.network(error: error!)) }
1363   -
1364   - // Use Alamofire's existing data serializer to extract the data, passing the error as nil, as it has
1365   - // already been handled.
1366   - let result = Request.serializeResponseData(response: response, data: data, error: nil)
1367   -
1368   - guard case let .success(validData) = result else {
1369   - return .failure(BackendError.dataSerialization(error: result.error! as! AFError))
1370   - }
1371   -
1372   - do {
1373   - let xml = try ONOXMLDocument(data: validData)
1374   - return .success(xml)
1375   - } catch {
1376   - return .failure(BackendError.xmlSerialization(error: error))
1377   - }
1378   - }
1379   - }
1380   -
1381   - @discardableResult
1382   - func responseXMLDocument(
1383   - queue: DispatchQueue? = nil,
1384   - completionHandler: @escaping (DataResponse<ONOXMLDocument>) -> Void)
1385   - -> Self
1386   - {
1387   - return response(
1388   - queue: queue,
1389   - responseSerializer: DataRequest.xmlResponseSerializer(),
1390   - completionHandler: completionHandler
1391   - )
1392   - }
1393   -}
1394   -```
1395   -
1396   -#### Generic Response Object Serialization
1397   -
1398   -Generics can be used to provide automatic, type-safe response object serialization.
1399   -
1400   -```swift
1401   -protocol ResponseObjectSerializable {
1402   - init?(response: HTTPURLResponse, representation: Any)
1403   -}
1404   -
1405   -extension DataRequest {
1406   - func responseObject<T: ResponseObjectSerializable>(
1407   - queue: DispatchQueue? = nil,
1408   - completionHandler: @escaping (DataResponse<T>) -> Void)
1409   - -> Self
1410   - {
1411   - let responseSerializer = DataResponseSerializer<T> { request, response, data, error in
1412   - guard error == nil else { return .failure(BackendError.network(error: error!)) }
1413   -
1414   - let jsonResponseSerializer = DataRequest.jsonResponseSerializer(options: .allowFragments)
1415   - let result = jsonResponseSerializer.serializeResponse(request, response, data, nil)
1416   -
1417   - guard case let .success(jsonObject) = result else {
1418   - return .failure(BackendError.jsonSerialization(error: result.error!))
1419   - }
1420   -
1421   - guard let response = response, let responseObject = T(response: response, representation: jsonObject) else {
1422   - return .failure(BackendError.objectSerialization(reason: "JSON could not be serialized: \(jsonObject)"))
1423   - }
1424   -
1425   - return .success(responseObject)
1426   - }
1427   -
1428   - return response(queue: queue, responseSerializer: responseSerializer, completionHandler: completionHandler)
1429   - }
1430   -}
1431   -```
1432   -
1433   -```swift
1434   -struct User: ResponseObjectSerializable, CustomStringConvertible {
1435   - let username: String
1436   - let name: String
1437   -
1438   - var description: String {
1439   - return "User: { username: \(username), name: \(name) }"
1440   - }
1441   -
1442   - init?(response: HTTPURLResponse, representation: Any) {
1443   - guard
1444   - let username = response.url?.lastPathComponent,
1445   - let representation = representation as? [String: Any],
1446   - let name = representation["name"] as? String
1447   - else { return nil }
1448   -
1449   - self.username = username
1450   - self.name = name
1451   - }
1452   -}
1453   -```
1454   -
1455   -```swift
1456   -Alamofire.request("https://example.com/users/mattt").responseObject { (response: DataResponse<User>) in
1457   - debugPrint(response)
1458   -
1459   - if let user = response.result.value {
1460   - print("User: { username: \(user.username), name: \(user.name) }")
1461   - }
1462   -}
1463   -```
1464   -
1465   -The same approach can also be used to handle endpoints that return a representation of a collection of objects:
1466   -
1467   -```swift
1468   -protocol ResponseCollectionSerializable {
1469   - static func collection(from response: HTTPURLResponse, withRepresentation representation: Any) -> [Self]
1470   -}
1471   -
1472   -extension ResponseCollectionSerializable where Self: ResponseObjectSerializable {
1473   - static func collection(from response: HTTPURLResponse, withRepresentation representation: Any) -> [Self] {
1474   - var collection: [Self] = []
1475   -
1476   - if let representation = representation as? [[String: Any]] {
1477   - for itemRepresentation in representation {
1478   - if let item = Self(response: response, representation: itemRepresentation) {
1479   - collection.append(item)
1480   - }
1481   - }
1482   - }
1483   -
1484   - return collection
1485   - }
1486   -}
1487   -```
1488   -
1489   -```swift
1490   -extension DataRequest {
1491   - @discardableResult
1492   - func responseCollection<T: ResponseCollectionSerializable>(
1493   - queue: DispatchQueue? = nil,
1494   - completionHandler: @escaping (DataResponse<[T]>) -> Void) -> Self
1495   - {
1496   - let responseSerializer = DataResponseSerializer<[T]> { request, response, data, error in
1497   - guard error == nil else { return .failure(BackendError.network(error: error!)) }
1498   -
1499   - let jsonSerializer = DataRequest.jsonResponseSerializer(options: .allowFragments)
1500   - let result = jsonSerializer.serializeResponse(request, response, data, nil)
1501   -
1502   - guard case let .success(jsonObject) = result else {
1503   - return .failure(BackendError.jsonSerialization(error: result.error!))
1504   - }
1505   -
1506   - guard let response = response else {
1507   - let reason = "Response collection could not be serialized due to nil response."
1508   - return .failure(BackendError.objectSerialization(reason: reason))
1509   - }
1510   -
1511   - return .success(T.collection(from: response, withRepresentation: jsonObject))
1512   - }
1513   -
1514   - return response(responseSerializer: responseSerializer, completionHandler: completionHandler)
1515   - }
1516   -}
1517   -```
1518   -
1519   -```swift
1520   -struct User: ResponseObjectSerializable, ResponseCollectionSerializable, CustomStringConvertible {
1521   - let username: String
1522   - let name: String
1523   -
1524   - var description: String {
1525   - return "User: { username: \(username), name: \(name) }"
1526   - }
1527   -
1528   - init?(response: HTTPURLResponse, representation: Any) {
1529   - guard
1530   - let username = response.url?.lastPathComponent,
1531   - let representation = representation as? [String: Any],
1532   - let name = representation["name"] as? String
1533   - else { return nil }
1534   -
1535   - self.username = username
1536   - self.name = name
1537   - }
1538   -}
1539   -```
1540   -
1541   -```swift
1542   -Alamofire.request("https://example.com/users").responseCollection { (response: DataResponse<[User]>) in
1543   - debugPrint(response)
1544   -
1545   - if let users = response.result.value {
1546   - users.forEach { print("- \($0)") }
1547   - }
1548   -}
1549   -```
1550   -
1551   -### Security
1552   -
1553   -Using a secure HTTPS connection when communicating with servers and web services is an important step in securing sensitive data. By default, Alamofire will evaluate the certificate chain provided by the server using Apple's built in validation provided by the Security framework. While this guarantees the certificate chain is valid, it does not prevent man-in-the-middle (MITM) attacks or other potential vulnerabilities. In order to mitigate MITM attacks, applications dealing with sensitive customer data or financial information should use certificate or public key pinning provided by the `ServerTrustPolicy`.
1554   -
1555   -#### ServerTrustPolicy
1556   -
1557   -The `ServerTrustPolicy` enumeration evaluates the server trust generally provided by an `URLAuthenticationChallenge` when connecting to a server over a secure HTTPS connection.
1558   -
1559   -```swift
1560   -let serverTrustPolicy = ServerTrustPolicy.pinCertificates(
1561   - certificates: ServerTrustPolicy.certificatesInBundle(),
1562   - validateCertificateChain: true,
1563   - validateHost: true
1564   -)
1565   -```
1566   -
1567   -There are many different cases of server trust evaluation giving you complete control over the validation process:
1568   -
1569   -* `performDefaultEvaluation`: Uses the default server trust evaluation while allowing you to control whether to validate the host provided by the challenge.
1570   -* `pinCertificates`: Uses the pinned certificates to validate the server trust. The server trust is considered valid if one of the pinned certificates match one of the server certificates.
1571   -* `pinPublicKeys`: Uses the pinned public keys to validate the server trust. The server trust is considered valid if one of the pinned public keys match one of the server certificate public keys.
1572   -* `disableEvaluation`: Disables all evaluation which in turn will always consider any server trust as valid.
1573   -* `customEvaluation`: Uses the associated closure to evaluate the validity of the server trust thus giving you complete control over the validation process. Use with caution.
1574   -
1575   -#### Server Trust Policy Manager
1576   -
1577   -The `ServerTrustPolicyManager` is responsible for storing an internal mapping of server trust policies to a particular host. This allows Alamofire to evaluate each host against a different server trust policy.
  132 +#### Swift 3
1578 133  
1579 134 ```swift
1580   -let serverTrustPolicies: [String: ServerTrustPolicy] = [
1581   - "test.example.com": .pinCertificates(
1582   - certificates: ServerTrustPolicy.certificatesInBundle(),
1583   - validateCertificateChain: true,
1584   - validateHost: true
1585   - ),
1586   - "insecure.expired-apis.com": .disableEvaluation
  135 +dependencies: [
  136 + .Package(url: "https://github.com/Alamofire/Alamofire.git", majorVersion: 4)
1587 137 ]
1588   -
1589   -let sessionManager = SessionManager(
1590   - serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
1591   -)
1592 138 ```
1593 139  
1594   -> Make sure to keep a reference to the new `SessionManager` instance, otherwise your requests will all get cancelled when your `sessionManager` is deallocated.
1595   -
1596   -These server trust policies will result in the following behavior:
1597   -
1598   -- `test.example.com` will always use certificate pinning with certificate chain and host validation enabled thus requiring the following criteria to be met to allow the TLS handshake to succeed:
1599   - - Certificate chain MUST be valid.
1600   - - Certificate chain MUST include one of the pinned certificates.
1601   - - Challenge host MUST match the host in the certificate chain's leaf certificate.
1602   -- `insecure.expired-apis.com` will never evaluate the certificate chain and will always allow the TLS handshake to succeed.
1603   -- All other hosts will use the default evaluation provided by Apple.
1604   -
1605   -##### Subclassing Server Trust Policy Manager
1606   -
1607   -If you find yourself needing more flexible server trust policy matching behavior (i.e. wildcarded domains), then subclass the `ServerTrustPolicyManager` and override the `serverTrustPolicyForHost` method with your own custom implementation.
  140 +#### Swift 4
1608 141  
1609 142 ```swift
1610   -class CustomServerTrustPolicyManager: ServerTrustPolicyManager {
1611   - override func serverTrustPolicy(forHost host: String) -> ServerTrustPolicy? {
1612   - var policy: ServerTrustPolicy?
1613   -
1614   - // Implement your custom domain matching behavior...
1615   -
1616   - return policy
1617   - }
1618   -}
  143 +dependencies: [
  144 + .package(url: "https://github.com/Alamofire/Alamofire.git", from: "4.0.0")
  145 +]
1619 146 ```
1620 147  
1621   -#### Validating the Host
1622   -
1623   -The `.performDefaultEvaluation`, `.pinCertificates` and `.pinPublicKeys` server trust policies all take a `validateHost` parameter. Setting the value to `true` will cause the server trust evaluation to verify that hostname in the certificate matches the hostname of the challenge. If they do not match, evaluation will fail. A `validateHost` value of `false` will still evaluate the full certificate chain, but will not validate the hostname of the leaf certificate.
1624   -
1625   -> It is recommended that `validateHost` always be set to `true` in production environments.
1626   -
1627   -#### Validating the Certificate Chain
1628   -
1629   -Pinning certificates and public keys both have the option of validating the certificate chain using the `validateCertificateChain` parameter. By setting this value to `true`, the full certificate chain will be evaluated in addition to performing a byte equality check against the pinned certificates or public keys. A value of `false` will skip the certificate chain validation, but will still perform the byte equality check.
1630   -
1631   -There are several cases where it may make sense to disable certificate chain validation. The most common use cases for disabling validation are self-signed and expired certificates. The evaluation would always fail in both of these cases, but the byte equality check will still ensure you are receiving the certificate you expect from the server.
1632   -
1633   -> It is recommended that `validateCertificateChain` always be set to `true` in production environments.
1634   -
1635   -#### App Transport Security
1636   -
1637   -With the addition of App Transport Security (ATS) in iOS 9, it is possible that using a custom `ServerTrustPolicyManager` with several `ServerTrustPolicy` objects will have no effect. If you continuously see `CFNetwork SSLHandshake failed (-9806)` errors, you have probably run into this problem. Apple's ATS system overrides the entire challenge system unless you configure the ATS settings in your app's plist to disable enough of it to allow your app to evaluate the server trust.
  148 +### Manually
1638 149  
1639   -If you run into this problem (high probability with self-signed certificates), you can work around this issue by adding the following to your `Info.plist`.
  150 +If you prefer not to use any of the aforementioned dependency managers, you can integrate Alamofire into your project manually.
1640 151  
1641   -```xml
1642   -<dict>
1643   - <key>NSAppTransportSecurity</key>
1644   - <dict>
1645   - <key>NSExceptionDomains</key>
1646   - <dict>
1647   - <key>example.com</key>
1648   - <dict>
1649   - <key>NSExceptionAllowsInsecureHTTPLoads</key>
1650   - <true/>
1651   - <key>NSExceptionRequiresForwardSecrecy</key>
1652   - <false/>
1653   - <key>NSIncludesSubdomains</key>
1654   - <true/>
1655   - <!-- Optional: Specify minimum TLS version -->
1656   - <key>NSTemporaryExceptionMinimumTLSVersion</key>
1657   - <string>TLSv1.2</string>
1658   - </dict>
1659   - </dict>
1660   - </dict>
1661   -</dict>
1662   -```
  152 +#### Embedded Framework
1663 153  
1664   -Whether you need to set the `NSExceptionRequiresForwardSecrecy` to `NO` depends on whether your TLS connection is using an allowed cipher suite. In certain cases, it will need to be set to `NO`. The `NSExceptionAllowsInsecureHTTPLoads` MUST be set to `YES` in order to allow the `SessionDelegate` to receive challenge callbacks. Once the challenge callbacks are being called, the `ServerTrustPolicyManager` will take over the server trust evaluation. You may also need to specify the `NSTemporaryExceptionMinimumTLSVersion` if you're trying to connect to a host that only supports TLS versions less than `1.2`.
  154 +- Open up Terminal, `cd` into your top-level project directory, and run the following command "if" your project is not initialized as a git repository:
1665 155  
1666   -> It is recommended to always use valid certificates in production environments.
  156 + ```bash
  157 + $ git init
  158 + ```
1667 159  
1668   -### Network Reachability
  160 +- Add Alamofire as a git [submodule](http://git-scm.com/docs/git-submodule) by running the following command:
1669 161  
1670   -The `NetworkReachabilityManager` listens for reachability changes of hosts and addresses for both WWAN and WiFi network interfaces.
  162 + ```bash
  163 + $ git submodule add https://github.com/Alamofire/Alamofire.git
  164 + ```
1671 165  
1672   -```swift
1673   -let manager = NetworkReachabilityManager(host: "www.apple.com")
  166 +- Open the new `Alamofire` folder, and drag the `Alamofire.xcodeproj` into the Project Navigator of your application's Xcode project.
1674 167  
1675   -manager?.listener = { status in
1676   - print("Network Status Changed: \(status)")
1677   -}
  168 + > It should appear nested underneath your application's blue project icon. Whether it is above or below all the other Xcode groups does not matter.
1678 169  
1679   -manager?.startListening()
1680   -```
  170 +- Select the `Alamofire.xcodeproj` in the Project Navigator and verify the deployment target matches that of your application target.
  171 +- Next, select your application project in the Project Navigator (blue project icon) to navigate to the target configuration window and select the application target under the "Targets" heading in the sidebar.
  172 +- In the tab bar at the top of that window, open the "General" panel.
  173 +- Click on the `+` button under the "Embedded Binaries" section.
  174 +- You will see two different `Alamofire.xcodeproj` folders each with two different versions of the `Alamofire.framework` nested inside a `Products` folder.
1681 175  
1682   -> Make sure to remember to retain the `manager` in the above example, or no status changes will be reported.
  176 + > It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `Alamofire.framework`.
1683 177  
1684   -There are some important things to remember when using network reachability to determine what to do next.
  178 +- Select the top `Alamofire.framework` for iOS and the bottom one for OS X.
1685 179  
1686   -- **Do NOT** use Reachability to determine if a network request should be sent.
1687   - - You should **ALWAYS** send it.
1688   -- When Reachability is restored, use the event to retry failed network requests.
1689   - - Even though the network requests may still fail, this is a good moment to retry them.
1690   -- The network reachability status can be useful for determining why a network request may have failed.
1691   - - If a network request fails, it is more useful to tell the user that the network request failed due to being offline rather than a more technical error, such as "request timed out."
  180 + > You can verify which one you selected by inspecting the build log for your project. The build target for `Alamofire` will be listed as either `Alamofire iOS`, `Alamofire macOS`, `Alamofire tvOS` or `Alamofire watchOS`.
1692 181  
1693   -> It is recommended to check out [WWDC 2012 Session 706, "Networking Best Practices"](https://developer.apple.com/videos/play/wwdc2012-706/) for more info.
  182 +- And that's it!
1694 183  
1695   ----
  184 + > The `Alamofire.framework` is automagically added as a target dependency, linked framework and embedded framework in a copy files build phase which is all you need to build on the simulator and a device.
1696 185  
1697 186 ## Open Radars
1698 187  
1699 188 The following radars have some effect on the current implementation of Alamofire.
1700 189  
1701 190 - [`rdar://21349340`](http://www.openradar.me/radar?id=5517037090635776) - Compiler throwing warning due to toll-free bridging issue in test case
1702   -- [`rdar://26761490`](http://www.openradar.me/radar?id=5010235949318144) - Swift string interpolation causing memory leak with common usage
1703 191 - `rdar://26870455` - Background URL Session Configurations do not work in the simulator
1704 192 - `rdar://26849668` - Some URLProtocol APIs do not properly handle `URLRequest`
  193 +- [`rdar://36082113`](http://openradar.appspot.com/radar?id=4942308441063424) - `URLSessionTaskMetrics` failing to link on watchOS 3.0+
  194 +
  195 +## Resolved Radars
  196 +
  197 +The following radars have been resolved over time after being filed against the Alamofire project.
  198 +
  199 +- [`rdar://26761490`](http://www.openradar.me/radar?id=5010235949318144) - Swift string interpolation causing memory leak with common usage (Resolved on 9/1/17 in Xcode 9 beta 6).
1705 200  
1706 201 ## FAQ
1707 202  
... ... @@ -1715,8 +210,6 @@ Simple, static data such as paths, parameters and common headers belong in the `
1715 210  
1716 211 The reason the dynamic data MUST be placed into the `RequestAdapter` is to support retry operations. When a `Request` is retried, the original request is not rebuilt meaning the `Router` will not be called again. The `RequestAdapter` is called again allowing the dynamic data to be updated on the original request before retrying the `Request`.
1717 212  
1718   ----
1719   -
1720 213 ## Credits
1721 214  
1722 215 Alamofire is owned and maintained by the [Alamofire Software Foundation](http://alamofire.org). You can follow them on Twitter at [@AlamofireSF](https://twitter.com/AlamofireSF) for project updates and releases.
... ... @@ -1727,18 +220,23 @@ If you believe you have identified a security vulnerability with Alamofire, you
1727 220  
1728 221 ## Donations
1729 222  
1730   -The [ASF](https://github.com/Alamofire/Foundation#members) is looking to raise money to officially register as a federal non-profit organization. Registering will allow us members to gain some legal protections and also allow us to put donations to use, tax free. Donating to the ASF will enable us to:
  223 +The [ASF](https://github.com/Alamofire/Foundation#members) is looking to raise money to officially stay registered as a federal non-profit organization.
  224 +Registering will allow us members to gain some legal protections and also allow us to put donations to use, tax free.
  225 +Donating to the ASF will enable us to:
1731 226  
1732   -- Pay our legal fees to register as a federal non-profit organization
1733 227 - Pay our yearly legal fees to keep the non-profit in good status
1734 228 - Pay for our mail servers to help us stay on top of all questions and security issues
1735 229 - Potentially fund test servers to make it easier for us to test the edge cases
1736 230 - Potentially fund developers to work on one of our projects full-time
1737 231  
1738   -The community adoption of the ASF libraries has been amazing. We are greatly humbled by your enthusiasm around the projects, and want to continue to do everything we can to move the needle forward. With your continued support, the ASF will be able to improve its reach and also provide better legal safety for the core members. If you use any of our libraries for work, see if your employers would be interested in donating. Our initial goal is to raise $1000 to get all our legal ducks in a row and kickstart this campaign. Any amount you can donate today to help us reach our goal would be greatly appreciated.
  232 +The community adoption of the ASF libraries has been amazing.
  233 +We are greatly humbled by your enthusiasm around the projects, and want to continue to do everything we can to move the needle forward.
  234 +With your continued support, the ASF will be able to improve its reach and also provide better legal safety for the core members.
  235 +If you use any of our libraries for work, see if your employers would be interested in donating.
  236 +Any amount you can donate today to help us reach our goal would be greatly appreciated.
1739 237  
1740   -<a href='https://pledgie.com/campaigns/31474'><img alt='Click here to lend your support to: Alamofire Software Foundation and make a donation at pledgie.com !' src='https://pledgie.com/campaigns/31474.png?skin_name=chrome' border='0' ></a>
  238 +[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W34WPEE74APJQ)
1741 239  
1742 240 ## License
1743 241  
1744   -Alamofire is released under the MIT license. See LICENSE for details.
  242 +Alamofire is released under the MIT license. [See LICENSE](https://github.com/Alamofire/Alamofire/blob/master/LICENSE) for details.
... ...
ParentAssistant/Pods/Alamofire/Source/AFError.swift
1 1 //
2 2 // AFError.swift
3 3 //
4   -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 5 //
6 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 // of this software and associated documentation files (the "Software"), to deal
... ... @@ -132,6 +132,16 @@ public enum AFError: Error {
132 132 case responseSerializationFailed(reason: ResponseSerializationFailureReason)
133 133 }
134 134  
  135 +// MARK: - Adapt Error
  136 +
  137 +struct AdaptError: Error {
  138 + let error: Error
  139 +}
  140 +
  141 +extension Error {
  142 + var underlyingAdaptError: Error? { return (self as? AdaptError)?.error }
  143 +}
  144 +
135 145 // MARK: - Error Booleans
136 146  
137 147 extension AFError {
... ...
ParentAssistant/Pods/Alamofire/Source/Alamofire.swift
1 1 //
2 2 // Alamofire.swift
3 3 //
4   -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 5 //
6 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 // of this software and associated documentation files (the "Software"), to deal
... ... @@ -53,7 +53,7 @@ extension URL: URLConvertible {
53 53 }
54 54  
55 55 extension URLComponents: URLConvertible {
56   - /// Returns a URL if `url` is not nil, otherise throws an `Error`.
  56 + /// Returns a URL if `url` is not nil, otherwise throws an `Error`.
57 57 ///
58 58 /// - throws: An `AFError.invalidURL` if `url` is `nil`.
59 59 ///
... ... @@ -222,6 +222,13 @@ public func download(
222 222 /// If `destination` is not specified, the contents will remain in the temporary location determined by the
223 223 /// underlying URL session.
224 224 ///
  225 +/// On the latest release of all the Apple platforms (iOS 10, macOS 10.12, tvOS 10, watchOS 3), `resumeData` is broken
  226 +/// on background URL session configurations. There's an underlying bug in the `resumeData` generation logic where the
  227 +/// data is written incorrectly and will always fail to resume the download. For more information about the bug and
  228 +/// possible workarounds, please refer to the following Stack Overflow post:
  229 +///
  230 +/// - http://stackoverflow.com/a/39347461/1342462
  231 +///
225 232 /// - parameter resumeData: The resume data. This is an opaque data blob produced by `URLSessionDownloadTask`
226 233 /// when a task is cancelled. See `URLSession -downloadTask(withResumeData:)` for additional
227 234 /// information.
... ... @@ -435,6 +442,7 @@ public func upload(
435 442 ///
436 443 /// - returns: The created `StreamRequest`.
437 444 @discardableResult
  445 +@available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
438 446 public func stream(withHostName hostName: String, port: Int) -> StreamRequest {
439 447 return SessionManager.default.stream(withHostName: hostName, port: port)
440 448 }
... ... @@ -449,6 +457,7 @@ public func stream(withHostName hostName: String, port: Int) -&gt; StreamRequest {
449 457 ///
450 458 /// - returns: The created `StreamRequest`.
451 459 @discardableResult
  460 +@available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
452 461 public func stream(with netService: NetService) -> StreamRequest {
453 462 return SessionManager.default.stream(with: netService)
454 463 }
... ...
ParentAssistant/Pods/Alamofire/Source/DispatchQueue+Alamofire.swift
1 1 //
2 2 // DispatchQueue+Alamofire.swift
3 3 //
4   -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 5 //
6 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 // of this software and associated documentation files (the "Software"), to deal
... ... @@ -34,10 +34,4 @@ extension DispatchQueue {
34 34 func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) {
35 35 asyncAfter(deadline: .now() + delay, execute: closure)
36 36 }
37   -
38   - func syncResult<T>(_ closure: () -> T) -> T {
39   - var result: T!
40   - sync { result = closure() }
41   - return result
42   - }
43 37 }
... ...
ParentAssistant/Pods/Alamofire/Source/MultipartFormData.swift
1 1 //
2 2 // MultipartFormData.swift
3 3 //
4   -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 5 //
6 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 // of this software and associated documentation files (the "Software"), to deal
... ... @@ -92,7 +92,7 @@ open class MultipartFormData {
92 92 // MARK: - Properties
93 93  
94 94 /// The `Content-Type` header value containing the boundary used to generate the `multipart/form-data`.
95   - open var contentType: String { return "multipart/form-data; boundary=\(boundary)" }
  95 + open lazy var contentType: String = "multipart/form-data; boundary=\(self.boundary)"
96 96  
97 97 /// The content length of all body parts used to generate the `multipart/form-data` not including the boundaries.
98 98 public var contentLength: UInt64 { return bodyParts.reduce(0) { $0 + $1.bodyContentLength } }
... ... @@ -257,8 +257,7 @@ open class MultipartFormData {
257 257 var isDirectory: ObjCBool = false
258 258 let path = fileURL.path
259 259  
260   - guard FileManager.default.fileExists(atPath: path, isDirectory: &isDirectory) && !isDirectory.boolValue else
261   - {
  260 + guard FileManager.default.fileExists(atPath: path, isDirectory: &isDirectory) && !isDirectory.boolValue else {
262 261 setBodyPartError(withReason: .bodyPartFileIsDirectory(at: fileURL))
263 262 return
264 263 }
... ...
ParentAssistant/Pods/Alamofire/Source/NetworkReachabilityManager.swift
1 1 //
2 2 // NetworkReachabilityManager.swift
3 3 //
4   -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 5 //
6 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 // of this software and associated documentation files (the "Software"), to deal
... ... @@ -34,16 +34,6 @@ import SystemConfiguration
34 34 /// network requests when a connection is established. It should not be used to prevent a user from initiating a network
35 35 /// request, as it's possible that an initial request may be required to establish reachability.
36 36 open class NetworkReachabilityManager {
37   - /**
38   - Defines the various states of network reachability.
39   -
40   - - Unknown: It is unknown whether the network is reachable.
41   - - NotReachable: The network is not reachable.
42   - - ReachableOnWWAN: The network is reachable over the WWAN connection.
43   - - ReachableOnWiFi: The network is reachable over the WiFi connection.
44   - */
45   -
46   -
47 37 /// Defines the various states of network reachability.
48 38 ///
49 39 /// - unknown: It is unknown whether the network is reachable.
... ... @@ -91,7 +81,7 @@ open class NetworkReachabilityManager {
91 81 /// A closure executed when the network reachability status changes.
92 82 open var listener: Listener?
93 83  
94   - private var flags: SCNetworkReachabilityFlags? {
  84 + open var flags: SCNetworkReachabilityFlags? {
95 85 var flags = SCNetworkReachabilityFlags()
96 86  
97 87 if SCNetworkReachabilityGetFlags(reachability, &flags) {
... ... @@ -102,7 +92,7 @@ open class NetworkReachabilityManager {
102 92 }
103 93  
104 94 private let reachability: SCNetworkReachability
105   - private var previousFlags: SCNetworkReachabilityFlags
  95 + open var previousFlags: SCNetworkReachabilityFlags
106 96  
107 97 // MARK: - Initialization
108 98  
... ... @@ -192,21 +182,24 @@ open class NetworkReachabilityManager {
192 182 // MARK: - Internal - Network Reachability Status
193 183  
194 184 func networkReachabilityStatusForFlags(_ flags: SCNetworkReachabilityFlags) -> NetworkReachabilityStatus {
195   - guard flags.contains(.reachable) else { return .notReachable }
  185 + guard isNetworkReachable(with: flags) else { return .notReachable }
196 186  
197   - var networkStatus: NetworkReachabilityStatus = .notReachable
  187 + var networkStatus: NetworkReachabilityStatus = .reachable(.ethernetOrWiFi)
198 188  
199   - if !flags.contains(.connectionRequired) { networkStatus = .reachable(.ethernetOrWiFi) }
  189 + #if os(iOS)
  190 + if flags.contains(.isWWAN) { networkStatus = .reachable(.wwan) }
  191 + #endif
200 192  
201   - if flags.contains(.connectionOnDemand) || flags.contains(.connectionOnTraffic) {
202   - if !flags.contains(.interventionRequired) { networkStatus = .reachable(.ethernetOrWiFi) }
203   - }
  193 + return networkStatus
  194 + }
204 195  
205   - #if os(iOS)
206   - if flags.contains(.isWWAN) { networkStatus = .reachable(.wwan) }
207   - #endif
  196 + func isNetworkReachable(with flags: SCNetworkReachabilityFlags) -> Bool {
  197 + let isReachable = flags.contains(.reachable)
  198 + let needsConnection = flags.contains(.connectionRequired)
  199 + let canConnectAutomatically = flags.contains(.connectionOnDemand) || flags.contains(.connectionOnTraffic)
  200 + let canConnectWithoutUserInteraction = canConnectAutomatically && !flags.contains(.interventionRequired)
208 201  
209   - return networkStatus
  202 + return isReachable && (!needsConnection || canConnectWithoutUserInteraction)
210 203 }
211 204 }
212 205  
... ...
ParentAssistant/Pods/Alamofire/Source/Notifications.swift
1 1 //
2 2 // Notifications.swift
3 3 //
4   -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 5 //
6 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 // of this software and associated documentation files (the "Software"), to deal
... ... @@ -48,5 +48,8 @@ extension Notification {
48 48 public struct Key {
49 49 /// User info dictionary key representing the `URLSessionTask` associated with the notification.
50 50 public static let Task = "org.alamofire.notification.key.task"
  51 +
  52 + /// User info dictionary key representing the responseData associated with the notification.
  53 + public static let ResponseData = "org.alamofire.notification.key.responseData"
51 54 }
52 55 }
... ...
ParentAssistant/Pods/Alamofire/Source/ParameterEncoding.swift
1 1 //
2 2 // ParameterEncoding.swift
3 3 //
4   -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 5 //
6 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 // of this software and associated documentation files (the "Software"), to deal
... ... @@ -64,9 +64,15 @@ public protocol ParameterEncoding {
64 64 /// the HTTP body depends on the destination of the encoding.
65 65 ///
66 66 /// The `Content-Type` HTTP header field of an encoded request with HTTP body is set to
67   -/// `application/x-www-form-urlencoded; charset=utf-8`. Since there is no published specification for how to encode
68   -/// collection types, the convention of appending `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending
69   -/// the key surrounded by square brackets for nested dictionary values (`foo[bar]=baz`).
  67 +/// `application/x-www-form-urlencoded; charset=utf-8`.
  68 +///
  69 +/// There is no published specification for how to encode collection types. By default the convention of appending
  70 +/// `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for
  71 +/// nested dictionary values (`foo[bar]=baz`) is used. Optionally, `ArrayEncoding` can be used to omit the
  72 +/// square brackets appended to array keys.
  73 +///
  74 +/// `BoolEncoding` can be used to configure how boolean values are encoded. The default behavior is to encode
  75 +/// `true` as 1 and `false` as 0.
70 76 public struct URLEncoding: ParameterEncoding {
71 77  
72 78 // MARK: Helper Types
... ... @@ -82,6 +88,41 @@ public struct URLEncoding: ParameterEncoding {
82 88 case methodDependent, queryString, httpBody
83 89 }
84 90  
  91 + /// Configures how `Array` parameters are encoded.
  92 + ///
  93 + /// - brackets: An empty set of square brackets is appended to the key for every value.
  94 + /// This is the default behavior.
  95 + /// - noBrackets: No brackets are appended. The key is encoded as is.
  96 + public enum ArrayEncoding {
  97 + case brackets, noBrackets
  98 +
  99 + func encode(key: String) -> String {
  100 + switch self {
  101 + case .brackets:
  102 + return "\(key)[]"
  103 + case .noBrackets:
  104 + return key
  105 + }
  106 + }
  107 + }
  108 +
  109 + /// Configures how `Bool` parameters are encoded.
  110 + ///
  111 + /// - numeric: Encode `true` as `1` and `false` as `0`. This is the default behavior.
  112 + /// - literal: Encode `true` and `false` as string literals.
  113 + public enum BoolEncoding {
  114 + case numeric, literal
  115 +
  116 + func encode(value: Bool) -> String {
  117 + switch self {
  118 + case .numeric:
  119 + return value ? "1" : "0"
  120 + case .literal:
  121 + return value ? "true" : "false"
  122 + }
  123 + }
  124 + }
  125 +
85 126 // MARK: Properties
86 127  
87 128 /// Returns a default `URLEncoding` instance.
... ... @@ -99,15 +140,25 @@ public struct URLEncoding: ParameterEncoding {
99 140 /// The destination defining where the encoded query string is to be applied to the URL request.
100 141 public let destination: Destination
101 142  
  143 + /// The encoding to use for `Array` parameters.
  144 + public let arrayEncoding: ArrayEncoding
  145 +
  146 + /// The encoding to use for `Bool` parameters.
  147 + public let boolEncoding: BoolEncoding
  148 +
102 149 // MARK: Initialization
103 150  
104 151 /// Creates a `URLEncoding` instance using the specified destination.
105 152 ///
106 153 /// - parameter destination: The destination defining where the encoded query string is to be applied.
  154 + /// - parameter arrayEncoding: The encoding to use for `Array` parameters.
  155 + /// - parameter boolEncoding: The encoding to use for `Bool` parameters.
107 156 ///
108 157 /// - returns: The new `URLEncoding` instance.
109   - public init(destination: Destination = .methodDependent) {
  158 + public init(destination: Destination = .methodDependent, arrayEncoding: ArrayEncoding = .brackets, boolEncoding: BoolEncoding = .numeric) {
110 159 self.destination = destination
  160 + self.arrayEncoding = arrayEncoding
  161 + self.boolEncoding = boolEncoding
111 162 }
112 163  
113 164 // MARK: Encoding
... ... @@ -161,16 +212,16 @@ public struct URLEncoding: ParameterEncoding {
161 212 }
162 213 } else if let array = value as? [Any] {
163 214 for value in array {
164   - components += queryComponents(fromKey: "\(key)[]", value: value)
  215 + components += queryComponents(fromKey: arrayEncoding.encode(key: key), value: value)
165 216 }
166 217 } else if let value = value as? NSNumber {
167 218 if value.isBool {
168   - components.append((escape(key), escape((value.boolValue ? "1" : "0"))))
  219 + components.append((escape(key), escape(boolEncoding.encode(value: value.boolValue))))
169 220 } else {
170 221 components.append((escape(key), escape("\(value)")))
171 222 }
172 223 } else if let bool = value as? Bool {
173   - components.append((escape(key), escape((bool ? "1" : "0"))))
  224 + components.append((escape(key), escape(boolEncoding.encode(value: bool))))
174 225 } else {
175 226 components.append((escape(key), escape("\(value)")))
176 227 }
... ... @@ -199,7 +250,39 @@ public struct URLEncoding: ParameterEncoding {
199 250 var allowedCharacterSet = CharacterSet.urlQueryAllowed
200 251 allowedCharacterSet.remove(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)")
201 252  
202   - return string.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) ?? string
  253 + var escaped = ""
  254 +
  255 + //==========================================================================================================
  256 + //
  257 + // Batching is required for escaping due to an internal bug in iOS 8.1 and 8.2. Encoding more than a few
  258 + // hundred Chinese characters causes various malloc error crashes. To avoid this issue until iOS 8 is no
  259 + // longer supported, batching MUST be used for encoding. This introduces roughly a 20% overhead. For more
  260 + // info, please refer to:
  261 + //
  262 + // - https://github.com/Alamofire/Alamofire/issues/206
  263 + //
  264 + //==========================================================================================================
  265 +
  266 + if #available(iOS 8.3, *) {
  267 + escaped = string.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) ?? string
  268 + } else {
  269 + let batchSize = 50
  270 + var index = string.startIndex
  271 +
  272 + while index != string.endIndex {
  273 + let startIndex = index
  274 + let endIndex = string.index(index, offsetBy: batchSize, limitedBy: string.endIndex) ?? string.endIndex
  275 + let range = startIndex..<endIndex
  276 +
  277 + let substring = string[range]
  278 +
  279 + escaped += substring.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) ?? String(substring)
  280 +
  281 + index = endIndex
  282 + }
  283 + }
  284 +
  285 + return escaped
203 286 }
204 287  
205 288 private func query(_ parameters: [String: Any]) -> String {
... ... @@ -209,7 +292,6 @@ public struct URLEncoding: ParameterEncoding {
209 292 let value = parameters[key]!
210 293 components += queryComponents(fromKey: key, value: value)
211 294 }
212   -
213 295 return components.map { "\($0)=\($1)" }.joined(separator: "&")
214 296 }
215 297  
... ... @@ -289,6 +371,34 @@ public struct JSONEncoding: ParameterEncoding {
289 371  
290 372 return urlRequest
291 373 }
  374 +
  375 + /// Creates a URL request by encoding the JSON object and setting the resulting data on the HTTP body.
  376 + ///
  377 + /// - parameter urlRequest: The request to apply the JSON object to.
  378 + /// - parameter jsonObject: The JSON object to apply to the request.
  379 + ///
  380 + /// - throws: An `Error` if the encoding process encounters an error.
  381 + ///
  382 + /// - returns: The encoded request.
  383 + public func encode(_ urlRequest: URLRequestConvertible, withJSONObject jsonObject: Any? = nil) throws -> URLRequest {
  384 + var urlRequest = try urlRequest.asURLRequest()
  385 +
  386 + guard let jsonObject = jsonObject else { return urlRequest }
  387 +
  388 + do {
  389 + let data = try JSONSerialization.data(withJSONObject: jsonObject, options: options)
  390 +
  391 + if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil {
  392 + urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
  393 + }
  394 +
  395 + urlRequest.httpBody = data
  396 + } catch {
  397 + throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error))
  398 + }
  399 +
  400 + return urlRequest
  401 + }
292 402 }
293 403  
294 404 // MARK: -
... ...
ParentAssistant/Pods/Alamofire/Source/Request.swift
1 1 //
2 2 // Request.swift
3 3 //
4   -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 5 //
6 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 // of this software and associated documentation files (the "Software"), to deal
... ... @@ -46,7 +46,7 @@ public typealias RequestRetryCompletion = (_ shouldRetry: Bool, _ timeDelay: Tim
46 46 public protocol RequestRetrier {
47 47 /// Determines whether the `Request` should be retried by calling the `completion` closure.
48 48 ///
49   - /// This operation is fully asychronous. Any amount of time can be taken to determine whether the request needs
  49 + /// This operation is fully asynchronous. Any amount of time can be taken to determine whether the request needs
50 50 /// to be retried. The one requirement is that the completion closure is called to ensure the request is properly
51 51 /// cleaned up after.
52 52 ///
... ... @@ -110,6 +110,9 @@ open class Request {
110 110 /// The response received from the server, if any.
111 111 open var response: HTTPURLResponse? { return task?.response as? HTTPURLResponse }
112 112  
  113 + /// The number of times the request has been retried.
  114 + open internal(set) var retryCount: UInt = 0
  115 +
113 116 let originalTask: TaskConvertible?
114 117  
115 118 var startTime: CFAbsoluteTime?
... ... @@ -266,7 +269,7 @@ extension Request: CustomDebugStringConvertible {
266 269 }
267 270  
268 271 func cURLRepresentation() -> String {
269   - var components = ["$ curl -i"]
  272 + var components = ["$ curl -v"]
270 273  
271 274 guard let request = self.request,
272 275 let url = request.url,
... ... @@ -290,11 +293,12 @@ extension Request: CustomDebugStringConvertible {
290 293  
291 294 if let credentials = credentialStorage.credentials(for: protectionSpace)?.values {
292 295 for credential in credentials {
293   - components.append("-u \(credential.user!):\(credential.password!)")
  296 + guard let user = credential.user, let password = credential.password else { continue }
  297 + components.append("-u \(user):\(password)")
294 298 }
295 299 } else {
296   - if let credential = delegate.credential {
297   - components.append("-u \(credential.user!):\(credential.password!)")
  300 + if let credential = delegate.credential, let user = credential.user, let password = credential.password {
  301 + components.append("-u \(user):\(password)")
298 302 }
299 303 }
300 304 }
... ... @@ -305,7 +309,12 @@ extension Request: CustomDebugStringConvertible {
305 309 let cookies = cookieStorage.cookies(for: url), !cookies.isEmpty
306 310 {
307 311 let string = cookies.reduce("") { $0 + "\($1.name)=\($1.value);" }
  312 +
  313 + #if swift(>=3.2)
  314 + components.append("-b \"\(string[..<string.index(before: string.endIndex)])\"")
  315 + #else
308 316 components.append("-b \"\(string.substring(to: string.characters.index(before: string.endIndex)))\"")
  317 + #endif
309 318 }
310 319 }
311 320  
... ... @@ -324,7 +333,8 @@ extension Request: CustomDebugStringConvertible {
324 333 }
325 334  
326 335 for (field, value) in headers {
327   - components.append("-H \"\(field): \(value)\"")
  336 + let escapedValue = String(describing: value).replacingOccurrences(of: "\"", with: "\\\"")
  337 + components.append("-H \"\(field): \(escapedValue)\"")
328 338 }
329 339  
330 340 if let httpBodyData = request.httpBody, let httpBody = String(data: httpBodyData, encoding: .utf8) {
... ... @@ -351,13 +361,25 @@ open class DataRequest: Request {
351 361 let urlRequest: URLRequest
352 362  
353 363 func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask {
354   - let urlRequest = try self.urlRequest.adapt(using: adapter)
355   - return queue.syncResult { session.dataTask(with: urlRequest) }
  364 + do {
  365 + let urlRequest = try self.urlRequest.adapt(using: adapter)
  366 + return queue.sync { session.dataTask(with: urlRequest) }
  367 + } catch {
  368 + throw AdaptError(error: error)
  369 + }
356 370 }
357 371 }
358 372  
359 373 // MARK: Properties
360 374  
  375 + /// The request sent or to be sent to the server.
  376 + open override var request: URLRequest? {
  377 + if let request = super.request { return request }
  378 + if let requestable = originalTask as? Requestable { return requestable.urlRequest }
  379 +
  380 + return nil
  381 + }
  382 +
361 383 /// The progress of fetching the response data from the server for the request.
362 384 open var progress: Progress { return dataDelegate.progress }
363 385  
... ... @@ -438,22 +460,37 @@ open class DownloadRequest: Request {
438 460 case resumeData(Data)
439 461  
440 462 func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask {
441   - let task: URLSessionTask
  463 + do {
  464 + let task: URLSessionTask
  465 +
  466 + switch self {
  467 + case let .request(urlRequest):
  468 + let urlRequest = try urlRequest.adapt(using: adapter)
  469 + task = queue.sync { session.downloadTask(with: urlRequest) }
  470 + case let .resumeData(resumeData):
  471 + task = queue.sync { session.downloadTask(withResumeData: resumeData) }
  472 + }
442 473  
443   - switch self {
444   - case let .request(urlRequest):
445   - let urlRequest = try urlRequest.adapt(using: adapter)
446   - task = queue.syncResult { session.downloadTask(with: urlRequest) }
447   - case let .resumeData(resumeData):
448   - task = queue.syncResult { session.downloadTask(withResumeData: resumeData) }
  474 + return task
  475 + } catch {
  476 + throw AdaptError(error: error)
449 477 }
450   -
451   - return task
452 478 }
453 479 }
454 480  
455 481 // MARK: Properties
456 482  
  483 + /// The request sent or to be sent to the server.
  484 + open override var request: URLRequest? {
  485 + if let request = super.request { return request }
  486 +
  487 + if let downloadable = originalTask as? Downloadable, case let .request(urlRequest) = downloadable {
  488 + return urlRequest
  489 + }
  490 +
  491 + return nil
  492 + }
  493 +
457 494 /// The resume data of the underlying download task if available after a failure.
458 495 open var resumeData: Data? { return downloadDelegate.resumeData }
459 496  
... ... @@ -471,7 +508,7 @@ open class DownloadRequest: Request {
471 508 NotificationCenter.default.post(
472 509 name: Notification.Name.Task.DidCancel,
473 510 object: self,
474   - userInfo: [Notification.Key.Task: task]
  511 + userInfo: [Notification.Key.Task: task as Any]
475 512 )
476 513 }
477 514  
... ... @@ -528,26 +565,42 @@ open class UploadRequest: DataRequest {
528 565 case stream(InputStream, URLRequest)
529 566  
530 567 func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask {
531   - let task: URLSessionTask
  568 + do {
  569 + let task: URLSessionTask
  570 +
  571 + switch self {
  572 + case let .data(data, urlRequest):
  573 + let urlRequest = try urlRequest.adapt(using: adapter)
  574 + task = queue.sync { session.uploadTask(with: urlRequest, from: data) }
  575 + case let .file(url, urlRequest):
  576 + let urlRequest = try urlRequest.adapt(using: adapter)
  577 + task = queue.sync { session.uploadTask(with: urlRequest, fromFile: url) }
  578 + case let .stream(_, urlRequest):
  579 + let urlRequest = try urlRequest.adapt(using: adapter)
  580 + task = queue.sync { session.uploadTask(withStreamedRequest: urlRequest) }
  581 + }
532 582  
533   - switch self {
534   - case let .data(data, urlRequest):
535   - let urlRequest = try urlRequest.adapt(using: adapter)
536   - task = queue.syncResult { session.uploadTask(with: urlRequest, from: data) }
537   - case let .file(url, urlRequest):
538   - let urlRequest = try urlRequest.adapt(using: adapter)
539   - task = queue.syncResult { session.uploadTask(with: urlRequest, fromFile: url) }
540   - case let .stream(_, urlRequest):
541   - let urlRequest = try urlRequest.adapt(using: adapter)
542   - task = queue.syncResult { session.uploadTask(withStreamedRequest: urlRequest) }
  583 + return task
  584 + } catch {
  585 + throw AdaptError(error: error)
543 586 }
544   -
545   - return task
546 587 }
547 588 }
548 589  
549 590 // MARK: Properties
550 591  
  592 + /// The request sent or to be sent to the server.
  593 + open override var request: URLRequest? {
  594 + if let request = super.request { return request }
  595 +
  596 + guard let uploadable = originalTask as? Uploadable else { return nil }
  597 +
  598 + switch uploadable {
  599 + case .data(_, let urlRequest), .file(_, let urlRequest), .stream(_, let urlRequest):
  600 + return urlRequest
  601 + }
  602 + }
  603 +
551 604 /// The progress of uploading the payload to the server for the upload request.
552 605 open var uploadProgress: Progress { return uploadDelegate.uploadProgress }
553 606  
... ... @@ -577,6 +630,7 @@ open class UploadRequest: DataRequest {
577 630 #if !os(watchOS)
578 631  
579 632 /// Specific type of `Request` that manages an underlying `URLSessionStreamTask`.
  633 +@available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
580 634 open class StreamRequest: Request {
581 635 enum Streamable: TaskConvertible {
582 636 case stream(hostName: String, port: Int)
... ... @@ -587,9 +641,9 @@ open class StreamRequest: Request {
587 641  
588 642 switch self {
589 643 case let .stream(hostName, port):
590   - task = queue.syncResult { session.streamTask(withHostName: hostName, port: port) }
  644 + task = queue.sync { session.streamTask(withHostName: hostName, port: port) }
591 645 case let .netService(netService):
592   - task = queue.syncResult { session.streamTask(with: netService) }
  646 + task = queue.sync { session.streamTask(with: netService) }
593 647 }
594 648  
595 649 return task
... ...
ParentAssistant/Pods/Alamofire/Source/Response.swift
1 1 //
2 2 // Response.swift
3 3 //
4   -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 5 //
6 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 // of this software and associated documentation files (the "Software"), to deal
... ... @@ -38,13 +38,33 @@ public struct DefaultDataResponse {
38 38 /// The error encountered while executing or validating the request.
39 39 public let error: Error?
40 40  
  41 + /// The timeline of the complete lifecycle of the request.
  42 + public let timeline: Timeline
  43 +
41 44 var _metrics: AnyObject?
42 45  
43   - init(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) {
  46 + /// Creates a `DefaultDataResponse` instance from the specified parameters.
  47 + ///
  48 + /// - Parameters:
  49 + /// - request: The URL request sent to the server.
  50 + /// - response: The server's response to the URL request.
  51 + /// - data: The data returned by the server.
  52 + /// - error: The error encountered while executing or validating the request.
  53 + /// - timeline: The timeline of the complete lifecycle of the request. `Timeline()` by default.
  54 + /// - metrics: The task metrics containing the request / response statistics. `nil` by default.
  55 + public init(
  56 + request: URLRequest?,
  57 + response: HTTPURLResponse?,
  58 + data: Data?,
  59 + error: Error?,
  60 + timeline: Timeline = Timeline(),
  61 + metrics: AnyObject? = nil)
  62 + {
44 63 self.request = request
45 64 self.response = response
46 65 self.data = data
47 66 self.error = error
  67 + self.timeline = timeline
48 68 }
49 69 }
50 70  
... ... @@ -64,9 +84,15 @@ public struct DataResponse&lt;Value&gt; {
64 84 /// The result of response serialization.
65 85 public let result: Result<Value>
66 86  
67   - /// The timeline of the complete lifecycle of the `Request`.
  87 + /// The timeline of the complete lifecycle of the request.
68 88 public let timeline: Timeline
69 89  
  90 + /// Returns the associated value of the result if it is a success, `nil` otherwise.
  91 + public var value: Value? { return result.value }
  92 +
  93 + /// Returns the associated error value if the result if it is a failure, `nil` otherwise.
  94 + public var error: Error? { return result.error }
  95 +
70 96 var _metrics: AnyObject?
71 97  
72 98 /// Creates a `DataResponse` instance with the specified parameters derived from response serialization.
... ... @@ -107,7 +133,7 @@ extension DataResponse: CustomStringConvertible, CustomDebugStringConvertible {
107 133 public var debugDescription: String {
108 134 var output: [String] = []
109 135  
110   - output.append(request != nil ? "[Request]: \(request!)" : "[Request]: nil")
  136 + output.append(request != nil ? "[Request]: \(request!.httpMethod ?? "GET") \(request!)" : "[Request]: nil")
111 137 output.append(response != nil ? "[Response]: \(response!)" : "[Response]: nil")
112 138 output.append("[Data]: \(data?.count ?? 0) bytes")
113 139 output.append("[Result]: \(result.debugDescription)")
... ... @@ -119,6 +145,113 @@ extension DataResponse: CustomStringConvertible, CustomDebugStringConvertible {
119 145  
120 146 // MARK: -
121 147  
  148 +extension DataResponse {
  149 + /// Evaluates the specified closure when the result of this `DataResponse` is a success, passing the unwrapped
  150 + /// result value as a parameter.
  151 + ///
  152 + /// Use the `map` method with a closure that does not throw. For example:
  153 + ///
  154 + /// let possibleData: DataResponse<Data> = ...
  155 + /// let possibleInt = possibleData.map { $0.count }
  156 + ///
  157 + /// - parameter transform: A closure that takes the success value of the instance's result.
  158 + ///
  159 + /// - returns: A `DataResponse` whose result wraps the value returned by the given closure. If this instance's
  160 + /// result is a failure, returns a response wrapping the same failure.
  161 + public func map<T>(_ transform: (Value) -> T) -> DataResponse<T> {
  162 + var response = DataResponse<T>(
  163 + request: request,
  164 + response: self.response,
  165 + data: data,
  166 + result: result.map(transform),
  167 + timeline: timeline
  168 + )
  169 +
  170 + response._metrics = _metrics
  171 +
  172 + return response
  173 + }
  174 +
  175 + /// Evaluates the given closure when the result of this `DataResponse` is a success, passing the unwrapped result
  176 + /// value as a parameter.
  177 + ///
  178 + /// Use the `flatMap` method with a closure that may throw an error. For example:
  179 + ///
  180 + /// let possibleData: DataResponse<Data> = ...
  181 + /// let possibleObject = possibleData.flatMap {
  182 + /// try JSONSerialization.jsonObject(with: $0)
  183 + /// }
  184 + ///
  185 + /// - parameter transform: A closure that takes the success value of the instance's result.
  186 + ///
  187 + /// - returns: A success or failure `DataResponse` depending on the result of the given closure. If this instance's
  188 + /// result is a failure, returns the same failure.
  189 + public func flatMap<T>(_ transform: (Value) throws -> T) -> DataResponse<T> {
  190 + var response = DataResponse<T>(
  191 + request: request,
  192 + response: self.response,
  193 + data: data,
  194 + result: result.flatMap(transform),
  195 + timeline: timeline
  196 + )
  197 +
  198 + response._metrics = _metrics
  199 +
  200 + return response
  201 + }
  202 +
  203 + /// Evaluates the specified closure when the `DataResponse` is a failure, passing the unwrapped error as a parameter.
  204 + ///
  205 + /// Use the `mapError` function with a closure that does not throw. For example:
  206 + ///
  207 + /// let possibleData: DataResponse<Data> = ...
  208 + /// let withMyError = possibleData.mapError { MyError.error($0) }
  209 + ///
  210 + /// - Parameter transform: A closure that takes the error of the instance.
  211 + /// - Returns: A `DataResponse` instance containing the result of the transform.
  212 + public func mapError<E: Error>(_ transform: (Error) -> E) -> DataResponse {
  213 + var response = DataResponse(
  214 + request: request,
  215 + response: self.response,
  216 + data: data,
  217 + result: result.mapError(transform),
  218 + timeline: timeline
  219 + )
  220 +
  221 + response._metrics = _metrics
  222 +
  223 + return response
  224 + }
  225 +
  226 + /// Evaluates the specified closure when the `DataResponse` is a failure, passing the unwrapped error as a parameter.
  227 + ///
  228 + /// Use the `flatMapError` function with a closure that may throw an error. For example:
  229 + ///
  230 + /// let possibleData: DataResponse<Data> = ...
  231 + /// let possibleObject = possibleData.flatMapError {
  232 + /// try someFailableFunction(taking: $0)
  233 + /// }
  234 + ///
  235 + /// - Parameter transform: A throwing closure that takes the error of the instance.
  236 + ///
  237 + /// - Returns: A `DataResponse` instance containing the result of the transform.
  238 + public func flatMapError<E: Error>(_ transform: (Error) throws -> E) -> DataResponse {
  239 + var response = DataResponse(
  240 + request: request,
  241 + response: self.response,
  242 + data: data,
  243 + result: result.flatMapError(transform),
  244 + timeline: timeline
  245 + )
  246 +
  247 + response._metrics = _metrics
  248 +
  249 + return response
  250 + }
  251 +}
  252 +
  253 +// MARK: -
  254 +
122 255 /// Used to store all data associated with an non-serialized response of a download request.
123 256 public struct DefaultDownloadResponse {
124 257 /// The URL request sent to the server.
... ... @@ -139,15 +272,31 @@ public struct DefaultDownloadResponse {
139 272 /// The error encountered while executing or validating the request.
140 273 public let error: Error?
141 274  
  275 + /// The timeline of the complete lifecycle of the request.
  276 + public let timeline: Timeline
  277 +
142 278 var _metrics: AnyObject?
143 279  
144   - init(
  280 + /// Creates a `DefaultDownloadResponse` instance from the specified parameters.
  281 + ///
  282 + /// - Parameters:
  283 + /// - request: The URL request sent to the server.
  284 + /// - response: The server's response to the URL request.
  285 + /// - temporaryURL: The temporary destination URL of the data returned from the server.
  286 + /// - destinationURL: The final destination URL of the data returned from the server if it was moved.
  287 + /// - resumeData: The resume data generated if the request was cancelled.
  288 + /// - error: The error encountered while executing or validating the request.
  289 + /// - timeline: The timeline of the complete lifecycle of the request. `Timeline()` by default.
  290 + /// - metrics: The task metrics containing the request / response statistics. `nil` by default.
  291 + public init(
145 292 request: URLRequest?,
146 293 response: HTTPURLResponse?,
147 294 temporaryURL: URL?,
148 295 destinationURL: URL?,
149 296 resumeData: Data?,
150   - error: Error?)
  297 + error: Error?,
  298 + timeline: Timeline = Timeline(),
  299 + metrics: AnyObject? = nil)
151 300 {
152 301 self.request = request
153 302 self.response = response
... ... @@ -155,6 +304,7 @@ public struct DefaultDownloadResponse {
155 304 self.destinationURL = destinationURL
156 305 self.resumeData = resumeData
157 306 self.error = error
  307 + self.timeline = timeline
158 308 }
159 309 }
160 310  
... ... @@ -183,6 +333,12 @@ public struct DownloadResponse&lt;Value&gt; {
183 333 /// The timeline of the complete lifecycle of the request.
184 334 public let timeline: Timeline
185 335  
  336 + /// Returns the associated value of the result if it is a success, `nil` otherwise.
  337 + public var value: Value? { return result.value }
  338 +
  339 + /// Returns the associated error value if the result if it is a failure, `nil` otherwise.
  340 + public var error: Error? { return result.error }
  341 +
186 342 var _metrics: AnyObject?
187 343  
188 344 /// Creates a `DownloadResponse` instance with the specified parameters derived from response serialization.
... ... @@ -230,7 +386,7 @@ extension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertibl
230 386 public var debugDescription: String {
231 387 var output: [String] = []
232 388  
233   - output.append(request != nil ? "[Request]: \(request!)" : "[Request]: nil")
  389 + output.append(request != nil ? "[Request]: \(request!.httpMethod ?? "GET") \(request!)" : "[Request]: nil")
234 390 output.append(response != nil ? "[Response]: \(response!)" : "[Response]: nil")
235 391 output.append("[TemporaryURL]: \(temporaryURL?.path ?? "nil")")
236 392 output.append("[DestinationURL]: \(destinationURL?.path ?? "nil")")
... ... @@ -244,6 +400,121 @@ extension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertibl
244 400  
245 401 // MARK: -
246 402  
  403 +extension DownloadResponse {
  404 + /// Evaluates the given closure when the result of this `DownloadResponse` is a success, passing the unwrapped
  405 + /// result value as a parameter.
  406 + ///
  407 + /// Use the `map` method with a closure that does not throw. For example:
  408 + ///
  409 + /// let possibleData: DownloadResponse<Data> = ...
  410 + /// let possibleInt = possibleData.map { $0.count }
  411 + ///
  412 + /// - parameter transform: A closure that takes the success value of the instance's result.
  413 + ///
  414 + /// - returns: A `DownloadResponse` whose result wraps the value returned by the given closure. If this instance's
  415 + /// result is a failure, returns a response wrapping the same failure.
  416 + public func map<T>(_ transform: (Value) -> T) -> DownloadResponse<T> {
  417 + var response = DownloadResponse<T>(
  418 + request: request,
  419 + response: self.response,
  420 + temporaryURL: temporaryURL,
  421 + destinationURL: destinationURL,
  422 + resumeData: resumeData,
  423 + result: result.map(transform),
  424 + timeline: timeline
  425 + )
  426 +
  427 + response._metrics = _metrics
  428 +
  429 + return response
  430 + }
  431 +
  432 + /// Evaluates the given closure when the result of this `DownloadResponse` is a success, passing the unwrapped
  433 + /// result value as a parameter.
  434 + ///
  435 + /// Use the `flatMap` method with a closure that may throw an error. For example:
  436 + ///
  437 + /// let possibleData: DownloadResponse<Data> = ...
  438 + /// let possibleObject = possibleData.flatMap {
  439 + /// try JSONSerialization.jsonObject(with: $0)
  440 + /// }
  441 + ///
  442 + /// - parameter transform: A closure that takes the success value of the instance's result.
  443 + ///
  444 + /// - returns: A success or failure `DownloadResponse` depending on the result of the given closure. If this
  445 + /// instance's result is a failure, returns the same failure.
  446 + public func flatMap<T>(_ transform: (Value) throws -> T) -> DownloadResponse<T> {
  447 + var response = DownloadResponse<T>(
  448 + request: request,
  449 + response: self.response,
  450 + temporaryURL: temporaryURL,
  451 + destinationURL: destinationURL,
  452 + resumeData: resumeData,
  453 + result: result.flatMap(transform),
  454 + timeline: timeline
  455 + )
  456 +
  457 + response._metrics = _metrics
  458 +
  459 + return response
  460 + }
  461 +
  462 + /// Evaluates the specified closure when the `DownloadResponse` is a failure, passing the unwrapped error as a parameter.
  463 + ///
  464 + /// Use the `mapError` function with a closure that does not throw. For example:
  465 + ///
  466 + /// let possibleData: DownloadResponse<Data> = ...
  467 + /// let withMyError = possibleData.mapError { MyError.error($0) }
  468 + ///
  469 + /// - Parameter transform: A closure that takes the error of the instance.
  470 + /// - Returns: A `DownloadResponse` instance containing the result of the transform.
  471 + public func mapError<E: Error>(_ transform: (Error) -> E) -> DownloadResponse {
  472 + var response = DownloadResponse(
  473 + request: request,
  474 + response: self.response,
  475 + temporaryURL: temporaryURL,
  476 + destinationURL: destinationURL,
  477 + resumeData: resumeData,
  478 + result: result.mapError(transform),
  479 + timeline: timeline
  480 + )
  481 +
  482 + response._metrics = _metrics
  483 +
  484 + return response
  485 + }
  486 +
  487 + /// Evaluates the specified closure when the `DownloadResponse` is a failure, passing the unwrapped error as a parameter.
  488 + ///
  489 + /// Use the `flatMapError` function with a closure that may throw an error. For example:
  490 + ///
  491 + /// let possibleData: DownloadResponse<Data> = ...
  492 + /// let possibleObject = possibleData.flatMapError {
  493 + /// try someFailableFunction(taking: $0)
  494 + /// }
  495 + ///
  496 + /// - Parameter transform: A throwing closure that takes the error of the instance.
  497 + ///
  498 + /// - Returns: A `DownloadResponse` instance containing the result of the transform.
  499 + public func flatMapError<E: Error>(_ transform: (Error) throws -> E) -> DownloadResponse {
  500 + var response = DownloadResponse(
  501 + request: request,
  502 + response: self.response,
  503 + temporaryURL: temporaryURL,
  504 + destinationURL: destinationURL,
  505 + resumeData: resumeData,
  506 + result: result.flatMapError(transform),
  507 + timeline: timeline
  508 + )
  509 +
  510 + response._metrics = _metrics
  511 +
  512 + return response
  513 + }
  514 +}
  515 +
  516 +// MARK: -
  517 +
247 518 protocol Response {
248 519 /// The task metrics containing the request / response statistics.
249 520 var _metrics: AnyObject? { get set }
... ...
ParentAssistant/Pods/Alamofire/Source/ResponseSerialization.swift
1 1 //
2 2 // ResponseSerialization.swift
3 3 //
4   -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 5 //
6 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 // of this software and associated documentation files (the "Software"), to deal
... ... @@ -84,6 +84,23 @@ public struct DownloadResponseSerializer&lt;Value&gt;: DownloadResponseSerializerProto
84 84 }
85 85 }
86 86  
  87 +// MARK: - Timeline
  88 +
  89 +extension Request {
  90 + var timeline: Timeline {
  91 + let requestStartTime = self.startTime ?? CFAbsoluteTimeGetCurrent()
  92 + let requestCompletedTime = self.endTime ?? CFAbsoluteTimeGetCurrent()
  93 + let initialResponseTime = self.delegate.initialResponseTime ?? requestCompletedTime
  94 +
  95 + return Timeline(
  96 + requestStartTime: requestStartTime,
  97 + initialResponseTime: initialResponseTime,
  98 + requestCompletedTime: requestCompletedTime,
  99 + serializationCompletedTime: CFAbsoluteTimeGetCurrent()
  100 + )
  101 + }
  102 +}
  103 +
87 104 // MARK: - Default
88 105  
89 106 extension DataRequest {
... ... @@ -101,7 +118,8 @@ extension DataRequest {
101 118 request: self.request,
102 119 response: self.response,
103 120 data: self.delegate.data,
104   - error: self.delegate.error
  121 + error: self.delegate.error,
  122 + timeline: self.timeline
105 123 )
106 124  
107 125 dataResponse.add(self.delegate.metrics)
... ... @@ -136,22 +154,12 @@ extension DataRequest {
136 154 self.delegate.error
137 155 )
138 156  
139   - let requestCompletedTime = self.endTime ?? CFAbsoluteTimeGetCurrent()
140   - let initialResponseTime = self.delegate.initialResponseTime ?? requestCompletedTime
141   -
142   - let timeline = Timeline(
143   - requestStartTime: self.startTime ?? CFAbsoluteTimeGetCurrent(),
144   - initialResponseTime: initialResponseTime,
145   - requestCompletedTime: requestCompletedTime,
146   - serializationCompletedTime: CFAbsoluteTimeGetCurrent()
147   - )
148   -
149 157 var dataResponse = DataResponse<T.SerializedObject>(
150 158 request: self.request,
151 159 response: self.response,
152 160 data: self.delegate.data,
153 161 result: result,
154   - timeline: timeline
  162 + timeline: self.timeline
155 163 )
156 164  
157 165 dataResponse.add(self.delegate.metrics)
... ... @@ -184,7 +192,8 @@ extension DownloadRequest {
184 192 temporaryURL: self.downloadDelegate.temporaryURL,
185 193 destinationURL: self.downloadDelegate.destinationURL,
186 194 resumeData: self.downloadDelegate.resumeData,
187   - error: self.downloadDelegate.error
  195 + error: self.downloadDelegate.error,
  196 + timeline: self.timeline
188 197 )
189 198  
190 199 downloadResponse.add(self.delegate.metrics)
... ... @@ -219,16 +228,6 @@ extension DownloadRequest {
219 228 self.downloadDelegate.error
220 229 )
221 230  
222   - let requestCompletedTime = self.endTime ?? CFAbsoluteTimeGetCurrent()
223   - let initialResponseTime = self.delegate.initialResponseTime ?? requestCompletedTime
224   -
225   - let timeline = Timeline(
226   - requestStartTime: self.startTime ?? CFAbsoluteTimeGetCurrent(),
227   - initialResponseTime: initialResponseTime,
228   - requestCompletedTime: requestCompletedTime,
229   - serializationCompletedTime: CFAbsoluteTimeGetCurrent()
230   - )
231   -
232 231 var downloadResponse = DownloadResponse<T.SerializedObject>(
233 232 request: self.request,
234 233 response: self.response,
... ... @@ -236,7 +235,7 @@ extension DownloadRequest {
236 235 destinationURL: self.downloadDelegate.destinationURL,
237 236 resumeData: self.downloadDelegate.resumeData,
238 237 result: result,
239   - timeline: timeline
  238 + timeline: self.timeline
240 239 )
241 240  
242 241 downloadResponse.add(self.delegate.metrics)
... ... @@ -369,13 +368,13 @@ extension Request {
369 368  
370 369 var convertedEncoding = encoding
371 370  
372   - if let encodingName = response?.textEncodingName as CFString!, convertedEncoding == nil {
  371 + if let encodingName = response?.textEncodingName as CFString?, convertedEncoding == nil {
373 372 convertedEncoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(
374 373 CFStringConvertIANACharSetNameToEncoding(encodingName))
375 374 )
376 375 }
377 376  
378   - let actualEncoding = convertedEncoding ?? String.Encoding.isoLatin1
  377 + let actualEncoding = convertedEncoding ?? .isoLatin1
379 378  
380 379 if let string = String(data: validData, encoding: actualEncoding) {
381 380 return .success(string)
... ...
ParentAssistant/Pods/Alamofire/Source/Result.swift
1 1 //
2 2 // Result.swift
3 3 //
4   -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 5 //
6 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 // of this software and associated documentation files (the "Software"), to deal
... ... @@ -100,3 +100,201 @@ extension Result: CustomDebugStringConvertible {
100 100 }
101 101 }
102 102 }
  103 +
  104 +// MARK: - Functional APIs
  105 +
  106 +extension Result {
  107 + /// Creates a `Result` instance from the result of a closure.
  108 + ///
  109 + /// A failure result is created when the closure throws, and a success result is created when the closure
  110 + /// succeeds without throwing an error.
  111 + ///
  112 + /// func someString() throws -> String { ... }
  113 + ///
  114 + /// let result = Result(value: {
  115 + /// return try someString()
  116 + /// })
  117 + ///
  118 + /// // The type of result is Result<String>
  119 + ///
  120 + /// The trailing closure syntax is also supported:
  121 + ///
  122 + /// let result = Result { try someString() }
  123 + ///
  124 + /// - parameter value: The closure to execute and create the result for.
  125 + public init(value: () throws -> Value) {
  126 + do {
  127 + self = try .success(value())
  128 + } catch {
  129 + self = .failure(error)
  130 + }
  131 + }
  132 +
  133 + /// Returns the success value, or throws the failure error.
  134 + ///
  135 + /// let possibleString: Result<String> = .success("success")
  136 + /// try print(possibleString.unwrap())
  137 + /// // Prints "success"
  138 + ///
  139 + /// let noString: Result<String> = .failure(error)
  140 + /// try print(noString.unwrap())
  141 + /// // Throws error
  142 + public func unwrap() throws -> Value {
  143 + switch self {
  144 + case .success(let value):
  145 + return value
  146 + case .failure(let error):
  147 + throw error
  148 + }
  149 + }
  150 +
  151 + /// Evaluates the specified closure when the `Result` is a success, passing the unwrapped value as a parameter.
  152 + ///
  153 + /// Use the `map` method with a closure that does not throw. For example:
  154 + ///
  155 + /// let possibleData: Result<Data> = .success(Data())
  156 + /// let possibleInt = possibleData.map { $0.count }
  157 + /// try print(possibleInt.unwrap())
  158 + /// // Prints "0"
  159 + ///
  160 + /// let noData: Result<Data> = .failure(error)
  161 + /// let noInt = noData.map { $0.count }
  162 + /// try print(noInt.unwrap())
  163 + /// // Throws error
  164 + ///
  165 + /// - parameter transform: A closure that takes the success value of the `Result` instance.
  166 + ///
  167 + /// - returns: A `Result` containing the result of the given closure. If this instance is a failure, returns the
  168 + /// same failure.
  169 + public func map<T>(_ transform: (Value) -> T) -> Result<T> {
  170 + switch self {
  171 + case .success(let value):
  172 + return .success(transform(value))
  173 + case .failure(let error):
  174 + return .failure(error)
  175 + }
  176 + }
  177 +
  178 + /// Evaluates the specified closure when the `Result` is a success, passing the unwrapped value as a parameter.
  179 + ///
  180 + /// Use the `flatMap` method with a closure that may throw an error. For example:
  181 + ///
  182 + /// let possibleData: Result<Data> = .success(Data(...))
  183 + /// let possibleObject = possibleData.flatMap {
  184 + /// try JSONSerialization.jsonObject(with: $0)
  185 + /// }
  186 + ///
  187 + /// - parameter transform: A closure that takes the success value of the instance.
  188 + ///
  189 + /// - returns: A `Result` containing the result of the given closure. If this instance is a failure, returns the
  190 + /// same failure.
  191 + public func flatMap<T>(_ transform: (Value) throws -> T) -> Result<T> {
  192 + switch self {
  193 + case .success(let value):
  194 + do {
  195 + return try .success(transform(value))
  196 + } catch {
  197 + return .failure(error)
  198 + }
  199 + case .failure(let error):
  200 + return .failure(error)
  201 + }
  202 + }
  203 +
  204 + /// Evaluates the specified closure when the `Result` is a failure, passing the unwrapped error as a parameter.
  205 + ///
  206 + /// Use the `mapError` function with a closure that does not throw. For example:
  207 + ///
  208 + /// let possibleData: Result<Data> = .failure(someError)
  209 + /// let withMyError: Result<Data> = possibleData.mapError { MyError.error($0) }
  210 + ///
  211 + /// - Parameter transform: A closure that takes the error of the instance.
  212 + /// - Returns: A `Result` instance containing the result of the transform. If this instance is a success, returns
  213 + /// the same instance.
  214 + public func mapError<T: Error>(_ transform: (Error) -> T) -> Result {
  215 + switch self {
  216 + case .failure(let error):
  217 + return .failure(transform(error))
  218 + case .success:
  219 + return self
  220 + }
  221 + }
  222 +
  223 + /// Evaluates the specified closure when the `Result` is a failure, passing the unwrapped error as a parameter.
  224 + ///
  225 + /// Use the `flatMapError` function with a closure that may throw an error. For example:
  226 + ///
  227 + /// let possibleData: Result<Data> = .success(Data(...))
  228 + /// let possibleObject = possibleData.flatMapError {
  229 + /// try someFailableFunction(taking: $0)
  230 + /// }
  231 + ///
  232 + /// - Parameter transform: A throwing closure that takes the error of the instance.
  233 + ///
  234 + /// - Returns: A `Result` instance containing the result of the transform. If this instance is a success, returns
  235 + /// the same instance.
  236 + public func flatMapError<T: Error>(_ transform: (Error) throws -> T) -> Result {
  237 + switch self {
  238 + case .failure(let error):
  239 + do {
  240 + return try .failure(transform(error))
  241 + } catch {
  242 + return .failure(error)
  243 + }
  244 + case .success:
  245 + return self
  246 + }
  247 + }
  248 +
  249 + /// Evaluates the specified closure when the `Result` is a success, passing the unwrapped value as a parameter.
  250 + ///
  251 + /// Use the `withValue` function to evaluate the passed closure without modifying the `Result` instance.
  252 + ///
  253 + /// - Parameter closure: A closure that takes the success value of this instance.
  254 + /// - Returns: This `Result` instance, unmodified.
  255 + @discardableResult
  256 + public func withValue(_ closure: (Value) -> Void) -> Result {
  257 + if case let .success(value) = self { closure(value) }
  258 +
  259 + return self
  260 + }
  261 +
  262 + /// Evaluates the specified closure when the `Result` is a failure, passing the unwrapped error as a parameter.
  263 + ///
  264 + /// Use the `withError` function to evaluate the passed closure without modifying the `Result` instance.
  265 + ///
  266 + /// - Parameter closure: A closure that takes the success value of this instance.
  267 + /// - Returns: This `Result` instance, unmodified.
  268 + @discardableResult
  269 + public func withError(_ closure: (Error) -> Void) -> Result {
  270 + if case let .failure(error) = self { closure(error) }
  271 +
  272 + return self
  273 + }
  274 +
  275 + /// Evaluates the specified closure when the `Result` is a success.
  276 + ///
  277 + /// Use the `ifSuccess` function to evaluate the passed closure without modifying the `Result` instance.
  278 + ///
  279 + /// - Parameter closure: A `Void` closure.
  280 + /// - Returns: This `Result` instance, unmodified.
  281 + @discardableResult
  282 + public func ifSuccess(_ closure: () -> Void) -> Result {
  283 + if isSuccess { closure() }
  284 +
  285 + return self
  286 + }
  287 +
  288 + /// Evaluates the specified closure when the `Result` is a failure.
  289 + ///
  290 + /// Use the `ifFailure` function to evaluate the passed closure without modifying the `Result` instance.
  291 + ///
  292 + /// - Parameter closure: A `Void` closure.
  293 + /// - Returns: This `Result` instance, unmodified.
  294 + @discardableResult
  295 + public func ifFailure(_ closure: () -> Void) -> Result {
  296 + if isFailure { closure() }
  297 +
  298 + return self
  299 + }
  300 +}
... ...
ParentAssistant/Pods/Alamofire/Source/ServerTrustPolicy.swift
1 1 //
2 2 // ServerTrustPolicy.swift
3 3 //
4   -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 5 //
6 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 // of this software and associated documentation files (the "Software"), to deal
... ... @@ -88,6 +88,13 @@ extension URLSession {
88 88 /// validate the host in production environments to guarantee the validity of the server's
89 89 /// certificate chain.
90 90 ///
  91 +/// - performRevokedEvaluation: Uses the default and revoked server trust evaluations allowing you to control whether to
  92 +/// validate the host provided by the challenge as well as specify the revocation flags for
  93 +/// testing for revoked certificates. Apple platforms did not start testing for revoked
  94 +/// certificates automatically until iOS 10.1, macOS 10.12 and tvOS 10.1 which is
  95 +/// demonstrated in our TLS tests. Applications are encouraged to always validate the host
  96 +/// in production environments to guarantee the validity of the server's certificate chain.
  97 +///
91 98 /// - pinCertificates: Uses the pinned certificates to validate the server trust. The server trust is
92 99 /// considered valid if one of the pinned certificates match one of the server certificates.
93 100 /// By validating both the certificate chain and host, certificate pinning provides a very
... ... @@ -107,6 +114,7 @@ extension URLSession {
107 114 /// - customEvaluation: Uses the associated closure to evaluate the validity of the server trust.
108 115 public enum ServerTrustPolicy {
109 116 case performDefaultEvaluation(validateHost: Bool)
  117 + case performRevokedEvaluation(validateHost: Bool, revocationFlags: CFOptionFlags)
110 118 case pinCertificates(certificates: [SecCertificate], validateCertificateChain: Bool, validateHost: Bool)
111 119 case pinPublicKeys(publicKeys: [SecKey], validateCertificateChain: Bool, validateHost: Bool)
112 120 case disableEvaluation
... ... @@ -172,6 +180,12 @@ public enum ServerTrustPolicy {
172 180 SecTrustSetPolicies(serverTrust, policy)
173 181  
174 182 serverTrustIsValid = trustIsValid(serverTrust)
  183 + case let .performRevokedEvaluation(validateHost, revocationFlags):
  184 + let defaultPolicy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil)
  185 + let revokedPolicy = SecPolicyCreateRevocation(revocationFlags)
  186 + SecTrustSetPolicies(serverTrust, [defaultPolicy, revokedPolicy] as CFTypeRef)
  187 +
  188 + serverTrustIsValid = trustIsValid(serverTrust)
175 189 case let .pinCertificates(pinnedCertificates, validateCertificateChain, validateHost):
176 190 if validateCertificateChain {
177 191 let policy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil)
... ...
ParentAssistant/Pods/Alamofire/Source/SessionDelegate.swift
1 1 //
2 2 // SessionDelegate.swift
3 3 //
4   -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 5 //
6 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 // of this software and associated documentation files (the "Software"), to deal
... ... @@ -36,7 +36,7 @@ open class SessionDelegate: NSObject {
36 36 open var sessionDidReceiveChallenge: ((URLSession, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))?
37 37  
38 38 /// Overrides all behavior for URLSessionDelegate method `urlSession(_:didReceive:completionHandler:)` and requires the caller to call the `completionHandler`.
39   - open var sessionDidReceiveChallengeWithCompletion: ((URLSession, URLAuthenticationChallenge, (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)?
  39 + open var sessionDidReceiveChallengeWithCompletion: ((URLSession, URLAuthenticationChallenge, @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)?
40 40  
41 41 /// Overrides default behavior for URLSessionDelegate method `urlSessionDidFinishEvents(forBackgroundURLSession:)`.
42 42 open var sessionDidFinishEventsForBackgroundURLSession: ((URLSession) -> Void)?
... ... @@ -48,21 +48,21 @@ open class SessionDelegate: NSObject {
48 48  
49 49 /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)` and
50 50 /// requires the caller to call the `completionHandler`.
51   - open var taskWillPerformHTTPRedirectionWithCompletion: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest, (URLRequest?) -> Void) -> Void)?
  51 + open var taskWillPerformHTTPRedirectionWithCompletion: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest, @escaping (URLRequest?) -> Void) -> Void)?
52 52  
53 53 /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:didReceive:completionHandler:)`.
54 54 open var taskDidReceiveChallenge: ((URLSession, URLSessionTask, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))?
55 55  
56 56 /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:didReceive:completionHandler:)` and
57 57 /// requires the caller to call the `completionHandler`.
58   - open var taskDidReceiveChallengeWithCompletion: ((URLSession, URLSessionTask, URLAuthenticationChallenge, (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)?
  58 + open var taskDidReceiveChallengeWithCompletion: ((URLSession, URLSessionTask, URLAuthenticationChallenge, @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)?
59 59  
60 60 /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:needNewBodyStream:)`.
61 61 open var taskNeedNewBodyStream: ((URLSession, URLSessionTask) -> InputStream?)?
62 62  
63 63 /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:needNewBodyStream:)` and
64 64 /// requires the caller to call the `completionHandler`.
65   - open var taskNeedNewBodyStreamWithCompletion: ((URLSession, URLSessionTask, (InputStream?) -> Void) -> Void)?
  65 + open var taskNeedNewBodyStreamWithCompletion: ((URLSession, URLSessionTask, @escaping (InputStream?) -> Void) -> Void)?
66 66  
67 67 /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)`.
68 68 open var taskDidSendBodyData: ((URLSession, URLSessionTask, Int64, Int64, Int64) -> Void)?
... ... @@ -77,7 +77,7 @@ open class SessionDelegate: NSObject {
77 77  
78 78 /// Overrides all behavior for URLSessionDataDelegate method `urlSession(_:dataTask:didReceive:completionHandler:)` and
79 79 /// requires caller to call the `completionHandler`.
80   - open var dataTaskDidReceiveResponseWithCompletion: ((URLSession, URLSessionDataTask, URLResponse, (URLSession.ResponseDisposition) -> Void) -> Void)?
  80 + open var dataTaskDidReceiveResponseWithCompletion: ((URLSession, URLSessionDataTask, URLResponse, @escaping (URLSession.ResponseDisposition) -> Void) -> Void)?
81 81  
82 82 /// Overrides default behavior for URLSessionDataDelegate method `urlSession(_:dataTask:didBecome:)`.
83 83 open var dataTaskDidBecomeDownloadTask: ((URLSession, URLSessionDataTask, URLSessionDownloadTask) -> Void)?
... ... @@ -90,7 +90,7 @@ open class SessionDelegate: NSObject {
90 90  
91 91 /// Overrides all behavior for URLSessionDataDelegate method `urlSession(_:dataTask:willCacheResponse:completionHandler:)` and
92 92 /// requires caller to call the `completionHandler`.
93   - open var dataTaskWillCacheResponseWithCompletion: ((URLSession, URLSessionDataTask, CachedURLResponse, (CachedURLResponse?) -> Void) -> Void)?
  93 + open var dataTaskWillCacheResponseWithCompletion: ((URLSession, URLSessionDataTask, CachedURLResponse, @escaping (CachedURLResponse?) -> Void) -> Void)?
94 94  
95 95 // MARK: URLSessionDownloadDelegate Overrides
96 96  
... ... @@ -108,16 +108,53 @@ open class SessionDelegate: NSObject {
108 108 #if !os(watchOS)
109 109  
110 110 /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:readClosedFor:)`.
111   - open var streamTaskReadClosed: ((URLSession, URLSessionStreamTask) -> Void)?
  111 + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
  112 + open var streamTaskReadClosed: ((URLSession, URLSessionStreamTask) -> Void)? {
  113 + get {
  114 + return _streamTaskReadClosed as? (URLSession, URLSessionStreamTask) -> Void
  115 + }
  116 + set {
  117 + _streamTaskReadClosed = newValue
  118 + }
  119 + }
112 120  
113 121 /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:writeClosedFor:)`.
114   - open var streamTaskWriteClosed: ((URLSession, URLSessionStreamTask) -> Void)?
  122 + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
  123 + open var streamTaskWriteClosed: ((URLSession, URLSessionStreamTask) -> Void)? {
  124 + get {
  125 + return _streamTaskWriteClosed as? (URLSession, URLSessionStreamTask) -> Void
  126 + }
  127 + set {
  128 + _streamTaskWriteClosed = newValue
  129 + }
  130 + }
115 131  
116 132 /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:betterRouteDiscoveredFor:)`.
117   - open var streamTaskBetterRouteDiscovered: ((URLSession, URLSessionStreamTask) -> Void)?
  133 + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
  134 + open var streamTaskBetterRouteDiscovered: ((URLSession, URLSessionStreamTask) -> Void)? {
  135 + get {
  136 + return _streamTaskBetterRouteDiscovered as? (URLSession, URLSessionStreamTask) -> Void
  137 + }
  138 + set {
  139 + _streamTaskBetterRouteDiscovered = newValue
  140 + }
  141 + }
118 142  
119 143 /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:streamTask:didBecome:outputStream:)`.
120   - open var streamTaskDidBecomeInputAndOutputStreams: ((URLSession, URLSessionStreamTask, InputStream, OutputStream) -> Void)?
  144 + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
  145 + open var streamTaskDidBecomeInputAndOutputStreams: ((URLSession, URLSessionStreamTask, InputStream, OutputStream) -> Void)? {
  146 + get {
  147 + return _streamTaskDidBecomeInputStream as? (URLSession, URLSessionStreamTask, InputStream, OutputStream) -> Void
  148 + }
  149 + set {
  150 + _streamTaskDidBecomeInputStream = newValue
  151 + }
  152 + }
  153 +
  154 + var _streamTaskReadClosed: Any?
  155 + var _streamTaskWriteClosed: Any?
  156 + var _streamTaskBetterRouteDiscovered: Any?
  157 + var _streamTaskDidBecomeInputStream: Any?
121 158  
122 159 #endif
123 160  
... ... @@ -126,7 +163,7 @@ open class SessionDelegate: NSObject {
126 163 var retrier: RequestRetrier?
127 164 weak var sessionManager: SessionManager?
128 165  
129   - private var requests: [Int: Request] = [:]
  166 + var requests: [Int: Request] = [:]
130 167 private let lock = NSLock()
131 168  
132 169 /// Access the task delegate for the specified task in a thread-safe manner.
... ... @@ -166,17 +203,19 @@ open class SessionDelegate: NSObject {
166 203 #endif
167 204  
168 205 #if !os(watchOS)
169   - switch selector {
170   - case #selector(URLSessionStreamDelegate.urlSession(_:readClosedFor:)):
171   - return streamTaskReadClosed != nil
172   - case #selector(URLSessionStreamDelegate.urlSession(_:writeClosedFor:)):
173   - return streamTaskWriteClosed != nil
174   - case #selector(URLSessionStreamDelegate.urlSession(_:betterRouteDiscoveredFor:)):
175   - return streamTaskBetterRouteDiscovered != nil
176   - case #selector(URLSessionStreamDelegate.urlSession(_:streamTask:didBecome:outputStream:)):
177   - return streamTaskDidBecomeInputAndOutputStreams != nil
178   - default:
179   - break
  206 + if #available(iOS 9.0, macOS 10.11, tvOS 9.0, *) {
  207 + switch selector {
  208 + case #selector(URLSessionStreamDelegate.urlSession(_:readClosedFor:)):
  209 + return streamTaskReadClosed != nil
  210 + case #selector(URLSessionStreamDelegate.urlSession(_:writeClosedFor:)):
  211 + return streamTaskWriteClosed != nil
  212 + case #selector(URLSessionStreamDelegate.urlSession(_:betterRouteDiscoveredFor:)):
  213 + return streamTaskBetterRouteDiscovered != nil
  214 + case #selector(URLSessionStreamDelegate.urlSession(_:streamTask:didBecome:outputStream:)):
  215 + return streamTaskDidBecomeInputAndOutputStreams != nil
  216 + default:
  217 + break
  218 + }
180 219 }
181 220 #endif
182 221  
... ... @@ -399,16 +438,20 @@ extension SessionDelegate: URLSessionTaskDelegate {
399 438 let completeTask: (URLSession, URLSessionTask, Error?) -> Void = { [weak self] session, task, error in
400 439 guard let strongSelf = self else { return }
401 440  
402   - if let taskDidComplete = strongSelf.taskDidComplete {
403   - taskDidComplete(session, task, error)
404   - } else if let delegate = strongSelf[task]?.delegate {
405   - delegate.urlSession(session, task: task, didCompleteWithError: error)
  441 + strongSelf.taskDidComplete?(session, task, error)
  442 +
  443 + strongSelf[task]?.delegate.urlSession(session, task: task, didCompleteWithError: error)
  444 +
  445 + var userInfo: [String: Any] = [Notification.Key.Task: task]
  446 +
  447 + if let data = (strongSelf[task]?.delegate as? DataTaskDelegate)?.data {
  448 + userInfo[Notification.Key.ResponseData] = data
406 449 }
407 450  
408 451 NotificationCenter.default.post(
409 452 name: Notification.Name.Task.DidComplete,
410 453 object: strongSelf,
411   - userInfo: [Notification.Key.Task: task]
  454 + userInfo: userInfo
412 455 )
413 456  
414 457 strongSelf[task] = nil
... ... @@ -425,17 +468,17 @@ extension SessionDelegate: URLSessionTaskDelegate {
425 468 // Determine whether an error has occurred
426 469 var error: Error? = error
427 470  
428   - if let taskDelegate = self[task]?.delegate, taskDelegate.error != nil {
429   - error = taskDelegate.error
  471 + if request.delegate.error != nil {
  472 + error = request.delegate.error
430 473 }
431 474  
432 475 /// If an error occurred and the retrier is set, asynchronously ask the retrier if the request
433 476 /// should be retried. Otherwise, complete the task by notifying the task delegate.
434 477 if let retrier = retrier, let error = error {
435   - retrier.should(sessionManager, retry: request, with: error) { [weak self] shouldRetry, delay in
  478 + retrier.should(sessionManager, retry: request, with: error) { [weak self] shouldRetry, timeDelay in
436 479 guard shouldRetry else { completeTask(session, task, error) ; return }
437 480  
438   - DispatchQueue.utility.after(delay) { [weak self] in
  481 + DispatchQueue.utility.after(timeDelay) { [weak self] in
439 482 guard let strongSelf = self else { return }
440 483  
441 484 let retrySucceeded = strongSelf.sessionManager?.retry(request) ?? false
... ... @@ -637,6 +680,7 @@ extension SessionDelegate: URLSessionDownloadDelegate {
637 680  
638 681 #if !os(watchOS)
639 682  
  683 +@available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
640 684 extension SessionDelegate: URLSessionStreamDelegate {
641 685 /// Tells the delegate that the read side of the connection has been closed.
642 686 ///
... ...
ParentAssistant/Pods/Alamofire/Source/SessionManager.swift
1 1 //
2 2 // SessionManager.swift
3 3 //
4   -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 5 //
6 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 // of this software and associated documentation files (the "Software"), to deal
... ... @@ -231,12 +231,14 @@ open class SessionManager {
231 231 headers: HTTPHeaders? = nil)
232 232 -> DataRequest
233 233 {
  234 + var originalRequest: URLRequest?
  235 +
234 236 do {
235   - let urlRequest = try URLRequest(url: url, method: method, headers: headers)
236   - let encodedURLRequest = try encoding.encode(urlRequest, with: parameters)
  237 + originalRequest = try URLRequest(url: url, method: method, headers: headers)
  238 + let encodedURLRequest = try encoding.encode(originalRequest!, with: parameters)
237 239 return request(encodedURLRequest)
238 240 } catch {
239   - return request(failedWith: error)
  241 + return request(originalRequest, failedWith: error)
240 242 }
241 243 }
242 244  
... ... @@ -247,10 +249,13 @@ open class SessionManager {
247 249 /// - parameter urlRequest: The URL request.
248 250 ///
249 251 /// - returns: The created `DataRequest`.
  252 + @discardableResult
250 253 open func request(_ urlRequest: URLRequestConvertible) -> DataRequest {
  254 + var originalRequest: URLRequest?
  255 +
251 256 do {
252   - let originalRequest = try urlRequest.asURLRequest()
253   - let originalTask = DataRequest.Requestable(urlRequest: originalRequest)
  257 + originalRequest = try urlRequest.asURLRequest()
  258 + let originalTask = DataRequest.Requestable(urlRequest: originalRequest!)
254 259  
255 260 let task = try originalTask.task(session: session, adapter: adapter, queue: queue)
256 261 let request = DataRequest(session: session, requestTask: .data(originalTask, task))
... ... @@ -261,15 +266,29 @@ open class SessionManager {
261 266  
262 267 return request
263 268 } catch {
264   - return request(failedWith: error)
  269 + return request(originalRequest, failedWith: error)
265 270 }
266 271 }
267 272  
268 273 // MARK: Private - Request Implementation
269 274  
270   - private func request(failedWith error: Error) -> DataRequest {
271   - let request = DataRequest(session: session, requestTask: .data(nil, nil), error: error)
272   - if startRequestsImmediately { request.resume() }
  275 + private func request(_ urlRequest: URLRequest?, failedWith error: Error) -> DataRequest {
  276 + var requestTask: Request.RequestTask = .data(nil, nil)
  277 +
  278 + if let urlRequest = urlRequest {
  279 + let originalTask = DataRequest.Requestable(urlRequest: urlRequest)
  280 + requestTask = .data(originalTask, nil)
  281 + }
  282 +
  283 + let underlyingError = error.underlyingAdaptError ?? error
  284 + let request = DataRequest(session: session, requestTask: requestTask, error: underlyingError)
  285 +
  286 + if let retrier = retrier, error is AdaptError {
  287 + allowRetrier(retrier, toRetry: request, with: underlyingError)
  288 + } else {
  289 + if startRequestsImmediately { request.resume() }
  290 + }
  291 +
273 292 return request
274 293 }
275 294  
... ... @@ -308,7 +327,7 @@ open class SessionManager {
308 327 let encodedURLRequest = try encoding.encode(urlRequest, with: parameters)
309 328 return download(encodedURLRequest, to: destination)
310 329 } catch {
311   - return download(failedWith: error)
  330 + return download(nil, to: destination, failedWith: error)
312 331 }
313 332 }
314 333  
... ... @@ -334,7 +353,7 @@ open class SessionManager {
334 353 let urlRequest = try urlRequest.asURLRequest()
335 354 return download(.request(urlRequest), to: destination)
336 355 } catch {
337   - return download(failedWith: error)
  356 + return download(nil, to: destination, failedWith: error)
338 357 }
339 358 }
340 359  
... ... @@ -348,6 +367,13 @@ open class SessionManager {
348 367 ///
349 368 /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.
350 369 ///
  370 + /// On the latest release of all the Apple platforms (iOS 10, macOS 10.12, tvOS 10, watchOS 3), `resumeData` is broken
  371 + /// on background URL session configurations. There's an underlying bug in the `resumeData` generation logic where the
  372 + /// data is written incorrectly and will always fail to resume the download. For more information about the bug and
  373 + /// possible workarounds, please refer to the following Stack Overflow post:
  374 + ///
  375 + /// - http://stackoverflow.com/a/39347461/1342462
  376 + ///
351 377 /// - parameter resumeData: The resume data. This is an opaque data blob produced by `URLSessionDownloadTask`
352 378 /// when a task is cancelled. See `URLSession -downloadTask(withResumeData:)` for
353 379 /// additional information.
... ... @@ -372,23 +398,43 @@ open class SessionManager {
372 398 {
373 399 do {
374 400 let task = try downloadable.task(session: session, adapter: adapter, queue: queue)
375   - let request = DownloadRequest(session: session, requestTask: .download(downloadable, task))
  401 + let download = DownloadRequest(session: session, requestTask: .download(downloadable, task))
376 402  
377   - request.downloadDelegate.destination = destination
  403 + download.downloadDelegate.destination = destination
378 404  
379   - delegate[task] = request
  405 + delegate[task] = download
380 406  
381   - if startRequestsImmediately { request.resume() }
  407 + if startRequestsImmediately { download.resume() }
382 408  
383   - return request
  409 + return download
384 410 } catch {
385   - return download(failedWith: error)
  411 + return download(downloadable, to: destination, failedWith: error)
386 412 }
387 413 }
388 414  
389   - private func download(failedWith error: Error) -> DownloadRequest {
390   - let download = DownloadRequest(session: session, requestTask: .download(nil, nil), error: error)
391   - if startRequestsImmediately { download.resume() }
  415 + private func download(
  416 + _ downloadable: DownloadRequest.Downloadable?,
  417 + to destination: DownloadRequest.DownloadFileDestination?,
  418 + failedWith error: Error)
  419 + -> DownloadRequest
  420 + {
  421 + var downloadTask: Request.RequestTask = .download(nil, nil)
  422 +
  423 + if let downloadable = downloadable {
  424 + downloadTask = .download(downloadable, nil)
  425 + }
  426 +
  427 + let underlyingError = error.underlyingAdaptError ?? error
  428 +
  429 + let download = DownloadRequest(session: session, requestTask: downloadTask, error: underlyingError)
  430 + download.downloadDelegate.destination = destination
  431 +
  432 + if let retrier = retrier, error is AdaptError {
  433 + allowRetrier(retrier, toRetry: download, with: underlyingError)
  434 + } else {
  435 + if startRequestsImmediately { download.resume() }
  436 + }
  437 +
392 438 return download
393 439 }
394 440  
... ... @@ -418,7 +464,7 @@ open class SessionManager {
418 464 let urlRequest = try URLRequest(url: url, method: method, headers: headers)
419 465 return upload(fileURL, with: urlRequest)
420 466 } catch {
421   - return upload(failedWith: error)
  467 + return upload(nil, failedWith: error)
422 468 }
423 469 }
424 470  
... ... @@ -436,7 +482,7 @@ open class SessionManager {
436 482 let urlRequest = try urlRequest.asURLRequest()
437 483 return upload(.file(fileURL, urlRequest))
438 484 } catch {
439   - return upload(failedWith: error)
  485 + return upload(nil, failedWith: error)
440 486 }
441 487 }
442 488  
... ... @@ -464,7 +510,7 @@ open class SessionManager {
464 510 let urlRequest = try URLRequest(url: url, method: method, headers: headers)
465 511 return upload(data, with: urlRequest)
466 512 } catch {
467   - return upload(failedWith: error)
  513 + return upload(nil, failedWith: error)
468 514 }
469 515 }
470 516  
... ... @@ -482,7 +528,7 @@ open class SessionManager {
482 528 let urlRequest = try urlRequest.asURLRequest()
483 529 return upload(.data(data, urlRequest))
484 530 } catch {
485   - return upload(failedWith: error)
  531 + return upload(nil, failedWith: error)
486 532 }
487 533 }
488 534  
... ... @@ -510,7 +556,7 @@ open class SessionManager {
510 556 let urlRequest = try URLRequest(url: url, method: method, headers: headers)
511 557 return upload(stream, with: urlRequest)
512 558 } catch {
513   - return upload(failedWith: error)
  559 + return upload(nil, failedWith: error)
514 560 }
515 561 }
516 562  
... ... @@ -528,7 +574,7 @@ open class SessionManager {
528 574 let urlRequest = try urlRequest.asURLRequest()
529 575 return upload(.stream(stream, urlRequest))
530 576 } catch {
531   - return upload(failedWith: error)
  577 + return upload(nil, failedWith: error)
532 578 }
533 579 }
534 580  
... ... @@ -614,6 +660,8 @@ open class SessionManager {
614 660 let formData = MultipartFormData()
615 661 multipartFormData(formData)
616 662  
  663 + var tempFileURL: URL?
  664 +
617 665 do {
618 666 var urlRequestWithContentType = try urlRequest.asURLRequest()
619 667 urlRequestWithContentType.setValue(formData.contentType, forHTTPHeaderField: "Content-Type")
... ... @@ -637,6 +685,8 @@ open class SessionManager {
637 685 let fileName = UUID().uuidString
638 686 let fileURL = directoryURL.appendingPathComponent(fileName)
639 687  
  688 + tempFileURL = fileURL
  689 +
640 690 var directoryError: Error?
641 691  
642 692 // Create directory inside serial queue to ensure two threads don't do this in parallel
... ... @@ -652,16 +702,37 @@ open class SessionManager {
652 702  
653 703 try formData.writeEncodedData(to: fileURL)
654 704  
  705 + let upload = self.upload(fileURL, with: urlRequestWithContentType)
  706 +
  707 + // Cleanup the temp file once the upload is complete
  708 + upload.delegate.queue.addOperation {
  709 + do {
  710 + try FileManager.default.removeItem(at: fileURL)
  711 + } catch {
  712 + // No-op
  713 + }
  714 + }
  715 +
655 716 DispatchQueue.main.async {
656 717 let encodingResult = MultipartFormDataEncodingResult.success(
657   - request: self.upload(fileURL, with: urlRequestWithContentType),
  718 + request: upload,
658 719 streamingFromDisk: true,
659 720 streamFileURL: fileURL
660 721 )
  722 +
661 723 encodingCompletion?(encodingResult)
662 724 }
663 725 }
664 726 } catch {
  727 + // Cleanup the temp file in the event that the multipart form data encoding failed
  728 + if let tempFileURL = tempFileURL {
  729 + do {
  730 + try FileManager.default.removeItem(at: tempFileURL)
  731 + } catch {
  732 + // No-op
  733 + }
  734 + }
  735 +
665 736 DispatchQueue.main.async { encodingCompletion?(.failure(error)) }
666 737 }
667 738 }
... ... @@ -684,13 +755,26 @@ open class SessionManager {
684 755  
685 756 return upload
686 757 } catch {
687   - return upload(failedWith: error)
  758 + return upload(uploadable, failedWith: error)
688 759 }
689 760 }
690 761  
691   - private func upload(failedWith error: Error) -> UploadRequest {
692   - let upload = UploadRequest(session: session, requestTask: .upload(nil, nil), error: error)
693   - if startRequestsImmediately { upload.resume() }
  762 + private func upload(_ uploadable: UploadRequest.Uploadable?, failedWith error: Error) -> UploadRequest {
  763 + var uploadTask: Request.RequestTask = .upload(nil, nil)
  764 +
  765 + if let uploadable = uploadable {
  766 + uploadTask = .upload(uploadable, nil)
  767 + }
  768 +
  769 + let underlyingError = error.underlyingAdaptError ?? error
  770 + let upload = UploadRequest(session: session, requestTask: uploadTask, error: underlyingError)
  771 +
  772 + if let retrier = retrier, error is AdaptError {
  773 + allowRetrier(retrier, toRetry: upload, with: underlyingError)
  774 + } else {
  775 + if startRequestsImmediately { upload.resume() }
  776 + }
  777 +
694 778 return upload
695 779 }
696 780  
... ... @@ -709,6 +793,7 @@ open class SessionManager {
709 793 ///
710 794 /// - returns: The created `StreamRequest`.
711 795 @discardableResult
  796 + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
712 797 open func stream(withHostName hostName: String, port: Int) -> StreamRequest {
713 798 return stream(.stream(hostName: hostName, port: port))
714 799 }
... ... @@ -723,12 +808,14 @@ open class SessionManager {
723 808 ///
724 809 /// - returns: The created `StreamRequest`.
725 810 @discardableResult
  811 + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
726 812 open func stream(with netService: NetService) -> StreamRequest {
727 813 return stream(.netService(netService))
728 814 }
729 815  
730 816 // MARK: Private - Stream Implementation
731 817  
  818 + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
732 819 private func stream(_ streamable: StreamRequest.Streamable) -> StreamRequest {
733 820 do {
734 821 let task = try streamable.task(session: session, adapter: adapter, queue: queue)
... ... @@ -744,6 +831,7 @@ open class SessionManager {
744 831 }
745 832 }
746 833  
  834 + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
747 835 private func stream(failedWith error: Error) -> StreamRequest {
748 836 let stream = StreamRequest(session: session, requestTask: .stream(nil, nil), error: error)
749 837 if startRequestsImmediately { stream.resume() }
... ... @@ -760,8 +848,13 @@ open class SessionManager {
760 848 do {
761 849 let task = try originalTask.task(session: session, adapter: adapter, queue: queue)
762 850  
  851 + if let originalTask = request.task {
  852 + delegate[originalTask] = nil // removes the old request to avoid endless growth
  853 + }
  854 +
763 855 request.delegate.task = task // resets all task delegate data
764 856  
  857 + request.retryCount += 1
765 858 request.startTime = CFAbsoluteTimeGetCurrent()
766 859 request.endTime = nil
767 860  
... ... @@ -769,8 +862,35 @@ open class SessionManager {
769 862  
770 863 return true
771 864 } catch {
772   - request.delegate.error = error
  865 + request.delegate.error = error.underlyingAdaptError ?? error
773 866 return false
774 867 }
775 868 }
  869 +
  870 + private func allowRetrier(_ retrier: RequestRetrier, toRetry request: Request, with error: Error) {
  871 + DispatchQueue.utility.async { [weak self] in
  872 + guard let strongSelf = self else { return }
  873 +
  874 + retrier.should(strongSelf, retry: request, with: error) { shouldRetry, timeDelay in
  875 + guard let strongSelf = self else { return }
  876 +
  877 + guard shouldRetry else {
  878 + if strongSelf.startRequestsImmediately { request.resume() }
  879 + return
  880 + }
  881 +
  882 + DispatchQueue.utility.after(timeDelay) {
  883 + guard let strongSelf = self else { return }
  884 +
  885 + let retrySucceeded = strongSelf.retry(request)
  886 +
  887 + if retrySucceeded, let task = request.task {
  888 + strongSelf.delegate[task] = request
  889 + } else {
  890 + if strongSelf.startRequestsImmediately { request.resume() }
  891 + }
  892 + }
  893 + }
  894 + }
  895 + }
776 896 }
... ...
ParentAssistant/Pods/Alamofire/Source/TaskDelegate.swift
1 1 //
2 2 // TaskDelegate.swift
3 3 //
4   -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 5 //
6 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 // of this software and associated documentation files (the "Software"), to deal
... ... @@ -33,21 +33,37 @@ open class TaskDelegate: NSObject {
33 33 /// The serial operation queue used to execute all operations after the task completes.
34 34 open let queue: OperationQueue
35 35  
  36 + /// The data returned by the server.
  37 + public var data: Data? { return nil }
  38 +
  39 + /// The error generated throughout the lifecyle of the task.
  40 + public var error: Error?
  41 +
36 42 var task: URLSessionTask? {
37   - didSet { reset() }
  43 + set {
  44 + taskLock.lock(); defer { taskLock.unlock() }
  45 + _task = newValue
  46 + }
  47 + get {
  48 + taskLock.lock(); defer { taskLock.unlock() }
  49 + return _task
  50 + }
38 51 }
39 52  
40   - var data: Data? { return nil }
41   - var error: Error?
42   -
43 53 var initialResponseTime: CFAbsoluteTime?
44 54 var credential: URLCredential?
45 55 var metrics: AnyObject? // URLSessionTaskMetrics
46 56  
  57 + private var _task: URLSessionTask? {
  58 + didSet { reset() }
  59 + }
  60 +
  61 + private let taskLock = NSLock()
  62 +
47 63 // MARK: Lifecycle
48 64  
49 65 init(task: URLSessionTask?) {
50   - self.task = task
  66 + _task = task
51 67  
52 68 self.queue = {
53 69 let operationQueue = OperationQueue()
... ... @@ -331,29 +347,30 @@ class DownloadTaskDelegate: TaskDelegate, URLSessionDownloadDelegate {
331 347 {
332 348 temporaryURL = location
333 349  
334   - if let destination = destination {
335   - let result = destination(location, downloadTask.response as! HTTPURLResponse)
336   - let destination = result.destinationURL
337   - let options = result.options
  350 + guard
  351 + let destination = destination,
  352 + let response = downloadTask.response as? HTTPURLResponse
  353 + else { return }
338 354  
339   - do {
340   - destinationURL = destination
  355 + let result = destination(location, response)
  356 + let destinationURL = result.destinationURL
  357 + let options = result.options
341 358  
342   - if options.contains(.removePreviousFile) {
343   - if FileManager.default.fileExists(atPath: destination.path) {
344   - try FileManager.default.removeItem(at: destination)
345   - }
346   - }
  359 + self.destinationURL = destinationURL
347 360  
348   - if options.contains(.createIntermediateDirectories) {
349   - let directory = destination.deletingLastPathComponent()
350   - try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true, attributes: nil)
351   - }
  361 + do {
  362 + if options.contains(.removePreviousFile), FileManager.default.fileExists(atPath: destinationURL.path) {
  363 + try FileManager.default.removeItem(at: destinationURL)
  364 + }
352 365  
353   - try FileManager.default.moveItem(at: location, to: destination)
354   - } catch {
355   - self.error = error
  366 + if options.contains(.createIntermediateDirectories) {
  367 + let directory = destinationURL.deletingLastPathComponent()
  368 + try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true)
356 369 }
  370 +
  371 + try FileManager.default.moveItem(at: location, to: destinationURL)
  372 + } catch {
  373 + self.error = error
357 374 }
358 375 }
359 376  
... ...
ParentAssistant/Pods/Alamofire/Source/Timeline.swift
1 1 //
2 2 // Timeline.swift
3 3 //
4   -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 5 //
6 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 // of this software and associated documentation files (the "Software"), to deal
... ...
ParentAssistant/Pods/Alamofire/Source/Validation.swift
1 1 //
2 2 // Validation.swift
3 3 //
4   -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 5 //
6 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 // of this software and associated documentation files (the "Software"), to deal
... ... @@ -48,7 +48,13 @@ extension Request {
48 48 init?(_ string: String) {
49 49 let components: [String] = {
50 50 let stripped = string.trimmingCharacters(in: .whitespacesAndNewlines)
  51 +
  52 + #if swift(>=3.2)
  53 + let split = stripped[..<(stripped.range(of: ";")?.lowerBound ?? stripped.endIndex)]
  54 + #else
51 55 let split = stripped.substring(to: stripped.range(of: ";")?.lowerBound ?? stripped.endIndex)
  56 + #endif
  57 +
52 58 return split.components(separatedBy: "/")
53 59 }()
54 60  
... ...
ParentAssistant/Pods/AlamofireImage/LICENSE 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  2 +
  3 +Permission is hereby granted, free of charge, to any person obtaining a copy
  4 +of this software and associated documentation files (the "Software"), to deal
  5 +in the Software without restriction, including without limitation the rights
  6 +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  7 +copies of the Software, and to permit persons to whom the Software is
  8 +furnished to do so, subject to the following conditions:
  9 +
  10 +The above copyright notice and this permission notice shall be included in
  11 +all copies or substantial portions of the Software.
  12 +
  13 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  14 +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  15 +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  16 +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  17 +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  18 +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  19 +THE SOFTWARE.
... ...
ParentAssistant/Pods/AlamofireImage/README.md 0 → 100644
... ... @@ -0,0 +1,584 @@
  1 +# AlamofireImage
  2 +
  3 +[![Build Status](https://travis-ci.org/Alamofire/AlamofireImage.svg?branch=master)](https://travis-ci.org/Alamofire/AlamofireImage)
  4 +[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/AlamofireImage.svg)](https://img.shields.io/cocoapods/v/AlamofireImage.svg)
  5 +[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
  6 +[![Platform](https://img.shields.io/cocoapods/p/AlamofireImage.svg?style=flat)](http://cocoadocs.org/docsets/AlamofireImage)
  7 +[![Twitter](https://img.shields.io/badge/twitter-@AlamofireSF-blue.svg?style=flat)](http://twitter.com/AlamofireSF)
  8 +[![Gitter](https://badges.gitter.im/Alamofire/Alamofire.svg)](https://gitter.im/Alamofire/Alamofire?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
  9 +
  10 +AlamofireImage is an image component library for Alamofire.
  11 +
  12 +## Features
  13 +
  14 +- [x] Image Response Serializers
  15 +- [x] UIImage Extensions for Inflation / Scaling / Rounding / CoreImage
  16 +- [x] Single and Multi-Pass Image Filters
  17 +- [x] Auto-Purging In-Memory Image Cache
  18 +- [x] Prioritized Queue Order Image Downloading
  19 +- [x] Authentication with URLCredential
  20 +- [x] UIImageView Async Remote Downloads with Placeholders
  21 +- [x] UIImageView Filters and Transitions
  22 +- [x] Comprehensive Test Coverage
  23 +- [x] [Complete Documentation](http://cocoadocs.org/docsets/AlamofireImage)
  24 +
  25 +## Requirements
  26 +
  27 +- iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+
  28 +- Xcode 8.3+
  29 +- Swift 3.1+
  30 +
  31 +## Migration Guides
  32 +
  33 +- [AlamofireImage 2.0 Migration Guide](https://github.com/Alamofire/AlamofireImage/blob/master/Documentation/AlamofireImage%202.0%20Migration%20Guide.md)
  34 +- [AlamofireImage 3.0 Migration Guide](https://github.com/Alamofire/AlamofireImage/blob/master/Documentation/AlamofireImage%203.0%20Migration%20Guide.md)
  35 +
  36 +## Dependencies
  37 +
  38 +- [Alamofire 4.5+](https://github.com/Alamofire/Alamofire)
  39 +
  40 +## Communication
  41 +
  42 +- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/alamofire). (Tag 'alamofire')
  43 +- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/alamofire).
  44 +- If you **found a bug**, open an issue.
  45 +- If you **have a feature request**, open an issue.
  46 +- If you **want to contribute**, submit a pull request.
  47 +
  48 +## Installation
  49 +
  50 +### CocoaPods
  51 +
  52 +[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command:
  53 +
  54 +```bash
  55 +$ gem install cocoapods
  56 +```
  57 +
  58 +> CocoaPods 1.1+ is required.
  59 +
  60 +To integrate AlamofireImage into your Xcode project using CocoaPods, specify it in your `Podfile`:
  61 +
  62 +```ruby
  63 +source 'https://github.com/CocoaPods/Specs.git'
  64 +platform :ios, '10.0'
  65 +use_frameworks!
  66 +
  67 +target '<Your Target Name>' do
  68 + pod 'AlamofireImage', '~> 3.3'
  69 +end
  70 +```
  71 +
  72 +Then, run the following command:
  73 +
  74 +```bash
  75 +$ pod install
  76 +```
  77 +
  78 +### Carthage
  79 +
  80 +[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.
  81 +
  82 +You can install Carthage with [Homebrew](http://brew.sh/) using the following command:
  83 +
  84 +```bash
  85 +$ brew update
  86 +$ brew install carthage
  87 +```
  88 +
  89 +To integrate AlamofireImage into your Xcode project using Carthage, specify it in your `Cartfile`:
  90 +
  91 +```ogdl
  92 +github "Alamofire/AlamofireImage" ~> 3.3
  93 +```
  94 +
  95 +Run `carthage update` to build the framework and drag the built `AlamofireImage.framework` into your Xcode project.
  96 +
  97 +### Manually
  98 +
  99 +If you prefer not to use either of the aforementioned dependency managers, you can integrate AlamofireImage into your project manually.
  100 +
  101 +#### Embedded Framework
  102 +
  103 +- Open up Terminal, `cd` into your top-level project directory, and run the following command "if" your project is not initialized as a git repository:
  104 +
  105 +```bash
  106 +$ git init
  107 +```
  108 +
  109 +- Add AlamofireImage as a git [submodule](http://git-scm.com/docs/git-submodule) by running the following command:
  110 +
  111 +```bash
  112 +$ git submodule add https://github.com/Alamofire/AlamofireImage.git
  113 +```
  114 +
  115 +- Open the new `AlamofireImage` folder, and drag the `AlamofireImage.xcodeproj` into the Project Navigator of your application's Xcode project.
  116 +
  117 + > It should appear nested underneath your application's blue project icon. Whether it is above or below all the other Xcode groups does not matter.
  118 +
  119 +- Select the `AlamofireImage.xcodeproj` in the Project Navigator and verify the deployment target matches that of your application target.
  120 +- Next, select your application project in the Project Navigator (blue project icon) to navigate to the target configuration window and select the application target under the "Targets" heading in the sidebar.
  121 +- In the tab bar at the top of that window, open the "General" panel.
  122 +- Click on the `+` button under the "Embedded Binaries" section.
  123 +- You will see two different `AlamofireImage.xcodeproj` folders each with two different versions of the `AlamofireImage.framework` nested inside a `Products` folder.
  124 +
  125 + > It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `AlamofireImage.framework`.
  126 +
  127 +- Select the top `AlamofireImage.framework` for iOS and the bottom one for OS X.
  128 +
  129 + > You can verify which one you selected by inspecting the build log for your project. The build target for `AlamofireImage` will be listed as either `AlamofireImage iOS`, `AlamofireImage macOS`, `AlamofireImage tvOS` or `AlamofireImage watchOS`.
  130 +
  131 +- And that's it!
  132 +
  133 + > The `AlamofireImage.framework` is automagically added as a target dependency, linked framework and embedded framework in a copy files build phase which is all you need to build on the simulator and a device.
  134 +
  135 +---
  136 +
  137 +## Usage
  138 +
  139 +### Image Response Serializers
  140 +
  141 +```swift
  142 +import Alamofire
  143 +import AlamofireImage
  144 +
  145 +Alamofire.request("https://httpbin.org/image/png").responseImage { response in
  146 + debugPrint(response)
  147 +
  148 + print(response.request)
  149 + print(response.response)
  150 + debugPrint(response.result)
  151 +
  152 + if let image = response.result.value {
  153 + print("image downloaded: \(image)")
  154 + }
  155 +}
  156 +```
  157 +
  158 +The AlamofireImage response image serializers support a wide range of image types including:
  159 +
  160 +- `image/png`
  161 +- `image/jpeg`
  162 +- `image/tiff`
  163 +- `image/gif`
  164 +- `image/ico`
  165 +- `image/x-icon`
  166 +- `image/bmp`
  167 +- `image/x-bmp`
  168 +- `image/x-xbitmap`
  169 +- `image/x-win-bitmap`
  170 +
  171 +> If the image you are attempting to download is an invalid MIME type not in the list, you can add custom acceptable content types using the `addAcceptableImageContentTypes` extension on the `DataRequest` type.
  172 +
  173 +### UIImage Extensions
  174 +
  175 +There are several `UIImage` extensions designed to make the common image manipulation operations as simple as possible.
  176 +
  177 +#### Inflation
  178 +
  179 +```swift
  180 +let url = Bundle.main.url(forResource: "unicorn", withExtension: "png")!
  181 +let data = try! Data(contentsOf: url)
  182 +let image = UIImage(data: data, scale: UIScreen.main.scale)!
  183 +
  184 +image.af_inflate()
  185 +```
  186 +
  187 +> Inflating compressed image formats (such as PNG or JPEG) in a background queue can significantly improve drawing performance on the main thread.
  188 +
  189 +#### Scaling
  190 +
  191 +```swift
  192 +let image = UIImage(named: "unicorn")!
  193 +let size = CGSize(width: 100.0, height: 100.0)
  194 +
  195 +// Scale image to size disregarding aspect ratio
  196 +let scaledImage = image.af_imageScaled(to: size)
  197 +
  198 +// Scale image to fit within specified size while maintaining aspect ratio
  199 +let aspectScaledToFitImage = image.af_imageAspectScaled(toFit: size)
  200 +
  201 +// Scale image to fill specified size while maintaining aspect ratio
  202 +let aspectScaledToFillImage = image.af_imageAspectScaled(toFill: size)
  203 +```
  204 +
  205 +#### Rounded Corners
  206 +
  207 +```swift
  208 +let image = UIImage(named: "unicorn")!
  209 +let radius: CGFloat = 20.0
  210 +
  211 +let roundedImage = image.af_imageRounded(withCornerRadius: radius)
  212 +let circularImage = image.af_imageRoundedIntoCircle()
  213 +```
  214 +
  215 +#### Core Image Filters
  216 +
  217 +```swift
  218 +let image = UIImage(named: "unicorn")!
  219 +
  220 +let sepiaImage = image.af_imageFiltered(withCoreImageFilter: "CISepiaTone")
  221 +
  222 +let blurredImage = image.af_imageFiltered(
  223 + withCoreImageFilter: "CIGuassianBlur",
  224 + parameters: ["inputRadius": 25]
  225 +)
  226 +```
  227 +
  228 +### Image Filters
  229 +
  230 +The `ImageFilter` protocol was designed to make it easy to apply a filter operation and cache the result after an image finished downloading. It defines two properties to facilitate this functionality.
  231 +
  232 +```swift
  233 +public protocol ImageFilter {
  234 + var filter: Image -> Image { get }
  235 + var identifier: String { get }
  236 +}
  237 +```
  238 +
  239 +The `filter` closure contains the operation used to create a modified version of the specified image. The `identifier` property is a string used to uniquely identify the filter operation. This is useful when adding filtered versions of an image to a cache. All identifier properties inside AlamofireImage are implemented using protocol extensions.
  240 +
  241 +#### Single Pass
  242 +
  243 +The single pass image filters only perform a single operation on the specified image.
  244 +
  245 +```swift
  246 +let image = UIImage(named: "unicorn")!
  247 +let imageFilter = RoundedCornersFilter(radius: 10.0)
  248 +
  249 +let roundedImage = imageFilter.filter(image)
  250 +```
  251 +
  252 +The current list of single pass image filters includes:
  253 +
  254 +- `ScaledToSizeFilter` - Scales an image to a specified size.
  255 +- `AspectScaledToFitSizeFilter` - Scales an image from the center while maintaining the aspect ratio to fit within a specified size.
  256 +- `AspectScaledToFillSizeFilter` - Scales an image from the center while maintaining the aspect ratio to fill a specified size. Any pixels that fall outside the specified size are clipped.
  257 +- `RoundedCornersFilter` - Rounds the corners of an image to the specified radius.
  258 +- `CircleFilter` - Rounds the corners of an image into a circle.
  259 +- `BlurFilter` - Blurs an image using a `CIGaussianBlur` filter with the specified blur radius.
  260 +
  261 +> Each image filter is built ontop of the `UIImage` extensions.
  262 +
  263 +#### Multi-Pass
  264 +
  265 +The multi-pass image filters perform multiple operations on the specified image.
  266 +
  267 +```swift
  268 +let image = UIImage(named: "avatar")!
  269 +let size = CGSize(width: 100.0, height: 100.0)
  270 +let imageFilter = AspectScaledToFillSizeCircleFilter(size: size)
  271 +
  272 +let avatarImage = imageFilter.filter(image)
  273 +```
  274 +
  275 +The current list of multi-pass image filters includes:
  276 +
  277 +- `ScaledToSizeWithRoundedCornersFilter` - Scales an image to a specified size, then rounds the corners to the specified radius.
  278 +- `AspectScaledToFillSizeWithRoundedCornersFilter` - Scales an image from the center while maintaining the aspect ratio to fit within a specified size, then rounds the corners to the specified radius.
  279 +- `ScaledToSizeCircleFilter` - Scales an image to a specified size, then rounds the corners into a circle.
  280 +- `AspectScaledToFillSizeCircleFilter` - Scales an image from the center while maintaining the aspect ratio to fit within a specified size, then rounds the corners into a circle.
  281 +
  282 +### Image Cache
  283 +
  284 +Image caching can become complicated when it comes to network images. `URLCache` is quite powerful and does a great job reasoning through the various cache policies and `Cache-Control` headers. However, it is not equipped to handle caching multiple modified versions of those images.
  285 +
  286 +For example, let's say you need to download an album of images. Your app needs to display both the thumbnail version as well as the full size version at various times. Due to performance issues, you want to scale down the thumbnails to a reasonable size before rendering them on-screen. You also need to apply a global CoreImage filter to the full size images when displayed. While `URLCache` can easily handle storing the original downloaded image, it cannot store these different variants. What you really need is another caching layer designed to handle these different variants.
  287 +
  288 +```swift
  289 +let imageCache = AutoPurgingImageCache(
  290 + memoryCapacity: 100_000_000,
  291 + preferredMemoryUsageAfterPurge: 60_000_000
  292 +)
  293 +```
  294 +
  295 +The `AutoPurgingImageCache` in AlamofireImage fills the role of that additional caching layer. It is an in-memory image cache used to store images up to a given memory capacity. When the memory capacity is reached, the image cache is sorted by last access date, then the oldest image is continuously purged until the preferred memory usage after purge is met. Each time an image is accessed through the cache, the internal access date of the image is updated.
  296 +
  297 +#### Add / Remove / Fetch Images
  298 +
  299 +Interacting with the `ImageCache` protocol APIs is very straightforward.
  300 +
  301 +```swift
  302 +let imageCache = AutoPurgingImageCache()
  303 +let avatarImage = UIImage(data: data)!
  304 +
  305 +// Add
  306 +imageCache.add(avatarImage, withIdentifier: "avatar")
  307 +
  308 +// Fetch
  309 +let cachedAvatar = imageCache.image(withIdentifier: "avatar")
  310 +
  311 +// Remove
  312 +imageCache.removeImage(withIdentifier: "avatar")
  313 +```
  314 +
  315 +#### URL Requests
  316 +
  317 +The `ImageRequestCache` protocol extends the `ImageCache` protocol by adding support for `URLRequest` caching. This allows a `URLRequest` and an additional identifier to generate the unique identifier for the image in the cache.
  318 +
  319 +```swift
  320 +let imageCache = AutoPurgingImageCache()
  321 +
  322 +let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/image/png")!)
  323 +let avatarImage = UIImage(named: "avatar")!.af_imageRoundedIntoCircle()
  324 +
  325 +// Add
  326 +imageCache.add(avatarImage, for: urlRequest, withIdentifier: "circle")
  327 +
  328 +// Fetch
  329 +let cachedAvatarImage = imageCache.image(for: urlRequest, withIdentifier: "circle")
  330 +
  331 +// Remove
  332 +imageCache.removeImage(for: urlRequest, withIdentifier: "circle")
  333 +```
  334 +
  335 +#### Auto-Purging
  336 +
  337 +Each time an image is fetched from the cache, the cache internally updates the last access date for that image.
  338 +
  339 +```swift
  340 +let avatar = imageCache.image(withIdentifier: "avatar")
  341 +let circularAvatar = imageCache.image(for: urlRequest, withIdentifier: "circle")
  342 +```
  343 +
  344 +By updating the last access date for each image, the image cache can make more informed decisions about which images to purge when the memory capacity is reached. The `AutoPurgingImageCache` automatically evicts images from the cache in order from oldest last access date to newest until the memory capacity drops below the `preferredMemoryCapacityAfterPurge`.
  345 +
  346 +> It is important to set reasonable default values for the `memoryCapacity` and `preferredMemoryCapacityAfterPurge` when you are initializing your image cache. By default, the `memoryCapacity` equals 100 MB and the `preferredMemoryCapacityAfterPurge` equals 60 MB.
  347 +
  348 +#### Memory Warnings
  349 +
  350 +The `AutoPurgingImageCache` also listens for memory warnings from your application and will purge all images from the cache if a memory warning is observed.
  351 +
  352 +### Image Downloader
  353 +
  354 +The `ImageDownloader` class is responsible for downloading images in parallel on a prioritized queue. It uses an internal Alamofire `SessionManager` instance to handle all the downloading and response image serialization. By default, the initialization of an `ImageDownloader` uses a default `URLSessionConfiguration` with the most common parameter values.
  355 +
  356 +```swift
  357 +let imageDownloader = ImageDownloader(
  358 + configuration: ImageDownloader.defaultURLSessionConfiguration(),
  359 + downloadPrioritization: .fifo,
  360 + maximumActiveDownloads: 4,
  361 + imageCache: AutoPurgingImageCache()
  362 +)
  363 +```
  364 +
  365 +> If you need to customize the `URLSessionConfiguration` type or parameters, then simply provide your own rather than using the default.
  366 +
  367 +#### Downloading an Image
  368 +
  369 +```swift
  370 +let downloader = ImageDownloader()
  371 +let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/image/jpeg")!)
  372 +
  373 +downloader.download(urlRequest) { response in
  374 + print(response.request)
  375 + print(response.response)
  376 + debugPrint(response.result)
  377 +
  378 + if let image = response.result.value {
  379 + print(image)
  380 + }
  381 +}
  382 +```
  383 +
  384 +> Make sure to keep a strong reference to the `ImageDownloader` instance, otherwise the `completion` closure will not be called because the `downloader` reference will go out of scope before the `completion` closure can be called.
  385 +
  386 +#### Applying an ImageFilter
  387 +
  388 +```swift
  389 +let downloader = ImageDownloader()
  390 +let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/image/jpeg")!)
  391 +let filter = AspectScaledToFillSizeCircleFilter(size: CGSize(width: 100.0, height: 100.0))
  392 +
  393 +downloader.download(urlRequest, filter: filter) { response in
  394 + print(response.request)
  395 + print(response.response)
  396 + debugPrint(response.result)
  397 +
  398 + if let image = response.result.value {
  399 + print(image)
  400 + }
  401 +}
  402 +```
  403 +
  404 +#### Authentication
  405 +
  406 +If your images are behind HTTP Basic Auth, you can append the `user:password:` or the `credential` to the `ImageDownloader` instance. The credentials will be applied to all future download requests.
  407 +
  408 +```swift
  409 +let downloader = ImageDownloader()
  410 +downloader.addAuthentication(user: "username", password: "password")
  411 +```
  412 +
  413 +#### Download Prioritization
  414 +
  415 +The `ImageDownloader` maintains an internal queue of pending download requests. Depending on your situation, you may want incoming downloads to be inserted at the front or the back of the queue. The `DownloadPrioritization` enumeration allows you to specify which behavior you would prefer.
  416 +
  417 +```swift
  418 +public enum DownloadPrioritization {
  419 + case fifo, lifo
  420 +}
  421 +```
  422 +
  423 +> The `ImageDownloader` is initialized with a `.fifo` queue by default.
  424 +
  425 +#### Image Caching
  426 +
  427 +The `ImageDownloader` uses a combination of an `URLCache` and `AutoPurgingImageCache` to create a very robust, high performance image caching system.
  428 +
  429 +##### URLCache
  430 +
  431 +The `URLCache` is used to cache all the original image content downloaded from the server. By default, it is initialized with a memory capacity of 20 MB and a disk capacity of 150 MB. This allows up to 150 MB of original image data to be stored on disk at any given time. While these defaults have been carefully set, it is very important to consider your application's needs and performance requirements and whether these values are right for you.
  432 +
  433 +> If you wish to disable this caching layer, create a custom `URLSessionConfiguration` with the `urlCache` property set to `nil` and use that configuration when initializing the `ImageDownloader`.
  434 +
  435 +##### Image Cache
  436 +
  437 +The `ImageCache` is used to cache all the potentially filtered image content after it has been downloaded from the server. This allows multiple variants of the same image to also be cached, rather than having to re-apply the image filters to the original image each time it is required. By default, an `AutoPurgingImageCache` is initialized with a memory capacity of 100 MB and a preferred memory usage after purge limit of 60 MB. This allows up to 100 MB of most recently accessed filtered image content to be stored in-memory at a given time.
  438 +
  439 +##### Setting Ideal Capacity Limits
  440 +
  441 +Determining the ideal the in-memory and on-disk capacity limits of the `URLCache` and `AutoPurgingImageCache` requires a bit of forethought. You must carefully consider your application's needs, and tailor the limits accordingly. By default, the combination of caches offers the following storage capacities:
  442 +
  443 +- 150 MB of on-disk storage
  444 +- 20 MB of in-memory original image data storage
  445 +- 100 MB of in-memory storage of filtered image content
  446 +- 60 MB preferred memory capacity after purge of filtered image content
  447 +
  448 +> If you do not use image filters, it is advised to set the memory capacity of the `URLCache` to zero to avoid storing the same content in-memory twice.
  449 +
  450 +#### Duplicate Downloads
  451 +
  452 +Sometimes application logic can end up attempting to download an image more than once before the initial download request is complete. Most often, this results in the image being downloaded more than once. AlamofireImage handles this case elegantly by merging the duplicate downloads. The image will only be downloaded once, yet both completion handlers will be called.
  453 +
  454 +##### Image Filter Reuse
  455 +
  456 +In addition to merging duplicate downloads, AlamofireImage can also merge duplicate image filters. If two image filters with the same identifier are attached to the same download, the image filter is only executed once and both completion handlers are called with the same resulting image. This can save large amounts of time and resources for computationally expensive filters such as ones leveraging CoreImage.
  457 +
  458 +##### Request Receipts
  459 +
  460 +Sometimes it is necessary to cancel an image download for various reasons. AlamofireImage can intelligently handle cancellation logic in the `ImageDownloader` by leveraging the `RequestReceipt` type along with the `cancelRequestForRequestReceipt` method. Each download request vends a `RequestReceipt` which can be later used to cancel the request.
  461 +
  462 +By cancelling the request through the `ImageDownloader` using the `RequestReceipt`, AlamofireImage is able to determine how to best handle the cancellation. The cancelled download will always receive a cancellation error, while duplicate downloads are allowed to complete. If the download is already active, it is allowed to complete even though the completion handler will be called with a cancellation error. This greatly improves performance of table and collection views displaying large amounts of images.
  463 +
  464 +> It is NOT recommended to directly call `cancel` on the `request` in the `RequestReceipt`. Doing so can lead to issues such as duplicate downloads never being allowed to complete.
  465 +
  466 +### UIImageView Extension
  467 +
  468 +The [UIImage Extensions](#uiimage-extensions), [Image Filters](#image-filters), [Image Cache](#image-cache) and [Image Downloader](#image-downloader) were all designed to be flexible and standalone, yet also to provide the foundation of the `UIImageView` extension. Due to the powerful support of these classes, protocols and extensions, the `UIImageView` APIs are concise, easy to use and contain a large amount of functionality.
  469 +
  470 +#### Setting Image with URL
  471 +
  472 +Setting the image with a URL will asynchronously download the image and set it once the request is finished.
  473 +
  474 +```swift
  475 +let imageView = UIImageView(frame: frame)
  476 +let url = URL(string: "https://httpbin.org/image/png")!
  477 +
  478 +imageView.af_setImage(withURL: url)
  479 +```
  480 +
  481 +> If the image is cached locally, the image is set immediately.
  482 +
  483 +#### Placeholder Images
  484 +
  485 +By specifying a placeholder image, the image view uses the placeholder image until the remote image is downloaded.
  486 +
  487 +```swift
  488 +let imageView = UIImageView(frame: frame)
  489 +let url = URL(string: "https://httpbin.org/image/png")!
  490 +let placeholderImage = UIImage(named: "placeholder")!
  491 +
  492 +imageView.af_setImage(withURL: url, placeholderImage: placeholderImage)
  493 +```
  494 +
  495 +> If the remote image is cached locally, the placeholder image is never set.
  496 +
  497 +#### Image Filters
  498 +
  499 +If an image filter is specified, it is applied asynchronously after the remote image is downloaded. Once the filter execution is complete, the resulting image is set on the image view.
  500 +
  501 +```swift
  502 +let imageView = UIImageView(frame: frame)
  503 +
  504 +let url = URL(string: "https://httpbin.org/image/png")!
  505 +let placeholderImage = UIImage(named: "placeholder")!
  506 +
  507 +let filter = AspectScaledToFillSizeWithRoundedCornersFilter(
  508 + size: imageView.frame.size,
  509 + radius: 20.0
  510 +)
  511 +
  512 +imageView.af_setImage(
  513 + withURL: url,
  514 + placeholderImage: placeholderImage,
  515 + filter: filter
  516 +)
  517 +```
  518 +
  519 +> If the remote image with the applied filter is cached locally, the image is set immediately.
  520 +
  521 +#### Image Transitions
  522 +
  523 +By default, there is no image transition animation when setting the image on the image view. If you wish to add a cross dissolve or flip-from-bottom animation, then specify an `ImageTransition` with the preferred duration.
  524 +
  525 +```swift
  526 +let imageView = UIImageView(frame: frame)
  527 +
  528 +let url = URL(string: "https://httpbin.org/image/png")!
  529 +let placeholderImage = UIImage(named: "placeholder")!
  530 +
  531 +let filter = AspectScaledToFillSizeWithRoundedCornersFilter(
  532 + size: imageView.frame.size,
  533 + radius: 20.0
  534 +)
  535 +
  536 +imageView.af_setImage(
  537 + withURL: url,
  538 + placeholderImage: placeholderImage,
  539 + filter: filter,
  540 + imageTransition: .crossDissolve(0.2)
  541 +)
  542 +```
  543 +
  544 +> If the remote image is cached locally, the image transition is ignored.
  545 +
  546 +#### Image Downloader
  547 +
  548 +The `UIImageView` extension is powered by the default `ImageDownloader` instance. To customize cache capacities, download priorities, request cache policies, timeout durations, etc., please refer to the [Image Downloader](#image-downloader) documentation.
  549 +
  550 +##### Authentication
  551 +
  552 +If an image requires and authentication credential from the `UIImageView` extension, it can be provided as follows:
  553 +
  554 +```swift
  555 +ImageDownloader.default.addAuthentication(user: "user", password: "password")
  556 +```
  557 +
  558 +---
  559 +
  560 +## Credits
  561 +
  562 +Alamofire is owned and maintained by the [Alamofire Software Foundation](http://alamofire.org). You can follow them on Twitter at [@AlamofireSF](https://twitter.com/AlamofireSF) for project updates and releases.
  563 +
  564 +### Security Disclosure
  565 +
  566 +If you believe you have identified a security vulnerability with AlamofireImage, you should report it as soon as possible via email to security@alamofire.org. Please do not post it to a public issue tracker.
  567 +
  568 +## Donations
  569 +
  570 +The [ASF](https://github.com/Alamofire/Foundation#members) is looking to raise money to officially register as a federal non-profit organization. Registering will allow us members to gain some legal protections and also allow us to put donations to use, tax free. Donating to the ASF will enable us to:
  571 +
  572 +* Pay our legal fees to register as a federal non-profit organization
  573 +* Pay our yearly legal fees to keep the non-profit in good status
  574 +* Pay for our mail servers to help us stay on top of all questions and security issues
  575 +* Potentially fund test servers to make it easier for us to test the edge cases
  576 +* Potentially fund developers to work on one of our projects full-time
  577 +
  578 +The community adoption of the ASF libraries has been amazing. We are greatly humbled by your enthusiasm around the projects, and want to continue to do everything we can to move the needle forward. With your continued support, the ASF will be able to improve its reach and also provide better legal safety for the core members. If you use any of our libraries for work, see if your employers would be interested in donating. Our initial goal is to raise $1000 to get all our legal ducks in a row and kickstart this campaign. Any amount you can donate today to help us reach our goal would be greatly appreciated.
  579 +
  580 +<a href='https://pledgie.com/campaigns/31474'><img alt='Click here to lend your support to: Alamofire Software Foundation and make a donation at pledgie.com !' src='https://pledgie.com/campaigns/31474.png?skin_name=chrome' border='0' ></a>
  581 +
  582 +## License
  583 +
  584 +AlamofireImage is released under the MIT license. See LICENSE for details.
... ...
ParentAssistant/Pods/AlamofireImage/Source/AFIError.swift 0 → 100644
... ... @@ -0,0 +1,63 @@
  1 +//
  2 +// AFIError.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +import Foundation
  26 +
  27 +/// `AFIError` is the error type returned by AlamofireImage.
  28 +///
  29 +/// - requestCancelled: The request was explicitly cancelled.
  30 +/// - imageSerializationFailed: Response data could not be serialized into an image.
  31 +public enum AFIError: Error {
  32 + case requestCancelled
  33 + case imageSerializationFailed
  34 +}
  35 +
  36 +// MARK: - Error Booleans
  37 +
  38 +extension AFIError {
  39 + /// Returns `true` if the `AFIError` is a request cancellation error, `false` otherwise.
  40 + public var isRequestCancelledError: Bool {
  41 + if case .requestCancelled = self { return true }
  42 + return false
  43 + }
  44 +
  45 + /// Returns `true` if the `AFIError` is an image serialization error, `false` otherwise.
  46 + public var isImageSerializationFailedError: Bool {
  47 + if case .imageSerializationFailed = self { return true }
  48 + return false
  49 + }
  50 +}
  51 +
  52 +// MARK: - Error Descriptions
  53 +
  54 +extension AFIError: LocalizedError {
  55 + public var errorDescription: String? {
  56 + switch self {
  57 + case .requestCancelled:
  58 + return "The request was explicitly cancelled."
  59 + case .imageSerializationFailed:
  60 + return "Response data could not be serialized into an image."
  61 + }
  62 + }
  63 +}
... ...
ParentAssistant/Pods/AlamofireImage/Source/Image.swift 0 → 100644
... ... @@ -0,0 +1,33 @@
  1 +//
  2 +// Image.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +import Foundation
  26 +
  27 +#if os(iOS) || os(tvOS) || os(watchOS)
  28 +import UIKit
  29 +public typealias Image = UIImage
  30 +#elseif os(macOS)
  31 +import Cocoa
  32 +public typealias Image = NSImage
  33 +#endif
... ...
ParentAssistant/Pods/AlamofireImage/Source/ImageCache.swift 0 → 100644
... ... @@ -0,0 +1,345 @@
  1 +//
  2 +// ImageCache.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +import Alamofire
  26 +import Foundation
  27 +
  28 +#if os(iOS) || os(tvOS) || os(watchOS)
  29 +import UIKit
  30 +#elseif os(macOS)
  31 +import Cocoa
  32 +#endif
  33 +
  34 +// MARK: ImageCache
  35 +
  36 +/// The `ImageCache` protocol defines a set of APIs for adding, removing and fetching images from a cache.
  37 +public protocol ImageCache {
  38 + /// Adds the image to the cache with the given identifier.
  39 + func add(_ image: Image, withIdentifier identifier: String)
  40 +
  41 + /// Removes the image from the cache matching the given identifier.
  42 + func removeImage(withIdentifier identifier: String) -> Bool
  43 +
  44 + /// Removes all images stored in the cache.
  45 + @discardableResult
  46 + func removeAllImages() -> Bool
  47 +
  48 + /// Returns the image in the cache associated with the given identifier.
  49 + func image(withIdentifier identifier: String) -> Image?
  50 +}
  51 +
  52 +/// The `ImageRequestCache` protocol extends the `ImageCache` protocol by adding methods for adding, removing and
  53 +/// fetching images from a cache given an `URLRequest` and additional identifier.
  54 +public protocol ImageRequestCache: ImageCache {
  55 + /// Adds the image to the cache using an identifier created from the request and identifier.
  56 + func add(_ image: Image, for request: URLRequest, withIdentifier identifier: String?)
  57 +
  58 + /// Removes the image from the cache using an identifier created from the request and identifier.
  59 + func removeImage(for request: URLRequest, withIdentifier identifier: String?) -> Bool
  60 +
  61 + /// Returns the image from the cache associated with an identifier created from the request and identifier.
  62 + func image(for request: URLRequest, withIdentifier identifier: String?) -> Image?
  63 +}
  64 +
  65 +// MARK: -
  66 +
  67 +/// The `AutoPurgingImageCache` in an in-memory image cache used to store images up to a given memory capacity. When
  68 +/// the memory capacity is reached, the image cache is sorted by last access date, then the oldest image is continuously
  69 +/// purged until the preferred memory usage after purge is met. Each time an image is accessed through the cache, the
  70 +/// internal access date of the image is updated.
  71 +open class AutoPurgingImageCache: ImageRequestCache {
  72 + class CachedImage {
  73 + let image: Image
  74 + let identifier: String
  75 + let totalBytes: UInt64
  76 + var lastAccessDate: Date
  77 +
  78 + init(_ image: Image, identifier: String) {
  79 + self.image = image
  80 + self.identifier = identifier
  81 + self.lastAccessDate = Date()
  82 +
  83 + self.totalBytes = {
  84 + #if os(iOS) || os(tvOS) || os(watchOS)
  85 + let size = CGSize(width: image.size.width * image.scale, height: image.size.height * image.scale)
  86 + #elseif os(macOS)
  87 + let size = CGSize(width: image.size.width, height: image.size.height)
  88 + #endif
  89 +
  90 + let bytesPerPixel: CGFloat = 4.0
  91 + let bytesPerRow = size.width * bytesPerPixel
  92 + let totalBytes = UInt64(bytesPerRow) * UInt64(size.height)
  93 +
  94 + return totalBytes
  95 + }()
  96 + }
  97 +
  98 + func accessImage() -> Image {
  99 + lastAccessDate = Date()
  100 + return image
  101 + }
  102 + }
  103 +
  104 + // MARK: Properties
  105 +
  106 + /// The current total memory usage in bytes of all images stored within the cache.
  107 + open var memoryUsage: UInt64 {
  108 + var memoryUsage: UInt64 = 0
  109 + synchronizationQueue.sync { memoryUsage = self.currentMemoryUsage }
  110 +
  111 + return memoryUsage
  112 + }
  113 +
  114 + /// The total memory capacity of the cache in bytes.
  115 + open let memoryCapacity: UInt64
  116 +
  117 + /// The preferred memory usage after purge in bytes. During a purge, images will be purged until the memory
  118 + /// capacity drops below this limit.
  119 + open let preferredMemoryUsageAfterPurge: UInt64
  120 +
  121 + private let synchronizationQueue: DispatchQueue
  122 + private var cachedImages: [String: CachedImage]
  123 + private var currentMemoryUsage: UInt64
  124 +
  125 + // MARK: Initialization
  126 +
  127 + /// Initialies the `AutoPurgingImageCache` instance with the given memory capacity and preferred memory usage
  128 + /// after purge limit.
  129 + ///
  130 + /// Please note, the memory capacity must always be greater than or equal to the preferred memory usage after purge.
  131 + ///
  132 + /// - parameter memoryCapacity: The total memory capacity of the cache in bytes. `100 MB` by default.
  133 + /// - parameter preferredMemoryUsageAfterPurge: The preferred memory usage after purge in bytes. `60 MB` by default.
  134 + ///
  135 + /// - returns: The new `AutoPurgingImageCache` instance.
  136 + public init(memoryCapacity: UInt64 = 100_000_000, preferredMemoryUsageAfterPurge: UInt64 = 60_000_000) {
  137 + self.memoryCapacity = memoryCapacity
  138 + self.preferredMemoryUsageAfterPurge = preferredMemoryUsageAfterPurge
  139 +
  140 + precondition(
  141 + memoryCapacity >= preferredMemoryUsageAfterPurge,
  142 + "The `memoryCapacity` must be greater than or equal to `preferredMemoryUsageAfterPurge`"
  143 + )
  144 +
  145 + self.cachedImages = [:]
  146 + self.currentMemoryUsage = 0
  147 +
  148 + self.synchronizationQueue = {
  149 + let name = String(format: "org.alamofire.autopurgingimagecache-%08x%08x", arc4random(), arc4random())
  150 + return DispatchQueue(label: name, attributes: .concurrent)
  151 + }()
  152 +
  153 + #if os(iOS) || os(tvOS)
  154 + NotificationCenter.default.addObserver(
  155 + self,
  156 + selector: #selector(AutoPurgingImageCache.removeAllImages),
  157 + name: Notification.Name.UIApplicationDidReceiveMemoryWarning,
  158 + object: nil
  159 + )
  160 + #endif
  161 + }
  162 +
  163 + deinit {
  164 + NotificationCenter.default.removeObserver(self)
  165 + }
  166 +
  167 + // MARK: Add Image to Cache
  168 +
  169 + /// Adds the image to the cache using an identifier created from the request and optional identifier.
  170 + ///
  171 + /// - parameter image: The image to add to the cache.
  172 + /// - parameter request: The request used to generate the image's unique identifier.
  173 + /// - parameter identifier: The additional identifier to append to the image's unique identifier.
  174 + open func add(_ image: Image, for request: URLRequest, withIdentifier identifier: String? = nil) {
  175 + let requestIdentifier = imageCacheKey(for: request, withIdentifier: identifier)
  176 + add(image, withIdentifier: requestIdentifier)
  177 + }
  178 +
  179 + /// Adds the image to the cache with the given identifier.
  180 + ///
  181 + /// - parameter image: The image to add to the cache.
  182 + /// - parameter identifier: The identifier to use to uniquely identify the image.
  183 + open func add(_ image: Image, withIdentifier identifier: String) {
  184 + synchronizationQueue.async(flags: [.barrier]) {
  185 + let cachedImage = CachedImage(image, identifier: identifier)
  186 +
  187 + if let previousCachedImage = self.cachedImages[identifier] {
  188 + self.currentMemoryUsage -= previousCachedImage.totalBytes
  189 + }
  190 +
  191 + self.cachedImages[identifier] = cachedImage
  192 + self.currentMemoryUsage += cachedImage.totalBytes
  193 + }
  194 +
  195 + synchronizationQueue.async(flags: [.barrier]) {
  196 + if self.currentMemoryUsage > self.memoryCapacity {
  197 + let bytesToPurge = self.currentMemoryUsage - self.preferredMemoryUsageAfterPurge
  198 +
  199 + var sortedImages = self.cachedImages.map { $1 }
  200 +
  201 + sortedImages.sort {
  202 + let date1 = $0.lastAccessDate
  203 + let date2 = $1.lastAccessDate
  204 +
  205 + return date1.timeIntervalSince(date2) < 0.0
  206 + }
  207 +
  208 + var bytesPurged = UInt64(0)
  209 +
  210 + for cachedImage in sortedImages {
  211 + self.cachedImages.removeValue(forKey: cachedImage.identifier)
  212 + bytesPurged += cachedImage.totalBytes
  213 +
  214 + if bytesPurged >= bytesToPurge {
  215 + break
  216 + }
  217 + }
  218 +
  219 + self.currentMemoryUsage -= bytesPurged
  220 + }
  221 + }
  222 + }
  223 +
  224 + // MARK: Remove Image from Cache
  225 +
  226 + /// Removes the image from the cache using an identifier created from the request and optional identifier.
  227 + ///
  228 + /// - parameter request: The request used to generate the image's unique identifier.
  229 + /// - parameter identifier: The additional identifier to append to the image's unique identifier.
  230 + ///
  231 + /// - returns: `true` if the image was removed, `false` otherwise.
  232 + @discardableResult
  233 + open func removeImage(for request: URLRequest, withIdentifier identifier: String?) -> Bool {
  234 + let requestIdentifier = imageCacheKey(for: request, withIdentifier: identifier)
  235 + return removeImage(withIdentifier: requestIdentifier)
  236 + }
  237 +
  238 + /// Removes all images from the cache created from the request.
  239 + ///
  240 + /// - parameter request: The request used to generate the image's unique identifier.
  241 + ///
  242 + /// - returns: `true` if any images were removed, `false` otherwise.
  243 + @discardableResult
  244 + open func removeImages(matching request: URLRequest) -> Bool {
  245 + let requestIdentifier = imageCacheKey(for: request, withIdentifier: nil)
  246 + var removed = false
  247 +
  248 + synchronizationQueue.sync {
  249 + for key in self.cachedImages.keys where key.hasPrefix(requestIdentifier) {
  250 + if let cachedImage = self.cachedImages.removeValue(forKey: key) {
  251 + self.currentMemoryUsage -= cachedImage.totalBytes
  252 + removed = true
  253 + }
  254 + }
  255 + }
  256 +
  257 + return removed
  258 + }
  259 +
  260 + /// Removes the image from the cache matching the given identifier.
  261 + ///
  262 + /// - parameter identifier: The unique identifier for the image.
  263 + ///
  264 + /// - returns: `true` if the image was removed, `false` otherwise.
  265 + @discardableResult
  266 + open func removeImage(withIdentifier identifier: String) -> Bool {
  267 + var removed = false
  268 +
  269 + synchronizationQueue.sync {
  270 + if let cachedImage = self.cachedImages.removeValue(forKey: identifier) {
  271 + self.currentMemoryUsage -= cachedImage.totalBytes
  272 + removed = true
  273 + }
  274 + }
  275 +
  276 + return removed
  277 + }
  278 +
  279 + /// Removes all images stored in the cache.
  280 + ///
  281 + /// - returns: `true` if images were removed from the cache, `false` otherwise.
  282 + @discardableResult @objc
  283 + open func removeAllImages() -> Bool {
  284 + var removed = false
  285 +
  286 + synchronizationQueue.sync {
  287 + if !self.cachedImages.isEmpty {
  288 + self.cachedImages.removeAll()
  289 + self.currentMemoryUsage = 0
  290 +
  291 + removed = true
  292 + }
  293 + }
  294 +
  295 + return removed
  296 + }
  297 +
  298 + // MARK: Fetch Image from Cache
  299 +
  300 + /// Returns the image from the cache associated with an identifier created from the request and optional identifier.
  301 + ///
  302 + /// - parameter request: The request used to generate the image's unique identifier.
  303 + /// - parameter identifier: The additional identifier to append to the image's unique identifier.
  304 + ///
  305 + /// - returns: The image if it is stored in the cache, `nil` otherwise.
  306 + open func image(for request: URLRequest, withIdentifier identifier: String? = nil) -> Image? {
  307 + let requestIdentifier = imageCacheKey(for: request, withIdentifier: identifier)
  308 + return image(withIdentifier: requestIdentifier)
  309 + }
  310 +
  311 + /// Returns the image in the cache associated with the given identifier.
  312 + ///
  313 + /// - parameter identifier: The unique identifier for the image.
  314 + ///
  315 + /// - returns: The image if it is stored in the cache, `nil` otherwise.
  316 + open func image(withIdentifier identifier: String) -> Image? {
  317 + var image: Image?
  318 +
  319 + synchronizationQueue.sync {
  320 + if let cachedImage = self.cachedImages[identifier] {
  321 + image = cachedImage.accessImage()
  322 + }
  323 + }
  324 +
  325 + return image
  326 + }
  327 +
  328 + // MARK: Image Cache Keys
  329 +
  330 + /// Returns the unique image cache key for the specified request and additional identifier.
  331 + ///
  332 + /// - parameter request: The request.
  333 + /// - parameter identifier: The additional identifier.
  334 + ///
  335 + /// - returns: The unique image cache key.
  336 + open func imageCacheKey(for request: URLRequest, withIdentifier identifier: String?) -> String {
  337 + var key = request.url?.absoluteString ?? ""
  338 +
  339 + if let identifier = identifier {
  340 + key += "-\(identifier)"
  341 + }
  342 +
  343 + return key
  344 + }
  345 +}
... ...
ParentAssistant/Pods/AlamofireImage/Source/ImageDownloader.swift 0 → 100644
... ... @@ -0,0 +1,559 @@
  1 +//
  2 +// ImageDownloader.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +import Alamofire
  26 +import Foundation
  27 +
  28 +#if os(iOS) || os(tvOS) || os(watchOS)
  29 +import UIKit
  30 +#elseif os(macOS)
  31 +import Cocoa
  32 +#endif
  33 +
  34 +/// The `RequestReceipt` is an object vended by the `ImageDownloader` when starting a download request. It can be used
  35 +/// to cancel active requests running on the `ImageDownloader` session. As a general rule, image download requests
  36 +/// should be cancelled using the `RequestReceipt` instead of calling `cancel` directly on the `request` itself. The
  37 +/// `ImageDownloader` is optimized to handle duplicate request scenarios as well as pending versus active downloads.
  38 +open class RequestReceipt {
  39 + /// The download request created by the `ImageDownloader`.
  40 + open let request: Request
  41 +
  42 + /// The unique identifier for the image filters and completion handlers when duplicate requests are made.
  43 + open let receiptID: String
  44 +
  45 + init(request: Request, receiptID: String) {
  46 + self.request = request
  47 + self.receiptID = receiptID
  48 + }
  49 +}
  50 +
  51 +// MARK: -
  52 +
  53 +/// The `ImageDownloader` class is responsible for downloading images in parallel on a prioritized queue. Incoming
  54 +/// downloads are added to the front or back of the queue depending on the download prioritization. Each downloaded
  55 +/// image is cached in the underlying `NSURLCache` as well as the in-memory image cache that supports image filters.
  56 +/// By default, any download request with a cached image equivalent in the image cache will automatically be served the
  57 +/// cached image representation. Additional advanced features include supporting multiple image filters and completion
  58 +/// handlers for a single request.
  59 +open class ImageDownloader {
  60 + /// The completion handler closure used when an image download completes.
  61 + public typealias CompletionHandler = (DataResponse<Image>) -> Void
  62 +
  63 + /// The progress handler closure called periodically during an image download.
  64 + public typealias ProgressHandler = DataRequest.ProgressHandler
  65 +
  66 + // MARK: Helper Types
  67 +
  68 + /// Defines the order prioritization of incoming download requests being inserted into the queue.
  69 + ///
  70 + /// - fifo: All incoming downloads are added to the back of the queue.
  71 + /// - lifo: All incoming downloads are added to the front of the queue.
  72 + public enum DownloadPrioritization {
  73 + case fifo, lifo
  74 + }
  75 +
  76 + class ResponseHandler {
  77 + let urlID: String
  78 + let handlerID: String
  79 + let request: DataRequest
  80 + var operations: [(receiptID: String, filter: ImageFilter?, completion: CompletionHandler?)]
  81 +
  82 + init(
  83 + request: DataRequest,
  84 + handlerID: String,
  85 + receiptID: String,
  86 + filter: ImageFilter?,
  87 + completion: CompletionHandler?)
  88 + {
  89 + self.request = request
  90 + self.urlID = ImageDownloader.urlIdentifier(for: request.request!)
  91 + self.handlerID = handlerID
  92 + self.operations = [(receiptID: receiptID, filter: filter, completion: completion)]
  93 + }
  94 + }
  95 +
  96 + // MARK: Properties
  97 +
  98 + /// The image cache used to store all downloaded images in.
  99 + open let imageCache: ImageRequestCache?
  100 +
  101 + /// The credential used for authenticating each download request.
  102 + open private(set) var credential: URLCredential?
  103 +
  104 + /// Response serializer used to convert the image data to UIImage.
  105 + public var imageResponseSerializer = DataRequest.imageResponseSerializer()
  106 +
  107 + /// The underlying Alamofire `Manager` instance used to handle all download requests.
  108 + open let sessionManager: SessionManager
  109 +
  110 + let downloadPrioritization: DownloadPrioritization
  111 + let maximumActiveDownloads: Int
  112 +
  113 + var activeRequestCount = 0
  114 + var queuedRequests: [Request] = []
  115 + var responseHandlers: [String: ResponseHandler] = [:]
  116 +
  117 + private let synchronizationQueue: DispatchQueue = {
  118 + let name = String(format: "org.alamofire.imagedownloader.synchronizationqueue-%08x%08x", arc4random(), arc4random())
  119 + return DispatchQueue(label: name)
  120 + }()
  121 +
  122 + private let responseQueue: DispatchQueue = {
  123 + let name = String(format: "org.alamofire.imagedownloader.responsequeue-%08x%08x", arc4random(), arc4random())
  124 + return DispatchQueue(label: name, attributes: .concurrent)
  125 + }()
  126 +
  127 + // MARK: Initialization
  128 +
  129 + /// The default instance of `ImageDownloader` initialized with default values.
  130 + open static let `default` = ImageDownloader()
  131 +
  132 + /// Creates a default `URLSessionConfiguration` with common usage parameter values.
  133 + ///
  134 + /// - returns: The default `URLSessionConfiguration` instance.
  135 + open class func defaultURLSessionConfiguration() -> URLSessionConfiguration {
  136 + let configuration = URLSessionConfiguration.default
  137 +
  138 + configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
  139 + configuration.httpShouldSetCookies = true
  140 + configuration.httpShouldUsePipelining = false
  141 +
  142 + configuration.requestCachePolicy = .useProtocolCachePolicy
  143 + configuration.allowsCellularAccess = true
  144 + configuration.timeoutIntervalForRequest = 60
  145 +
  146 + configuration.urlCache = ImageDownloader.defaultURLCache()
  147 +
  148 + return configuration
  149 + }
  150 +
  151 + /// Creates a default `URLCache` with common usage parameter values.
  152 + ///
  153 + /// - returns: The default `URLCache` instance.
  154 + open class func defaultURLCache() -> URLCache {
  155 + return URLCache(
  156 + memoryCapacity: 20 * 1024 * 1024, // 20 MB
  157 + diskCapacity: 150 * 1024 * 1024, // 150 MB
  158 + diskPath: "org.alamofire.imagedownloader"
  159 + )
  160 + }
  161 +
  162 + /// Initializes the `ImageDownloader` instance with the given configuration, download prioritization, maximum active
  163 + /// download count and image cache.
  164 + ///
  165 + /// - parameter configuration: The `URLSessionConfiguration` to use to create the underlying Alamofire
  166 + /// `SessionManager` instance.
  167 + /// - parameter downloadPrioritization: The download prioritization of the download queue. `.fifo` by default.
  168 + /// - parameter maximumActiveDownloads: The maximum number of active downloads allowed at any given time.
  169 + /// - parameter imageCache: The image cache used to store all downloaded images in.
  170 + ///
  171 + /// - returns: The new `ImageDownloader` instance.
  172 + public init(
  173 + configuration: URLSessionConfiguration = ImageDownloader.defaultURLSessionConfiguration(),
  174 + downloadPrioritization: DownloadPrioritization = .fifo,
  175 + maximumActiveDownloads: Int = 4,
  176 + imageCache: ImageRequestCache? = AutoPurgingImageCache())
  177 + {
  178 + self.sessionManager = SessionManager(configuration: configuration)
  179 + self.sessionManager.startRequestsImmediately = false
  180 +
  181 + self.downloadPrioritization = downloadPrioritization
  182 + self.maximumActiveDownloads = maximumActiveDownloads
  183 + self.imageCache = imageCache
  184 + }
  185 +
  186 + /// Initializes the `ImageDownloader` instance with the given session manager, download prioritization, maximum
  187 + /// active download count and image cache.
  188 + ///
  189 + /// - parameter sessionManager: The Alamofire `SessionManager` instance to handle all download requests.
  190 + /// - parameter downloadPrioritization: The download prioritization of the download queue. `.fifo` by default.
  191 + /// - parameter maximumActiveDownloads: The maximum number of active downloads allowed at any given time.
  192 + /// - parameter imageCache: The image cache used to store all downloaded images in.
  193 + ///
  194 + /// - returns: The new `ImageDownloader` instance.
  195 + public init(
  196 + sessionManager: SessionManager,
  197 + downloadPrioritization: DownloadPrioritization = .fifo,
  198 + maximumActiveDownloads: Int = 4,
  199 + imageCache: ImageRequestCache? = AutoPurgingImageCache())
  200 + {
  201 + self.sessionManager = sessionManager
  202 + self.sessionManager.startRequestsImmediately = false
  203 +
  204 + self.downloadPrioritization = downloadPrioritization
  205 + self.maximumActiveDownloads = maximumActiveDownloads
  206 + self.imageCache = imageCache
  207 + }
  208 +
  209 + // MARK: Authentication
  210 +
  211 + /// Associates an HTTP Basic Auth credential with all future download requests.
  212 + ///
  213 + /// - parameter user: The user.
  214 + /// - parameter password: The password.
  215 + /// - parameter persistence: The URL credential persistence. `.forSession` by default.
  216 + open func addAuthentication(
  217 + user: String,
  218 + password: String,
  219 + persistence: URLCredential.Persistence = .forSession)
  220 + {
  221 + let credential = URLCredential(user: user, password: password, persistence: persistence)
  222 + addAuthentication(usingCredential: credential)
  223 + }
  224 +
  225 + /// Associates the specified credential with all future download requests.
  226 + ///
  227 + /// - parameter credential: The credential.
  228 + open func addAuthentication(usingCredential credential: URLCredential) {
  229 + synchronizationQueue.sync {
  230 + self.credential = credential
  231 + }
  232 + }
  233 +
  234 + // MARK: Download
  235 +
  236 + /// Creates a download request using the internal Alamofire `SessionManager` instance for the specified URL request.
  237 + ///
  238 + /// If the same download request is already in the queue or currently being downloaded, the filter and completion
  239 + /// handler are appended to the already existing request. Once the request completes, all filters and completion
  240 + /// handlers attached to the request are executed in the order they were added. Additionally, any filters attached
  241 + /// to the request with the same identifiers are only executed once. The resulting image is then passed into each
  242 + /// completion handler paired with the filter.
  243 + ///
  244 + /// You should not attempt to directly cancel the `request` inside the request receipt since other callers may be
  245 + /// relying on the completion of that request. Instead, you should call `cancelRequestForRequestReceipt` with the
  246 + /// returned request receipt to allow the `ImageDownloader` to optimize the cancellation on behalf of all active
  247 + /// callers.
  248 + ///
  249 + /// - parameter urlRequest: The URL request.
  250 + /// - parameter receiptID: The `identifier` for the `RequestReceipt` returned. Defaults to a new, randomly
  251 + /// generated UUID.
  252 + /// - parameter filter: The image filter to apply to the image after the download is complete. Defaults
  253 + /// to `nil`.
  254 + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request.
  255 + /// Defaults to `nil`.
  256 + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue.
  257 + /// - parameter completion: The closure called when the download request is complete. Defaults to `nil`.
  258 + ///
  259 + /// - returns: The request receipt for the download request if available. `nil` if the image is stored in the image
  260 + /// cache and the URL request cache policy allows the cache to be used.
  261 + @discardableResult
  262 + open func download(
  263 + _ urlRequest: URLRequestConvertible,
  264 + receiptID: String = UUID().uuidString,
  265 + filter: ImageFilter? = nil,
  266 + progress: ProgressHandler? = nil,
  267 + progressQueue: DispatchQueue = DispatchQueue.main,
  268 + completion: CompletionHandler?)
  269 + -> RequestReceipt?
  270 + {
  271 + var request: DataRequest!
  272 +
  273 + synchronizationQueue.sync {
  274 + // 1) Append the filter and completion handler to a pre-existing request if it already exists
  275 + let urlID = ImageDownloader.urlIdentifier(for: urlRequest)
  276 +
  277 + if let responseHandler = self.responseHandlers[urlID] {
  278 + responseHandler.operations.append((receiptID: receiptID, filter: filter, completion: completion))
  279 + request = responseHandler.request
  280 + return
  281 + }
  282 +
  283 + // 2) Attempt to load the image from the image cache if the cache policy allows it
  284 + if let request = urlRequest.urlRequest {
  285 + switch request.cachePolicy {
  286 + case .useProtocolCachePolicy, .returnCacheDataElseLoad, .returnCacheDataDontLoad:
  287 + if let image = self.imageCache?.image(for: request, withIdentifier: filter?.identifier) {
  288 + DispatchQueue.main.async {
  289 + let response = DataResponse<Image>(
  290 + request: urlRequest.urlRequest,
  291 + response: nil,
  292 + data: nil,
  293 + result: .success(image)
  294 + )
  295 +
  296 + completion?(response)
  297 + }
  298 +
  299 + return
  300 + }
  301 + default:
  302 + break
  303 + }
  304 + }
  305 +
  306 + // 3) Create the request and set up authentication, validation and response serialization
  307 + request = self.sessionManager.request(urlRequest)
  308 +
  309 + if let credential = self.credential {
  310 + request.authenticate(usingCredential: credential)
  311 + }
  312 +
  313 + request.validate()
  314 +
  315 + if let progress = progress {
  316 + request.downloadProgress(queue: progressQueue, closure: progress)
  317 + }
  318 +
  319 + // Generate a unique handler id to check whether the active request has changed while downloading
  320 + let handlerID = UUID().uuidString
  321 +
  322 + request.response(
  323 + queue: self.responseQueue,
  324 + responseSerializer: imageResponseSerializer,
  325 + completionHandler: { [weak self] response in
  326 + guard let strongSelf = self, let request = response.request else { return }
  327 +
  328 + defer {
  329 + strongSelf.safelyDecrementActiveRequestCount()
  330 + strongSelf.safelyStartNextRequestIfNecessary()
  331 + }
  332 +
  333 + // Early out if the request has changed out from under us
  334 + let handler = strongSelf.safelyFetchResponseHandler(withURLIdentifier: urlID)
  335 + guard handler?.handlerID == handlerID else { return }
  336 +
  337 + guard let responseHandler = strongSelf.safelyRemoveResponseHandler(withURLIdentifier: urlID) else {
  338 + return
  339 + }
  340 +
  341 + switch response.result {
  342 + case .success(let image):
  343 + var filteredImages: [String: Image] = [:]
  344 +
  345 + for (_, filter, completion) in responseHandler.operations {
  346 + var filteredImage: Image
  347 +
  348 + if let filter = filter {
  349 + if let alreadyFilteredImage = filteredImages[filter.identifier] {
  350 + filteredImage = alreadyFilteredImage
  351 + } else {
  352 + filteredImage = filter.filter(image)
  353 + filteredImages[filter.identifier] = filteredImage
  354 + }
  355 + } else {
  356 + filteredImage = image
  357 + }
  358 +
  359 + strongSelf.imageCache?.add(filteredImage, for: request, withIdentifier: filter?.identifier)
  360 +
  361 + DispatchQueue.main.async {
  362 + let response = DataResponse<Image>(
  363 + request: response.request,
  364 + response: response.response,
  365 + data: response.data,
  366 + result: .success(filteredImage),
  367 + timeline: response.timeline
  368 + )
  369 +
  370 + completion?(response)
  371 + }
  372 + }
  373 + case .failure:
  374 + for (_, _, completion) in responseHandler.operations {
  375 + DispatchQueue.main.async { completion?(response) }
  376 + }
  377 + }
  378 + }
  379 + )
  380 +
  381 + // 4) Store the response handler for use when the request completes
  382 + let responseHandler = ResponseHandler(
  383 + request: request,
  384 + handlerID: handlerID,
  385 + receiptID: receiptID,
  386 + filter: filter,
  387 + completion: completion
  388 + )
  389 +
  390 + self.responseHandlers[urlID] = responseHandler
  391 +
  392 + // 5) Either start the request or enqueue it depending on the current active request count
  393 + if self.isActiveRequestCountBelowMaximumLimit() {
  394 + self.start(request)
  395 + } else {
  396 + self.enqueue(request)
  397 + }
  398 + }
  399 +
  400 + if let request = request {
  401 + return RequestReceipt(request: request, receiptID: receiptID)
  402 + }
  403 +
  404 + return nil
  405 + }
  406 +
  407 + /// Creates a download request using the internal Alamofire `SessionManager` instance for each specified URL request.
  408 + ///
  409 + /// For each request, if the same download request is already in the queue or currently being downloaded, the
  410 + /// filter and completion handler are appended to the already existing request. Once the request completes, all
  411 + /// filters and completion handlers attached to the request are executed in the order they were added.
  412 + /// Additionally, any filters attached to the request with the same identifiers are only executed once. The
  413 + /// resulting image is then passed into each completion handler paired with the filter.
  414 + ///
  415 + /// You should not attempt to directly cancel any of the `request`s inside the request receipts array since other
  416 + /// callers may be relying on the completion of that request. Instead, you should call
  417 + /// `cancelRequestForRequestReceipt` with the returned request receipt to allow the `ImageDownloader` to optimize
  418 + /// the cancellation on behalf of all active callers.
  419 + ///
  420 + /// - parameter urlRequests: The URL requests.
  421 + /// - parameter filter The image filter to apply to the image after each download is complete.
  422 + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request. Defaults
  423 + /// to `nil`.
  424 + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue.
  425 + /// - parameter completion: The closure called when each download request is complete.
  426 + ///
  427 + /// - returns: The request receipts for the download requests if available. If an image is stored in the image
  428 + /// cache and the URL request cache policy allows the cache to be used, a receipt will not be returned
  429 + /// for that request.
  430 + @discardableResult
  431 + open func download(
  432 + _ urlRequests: [URLRequestConvertible],
  433 + filter: ImageFilter? = nil,
  434 + progress: ProgressHandler? = nil,
  435 + progressQueue: DispatchQueue = DispatchQueue.main,
  436 + completion: CompletionHandler? = nil)
  437 + -> [RequestReceipt]
  438 + {
  439 + #if swift(>=4.1)
  440 + return urlRequests.compactMap {
  441 + download($0, filter: filter, progress: progress, progressQueue: progressQueue, completion: completion)
  442 + }
  443 + #else
  444 + return urlRequests.flatMap {
  445 + download($0, filter: filter, progress: progress, progressQueue: progressQueue, completion: completion)
  446 + }
  447 + #endif
  448 + }
  449 +
  450 + /// Cancels the request in the receipt by removing the response handler and cancelling the request if necessary.
  451 + ///
  452 + /// If the request is pending in the queue, it will be cancelled if no other response handlers are registered with
  453 + /// the request. If the request is currently executing or is already completed, the response handler is removed and
  454 + /// will not be called.
  455 + ///
  456 + /// - parameter requestReceipt: The request receipt to cancel.
  457 + open func cancelRequest(with requestReceipt: RequestReceipt) {
  458 + synchronizationQueue.sync {
  459 + let urlID = ImageDownloader.urlIdentifier(for: requestReceipt.request.request!)
  460 + guard let responseHandler = self.responseHandlers[urlID] else { return }
  461 +
  462 + if let index = responseHandler.operations.index(where: { $0.receiptID == requestReceipt.receiptID }) {
  463 + let operation = responseHandler.operations.remove(at: index)
  464 +
  465 + let response: DataResponse<Image> = {
  466 + let urlRequest = requestReceipt.request.request
  467 + let error = AFIError.requestCancelled
  468 +
  469 + return DataResponse(request: urlRequest, response: nil, data: nil, result: .failure(error))
  470 + }()
  471 +
  472 + DispatchQueue.main.async { operation.completion?(response) }
  473 + }
  474 +
  475 + if responseHandler.operations.isEmpty && requestReceipt.request.task?.state == .suspended {
  476 + requestReceipt.request.cancel()
  477 + self.responseHandlers.removeValue(forKey: urlID)
  478 + }
  479 + }
  480 + }
  481 +
  482 + // MARK: Internal - Thread-Safe Request Methods
  483 +
  484 + func safelyFetchResponseHandler(withURLIdentifier urlIdentifier: String) -> ResponseHandler? {
  485 + var responseHandler: ResponseHandler?
  486 +
  487 + synchronizationQueue.sync {
  488 + responseHandler = self.responseHandlers[urlIdentifier]
  489 + }
  490 +
  491 + return responseHandler
  492 + }
  493 +
  494 + func safelyRemoveResponseHandler(withURLIdentifier identifier: String) -> ResponseHandler? {
  495 + var responseHandler: ResponseHandler?
  496 +
  497 + synchronizationQueue.sync {
  498 + responseHandler = self.responseHandlers.removeValue(forKey: identifier)
  499 + }
  500 +
  501 + return responseHandler
  502 + }
  503 +
  504 + func safelyStartNextRequestIfNecessary() {
  505 + synchronizationQueue.sync {
  506 + guard self.isActiveRequestCountBelowMaximumLimit() else { return }
  507 +
  508 + while !self.queuedRequests.isEmpty {
  509 + if let request = self.dequeue(), request.task?.state == .suspended {
  510 + self.start(request)
  511 + break
  512 + }
  513 + }
  514 + }
  515 + }
  516 +
  517 + func safelyDecrementActiveRequestCount() {
  518 + self.synchronizationQueue.sync {
  519 + if self.activeRequestCount > 0 {
  520 + self.activeRequestCount -= 1
  521 + }
  522 + }
  523 + }
  524 +
  525 + // MARK: Internal - Non Thread-Safe Request Methods
  526 +
  527 + func start(_ request: Request) {
  528 + request.resume()
  529 + activeRequestCount += 1
  530 + }
  531 +
  532 + func enqueue(_ request: Request) {
  533 + switch downloadPrioritization {
  534 + case .fifo:
  535 + queuedRequests.append(request)
  536 + case .lifo:
  537 + queuedRequests.insert(request, at: 0)
  538 + }
  539 + }
  540 +
  541 + @discardableResult
  542 + func dequeue() -> Request? {
  543 + var request: Request?
  544 +
  545 + if !queuedRequests.isEmpty {
  546 + request = queuedRequests.removeFirst()
  547 + }
  548 +
  549 + return request
  550 + }
  551 +
  552 + func isActiveRequestCountBelowMaximumLimit() -> Bool {
  553 + return activeRequestCount < maximumActiveDownloads
  554 + }
  555 +
  556 + static func urlIdentifier(for urlRequest: URLRequestConvertible) -> String {
  557 + return urlRequest.urlRequest?.url?.absoluteString ?? ""
  558 + }
  559 +}
... ...
ParentAssistant/Pods/AlamofireImage/Source/ImageFilter.swift 0 → 100644
... ... @@ -0,0 +1,423 @@
  1 +//
  2 +// ImageFilter.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +import Foundation
  26 +
  27 +#if os(iOS) || os(tvOS) || os(watchOS)
  28 +import UIKit
  29 +#elseif os(macOS)
  30 +import Cocoa
  31 +#endif
  32 +
  33 +// MARK: ImageFilter
  34 +
  35 +/// The `ImageFilter` protocol defines properties for filtering an image as well as identification of the filter.
  36 +public protocol ImageFilter {
  37 + /// A closure used to create an alternative representation of the given image.
  38 + var filter: (Image) -> Image { get }
  39 +
  40 + /// The string used to uniquely identify the filter operation.
  41 + var identifier: String { get }
  42 +}
  43 +
  44 +extension ImageFilter {
  45 + /// The unique identifier for any `ImageFilter` type.
  46 + public var identifier: String { return "\(type(of: self))" }
  47 +}
  48 +
  49 +// MARK: - Sizable
  50 +
  51 +/// The `Sizable` protocol defines a size property intended for use with `ImageFilter` types.
  52 +public protocol Sizable {
  53 + /// The size of the type.
  54 + var size: CGSize { get }
  55 +}
  56 +
  57 +extension ImageFilter where Self: Sizable {
  58 + /// The unique idenitifier for an `ImageFilter` conforming to the `Sizable` protocol.
  59 + public var identifier: String {
  60 + let width = Int64(size.width.rounded())
  61 + let height = Int64(size.height.rounded())
  62 +
  63 + return "\(type(of: self))-size:(\(width)x\(height))"
  64 + }
  65 +}
  66 +
  67 +// MARK: - Roundable
  68 +
  69 +/// The `Roundable` protocol defines a radius property intended for use with `ImageFilter` types.
  70 +public protocol Roundable {
  71 + /// The radius of the type.
  72 + var radius: CGFloat { get }
  73 +}
  74 +
  75 +extension ImageFilter where Self: Roundable {
  76 + /// The unique idenitifier for an `ImageFilter` conforming to the `Roundable` protocol.
  77 + public var identifier: String {
  78 + let radius = Int64(self.radius.rounded())
  79 + return "\(type(of: self))-radius:(\(radius))"
  80 + }
  81 +}
  82 +
  83 +// MARK: - DynamicImageFilter
  84 +
  85 +/// The `DynamicImageFilter` class simplifies custom image filter creation by using a trailing closure initializer.
  86 +public struct DynamicImageFilter: ImageFilter {
  87 + /// The string used to uniquely identify the image filter operation.
  88 + public let identifier: String
  89 +
  90 + /// A closure used to create an alternative representation of the given image.
  91 + public let filter: (Image) -> Image
  92 +
  93 + /// Initializes the `DynamicImageFilter` instance with the specified identifier and filter closure.
  94 + ///
  95 + /// - parameter identifier: The unique identifier of the filter.
  96 + /// - parameter filter: A closure used to create an alternative representation of the given image.
  97 + ///
  98 + /// - returns: The new `DynamicImageFilter` instance.
  99 + public init(_ identifier: String, filter: @escaping (Image) -> Image) {
  100 + self.identifier = identifier
  101 + self.filter = filter
  102 + }
  103 +}
  104 +
  105 +// MARK: - CompositeImageFilter
  106 +
  107 +/// The `CompositeImageFilter` protocol defines an additional `filters` property to support multiple composite filters.
  108 +public protocol CompositeImageFilter: ImageFilter {
  109 + /// The image filters to apply to the image in sequential order.
  110 + var filters: [ImageFilter] { get }
  111 +}
  112 +
  113 +public extension CompositeImageFilter {
  114 + /// The unique idenitifier for any `CompositeImageFilter` type.
  115 + var identifier: String {
  116 + return filters.map { $0.identifier }.joined(separator: "_")
  117 + }
  118 +
  119 + /// The filter closure for any `CompositeImageFilter` type.
  120 + var filter: (Image) -> Image {
  121 + return { image in
  122 + return self.filters.reduce(image) { $1.filter($0) }
  123 + }
  124 + }
  125 +}
  126 +
  127 +// MARK: - DynamicCompositeImageFilter
  128 +
  129 +/// The `DynamicCompositeImageFilter` class is a composite image filter based on a specified array of filters.
  130 +public struct DynamicCompositeImageFilter: CompositeImageFilter {
  131 + /// The image filters to apply to the image in sequential order.
  132 + public let filters: [ImageFilter]
  133 +
  134 + /// Initializes the `DynamicCompositeImageFilter` instance with the given filters.
  135 + ///
  136 + /// - parameter filters: The filters taking part in the composite image filter.
  137 + ///
  138 + /// - returns: The new `DynamicCompositeImageFilter` instance.
  139 + public init(_ filters: [ImageFilter]) {
  140 + self.filters = filters
  141 + }
  142 +
  143 + /// Initializes the `DynamicCompositeImageFilter` instance with the given filters.
  144 + ///
  145 + /// - parameter filters: The filters taking part in the composite image filter.
  146 + ///
  147 + /// - returns: The new `DynamicCompositeImageFilter` instance.
  148 + public init(_ filters: ImageFilter...) {
  149 + self.init(filters)
  150 + }
  151 +}
  152 +
  153 +#if os(iOS) || os(tvOS) || os(watchOS)
  154 +
  155 +// MARK: - Single Pass Image Filters (iOS, tvOS and watchOS only) -
  156 +
  157 +/// Scales an image to a specified size.
  158 +public struct ScaledToSizeFilter: ImageFilter, Sizable {
  159 + /// The size of the filter.
  160 + public let size: CGSize
  161 +
  162 + /// Initializes the `ScaledToSizeFilter` instance with the given size.
  163 + ///
  164 + /// - parameter size: The size.
  165 + ///
  166 + /// - returns: The new `ScaledToSizeFilter` instance.
  167 + public init(size: CGSize) {
  168 + self.size = size
  169 + }
  170 +
  171 + /// The filter closure used to create the modified representation of the given image.
  172 + public var filter: (Image) -> Image {
  173 + return { image in
  174 + return image.af_imageScaled(to: self.size)
  175 + }
  176 + }
  177 +}
  178 +
  179 +// MARK: -
  180 +
  181 +/// Scales an image from the center while maintaining the aspect ratio to fit within a specified size.
  182 +public struct AspectScaledToFitSizeFilter: ImageFilter, Sizable {
  183 + /// The size of the filter.
  184 + public let size: CGSize
  185 +
  186 + /// Initializes the `AspectScaledToFitSizeFilter` instance with the given size.
  187 + ///
  188 + /// - parameter size: The size.
  189 + ///
  190 + /// - returns: The new `AspectScaledToFitSizeFilter` instance.
  191 + public init(size: CGSize) {
  192 + self.size = size
  193 + }
  194 +
  195 + /// The filter closure used to create the modified representation of the given image.
  196 + public var filter: (Image) -> Image {
  197 + return { image in
  198 + return image.af_imageAspectScaled(toFit: self.size)
  199 + }
  200 + }
  201 +}
  202 +
  203 +// MARK: -
  204 +
  205 +/// Scales an image from the center while maintaining the aspect ratio to fill a specified size. Any pixels that fall
  206 +/// outside the specified size are clipped.
  207 +public struct AspectScaledToFillSizeFilter: ImageFilter, Sizable {
  208 + /// The size of the filter.
  209 + public let size: CGSize
  210 +
  211 + /// Initializes the `AspectScaledToFillSizeFilter` instance with the given size.
  212 + ///
  213 + /// - parameter size: The size.
  214 + ///
  215 + /// - returns: The new `AspectScaledToFillSizeFilter` instance.
  216 + public init(size: CGSize) {
  217 + self.size = size
  218 + }
  219 +
  220 + /// The filter closure used to create the modified representation of the given image.
  221 + public var filter: (Image) -> Image {
  222 + return { image in
  223 + return image.af_imageAspectScaled(toFill: self.size)
  224 + }
  225 + }
  226 +}
  227 +
  228 +// MARK: -
  229 +
  230 +/// Rounds the corners of an image to the specified radius.
  231 +public struct RoundedCornersFilter: ImageFilter, Roundable {
  232 + /// The radius of the filter.
  233 + public let radius: CGFloat
  234 +
  235 + /// Whether to divide the radius by the image scale.
  236 + public let divideRadiusByImageScale: Bool
  237 +
  238 + /// Initializes the `RoundedCornersFilter` instance with the given radius.
  239 + ///
  240 + /// - parameter radius: The radius.
  241 + /// - parameter divideRadiusByImageScale: Whether to divide the radius by the image scale. Set to `true` when the
  242 + /// image has the same resolution for all screen scales such as @1x, @2x and
  243 + /// @3x (i.e. single image from web server). Set to `false` for images loaded
  244 + /// from an asset catalog with varying resolutions for each screen scale.
  245 + /// `false` by default.
  246 + ///
  247 + /// - returns: The new `RoundedCornersFilter` instance.
  248 + public init(radius: CGFloat, divideRadiusByImageScale: Bool = false) {
  249 + self.radius = radius
  250 + self.divideRadiusByImageScale = divideRadiusByImageScale
  251 + }
  252 +
  253 + /// The filter closure used to create the modified representation of the given image.
  254 + public var filter: (Image) -> Image {
  255 + return { image in
  256 + return image.af_imageRounded(
  257 + withCornerRadius: self.radius,
  258 + divideRadiusByImageScale: self.divideRadiusByImageScale
  259 + )
  260 + }
  261 + }
  262 +
  263 + /// The unique idenitifier for an `ImageFilter` conforming to the `Roundable` protocol.
  264 + public var identifier: String {
  265 + let radius = Int64(self.radius.rounded())
  266 + return "\(type(of: self))-radius:(\(radius))-divided:(\(divideRadiusByImageScale))"
  267 + }
  268 +}
  269 +
  270 +// MARK: -
  271 +
  272 +/// Rounds the corners of an image into a circle.
  273 +public struct CircleFilter: ImageFilter {
  274 + /// Initializes the `CircleFilter` instance.
  275 + ///
  276 + /// - returns: The new `CircleFilter` instance.
  277 + public init() {}
  278 +
  279 + /// The filter closure used to create the modified representation of the given image.
  280 + public var filter: (Image) -> Image {
  281 + return { image in
  282 + return image.af_imageRoundedIntoCircle()
  283 + }
  284 + }
  285 +}
  286 +
  287 +// MARK: -
  288 +
  289 +#if os(iOS) || os(tvOS)
  290 +
  291 +/// The `CoreImageFilter` protocol defines `parameters`, `filterName` properties used by CoreImage.
  292 +@available(iOS 9.0, *)
  293 +public protocol CoreImageFilter: ImageFilter {
  294 + /// The filter name of the CoreImage filter.
  295 + var filterName: String { get }
  296 +
  297 + /// The image filter parameters passed to CoreImage.
  298 + var parameters: [String: Any] { get }
  299 +}
  300 +
  301 +@available(iOS 9.0, *)
  302 +public extension ImageFilter where Self: CoreImageFilter {
  303 + /// The filter closure used to create the modified representation of the given image.
  304 + public var filter: (Image) -> Image {
  305 + return { image in
  306 + return image.af_imageFiltered(withCoreImageFilter: self.filterName, parameters: self.parameters) ?? image
  307 + }
  308 + }
  309 +
  310 + /// The unique idenitifier for an `ImageFilter` conforming to the `CoreImageFilter` protocol.
  311 + public var identifier: String { return "\(type(of: self))-parameters:(\(self.parameters))" }
  312 +}
  313 +
  314 +/// Blurs an image using a `CIGaussianBlur` filter with the specified blur radius.
  315 +@available(iOS 9.0, *)
  316 +public struct BlurFilter: ImageFilter, CoreImageFilter {
  317 + /// The filter name.
  318 + public let filterName = "CIGaussianBlur"
  319 +
  320 + /// The image filter parameters passed to CoreImage.
  321 + public let parameters: [String: Any]
  322 +
  323 + /// Initializes the `BlurFilter` instance with the given blur radius.
  324 + ///
  325 + /// - parameter blurRadius: The blur radius.
  326 + ///
  327 + /// - returns: The new `BlurFilter` instance.
  328 + public init(blurRadius: UInt = 10) {
  329 + self.parameters = ["inputRadius": blurRadius]
  330 + }
  331 +}
  332 +
  333 +#endif
  334 +
  335 +// MARK: - Composite Image Filters (iOS, tvOS and watchOS only) -
  336 +
  337 +/// Scales an image to a specified size, then rounds the corners to the specified radius.
  338 +public struct ScaledToSizeWithRoundedCornersFilter: CompositeImageFilter {
  339 + /// Initializes the `ScaledToSizeWithRoundedCornersFilter` instance with the given size and radius.
  340 + ///
  341 + /// - parameter size: The size.
  342 + /// - parameter radius: The radius.
  343 + /// - parameter divideRadiusByImageScale: Whether to divide the radius by the image scale. Set to `true` when the
  344 + /// image has the same resolution for all screen scales such as @1x, @2x and
  345 + /// @3x (i.e. single image from web server). Set to `false` for images loaded
  346 + /// from an asset catalog with varying resolutions for each screen scale.
  347 + /// `false` by default.
  348 + ///
  349 + /// - returns: The new `ScaledToSizeWithRoundedCornersFilter` instance.
  350 + public init(size: CGSize, radius: CGFloat, divideRadiusByImageScale: Bool = false) {
  351 + self.filters = [
  352 + ScaledToSizeFilter(size: size),
  353 + RoundedCornersFilter(radius: radius, divideRadiusByImageScale: divideRadiusByImageScale)
  354 + ]
  355 + }
  356 +
  357 + /// The image filters to apply to the image in sequential order.
  358 + public let filters: [ImageFilter]
  359 +}
  360 +
  361 +// MARK: -
  362 +
  363 +/// Scales an image from the center while maintaining the aspect ratio to fit within a specified size, then rounds the
  364 +/// corners to the specified radius.
  365 +public struct AspectScaledToFillSizeWithRoundedCornersFilter: CompositeImageFilter {
  366 + /// Initializes the `AspectScaledToFillSizeWithRoundedCornersFilter` instance with the given size and radius.
  367 + ///
  368 + /// - parameter size: The size.
  369 + /// - parameter radius: The radius.
  370 + /// - parameter divideRadiusByImageScale: Whether to divide the radius by the image scale. Set to `true` when the
  371 + /// image has the same resolution for all screen scales such as @1x, @2x and
  372 + /// @3x (i.e. single image from web server). Set to `false` for images loaded
  373 + /// from an asset catalog with varying resolutions for each screen scale.
  374 + /// `false` by default.
  375 + ///
  376 + /// - returns: The new `AspectScaledToFillSizeWithRoundedCornersFilter` instance.
  377 + public init(size: CGSize, radius: CGFloat, divideRadiusByImageScale: Bool = false) {
  378 + self.filters = [
  379 + AspectScaledToFillSizeFilter(size: size),
  380 + RoundedCornersFilter(radius: radius, divideRadiusByImageScale: divideRadiusByImageScale)
  381 + ]
  382 + }
  383 +
  384 + /// The image filters to apply to the image in sequential order.
  385 + public let filters: [ImageFilter]
  386 +}
  387 +
  388 +// MARK: -
  389 +
  390 +/// Scales an image to a specified size, then rounds the corners into a circle.
  391 +public struct ScaledToSizeCircleFilter: CompositeImageFilter {
  392 + /// Initializes the `ScaledToSizeCircleFilter` instance with the given size.
  393 + ///
  394 + /// - parameter size: The size.
  395 + ///
  396 + /// - returns: The new `ScaledToSizeCircleFilter` instance.
  397 + public init(size: CGSize) {
  398 + self.filters = [ScaledToSizeFilter(size: size), CircleFilter()]
  399 + }
  400 +
  401 + /// The image filters to apply to the image in sequential order.
  402 + public let filters: [ImageFilter]
  403 +}
  404 +
  405 +// MARK: -
  406 +
  407 +/// Scales an image from the center while maintaining the aspect ratio to fit within a specified size, then rounds the
  408 +/// corners into a circle.
  409 +public struct AspectScaledToFillSizeCircleFilter: CompositeImageFilter {
  410 + /// Initializes the `AspectScaledToFillSizeCircleFilter` instance with the given size.
  411 + ///
  412 + /// - parameter size: The size.
  413 + ///
  414 + /// - returns: The new `AspectScaledToFillSizeCircleFilter` instance.
  415 + public init(size: CGSize) {
  416 + self.filters = [AspectScaledToFillSizeFilter(size: size), CircleFilter()]
  417 + }
  418 +
  419 + /// The image filters to apply to the image in sequential order.
  420 + public let filters: [ImageFilter]
  421 +}
  422 +
  423 +#endif
... ...
ParentAssistant/Pods/AlamofireImage/Source/Request+AlamofireImage.swift 0 → 100644
... ... @@ -0,0 +1,327 @@
  1 +//
  2 +// Request+AlamofireImage.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +import Alamofire
  26 +import Foundation
  27 +
  28 +#if os(iOS) || os(tvOS)
  29 +import UIKit
  30 +#elseif os(watchOS)
  31 +import UIKit
  32 +import WatchKit
  33 +#elseif os(macOS)
  34 +import Cocoa
  35 +#endif
  36 +
  37 +extension DataRequest {
  38 + static var acceptableImageContentTypes: Set<String> = [
  39 + "image/tiff",
  40 + "image/jpeg",
  41 + "image/gif",
  42 + "image/png",
  43 + "image/ico",
  44 + "image/x-icon",
  45 + "image/bmp",
  46 + "image/x-bmp",
  47 + "image/x-xbitmap",
  48 + "image/x-ms-bmp",
  49 + "image/x-win-bitmap"
  50 + ]
  51 +
  52 + static let streamImageInitialBytePattern = Data(bytes: [255, 216]) // 0xffd8
  53 +
  54 + /// Adds the content types specified to the list of acceptable images content types for validation.
  55 + ///
  56 + /// - parameter contentTypes: The additional content types.
  57 + public class func addAcceptableImageContentTypes(_ contentTypes: Set<String>) {
  58 + DataRequest.acceptableImageContentTypes.formUnion(contentTypes)
  59 + }
  60 +
  61 + // MARK: - iOS, tvOS and watchOS
  62 +
  63 +#if os(iOS) || os(tvOS) || os(watchOS)
  64 +
  65 + /// Creates a response serializer that returns an image initialized from the response data using the specified
  66 + /// image options.
  67 + ///
  68 + /// - parameter imageScale: The scale factor used when interpreting the image data to construct
  69 + /// `responseImage`. Specifying a scale factor of 1.0 results in an image whose
  70 + /// size matches the pixel-based dimensions of the image. Applying a different
  71 + /// scale factor changes the size of the image as reported by the size property.
  72 + /// `Screen.scale` by default.
  73 + /// - parameter inflateResponseImage: Whether to automatically inflate response image data for compressed formats
  74 + /// (such as PNG or JPEG). Enabling this can significantly improve drawing
  75 + /// performance as it allows a bitmap representation to be constructed in the
  76 + /// background rather than on the main thread. `true` by default.
  77 + ///
  78 + /// - returns: An image response serializer.
  79 + public class func imageResponseSerializer(
  80 + imageScale: CGFloat = DataRequest.imageScale,
  81 + inflateResponseImage: Bool = true)
  82 + -> DataResponseSerializer<Image>
  83 + {
  84 + return DataResponseSerializer { request, response, data, error in
  85 + let result = serializeResponseData(response: response, data: data, error: error)
  86 +
  87 + guard case let .success(data) = result else { return .failure(result.error!) }
  88 +
  89 + do {
  90 + try DataRequest.validateContentType(for: request, response: response)
  91 +
  92 + let image = try DataRequest.image(from: data, withImageScale: imageScale)
  93 + if inflateResponseImage { image.af_inflate() }
  94 +
  95 + return .success(image)
  96 + } catch {
  97 + return .failure(error)
  98 + }
  99 + }
  100 + }
  101 +
  102 + /// Adds a response handler to be called once the request has finished.
  103 + ///
  104 + /// - parameter imageScale: The scale factor used when interpreting the image data to construct
  105 + /// `responseImage`. Specifying a scale factor of 1.0 results in an image whose
  106 + /// size matches the pixel-based dimensions of the image. Applying a different
  107 + /// scale factor changes the size of the image as reported by the size property.
  108 + /// This is set to the value of scale of the main screen by default, which
  109 + /// automatically scales images for retina displays, for instance.
  110 + /// `Screen.scale` by default.
  111 + /// - parameter inflateResponseImage: Whether to automatically inflate response image data for compressed formats
  112 + /// (such as PNG or JPEG). Enabling this can significantly improve drawing
  113 + /// performance as it allows a bitmap representation to be constructed in the
  114 + /// background rather than on the main thread. `true` by default.
  115 + /// - parameter queue: The queue on which the completion handler is dispatched. `nil` by default,
  116 + /// which results in using `DispatchQueue.main`.
  117 + /// - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 4
  118 + /// arguments: the URL request, the URL response, if one was received, the image,
  119 + /// if one could be created from the URL response and data, and any error produced
  120 + /// while creating the image.
  121 + ///
  122 + /// - returns: The request.
  123 + @discardableResult
  124 + public func responseImage(
  125 + imageScale: CGFloat = DataRequest.imageScale,
  126 + inflateResponseImage: Bool = true,
  127 + queue: DispatchQueue? = nil,
  128 + completionHandler: @escaping (DataResponse<Image>) -> Void)
  129 + -> Self
  130 + {
  131 + return response(
  132 + queue: queue,
  133 + responseSerializer: DataRequest.imageResponseSerializer(
  134 + imageScale: imageScale,
  135 + inflateResponseImage: inflateResponseImage
  136 + ),
  137 + completionHandler: completionHandler
  138 + )
  139 + }
  140 +
  141 + /// Sets a closure to be called periodically during the lifecycle of the request as data is read from the server
  142 + /// and converted into images.
  143 + ///
  144 + /// - parameter imageScale: The scale factor used when interpreting the image data to construct
  145 + /// `responseImage`. Specifying a scale factor of 1.0 results in an image whose
  146 + /// size matches the pixel-based dimensions of the image. Applying a different
  147 + /// scale factor changes the size of the image as reported by the size property.
  148 + /// This is set to the value of scale of the main screen by default, which
  149 + /// automatically scales images for retina displays, for instance.
  150 + /// `Screen.scale` by default.
  151 + /// - parameter inflateResponseImage: Whether to automatically inflate response image data for compressed formats
  152 + /// (such as PNG or JPEG). Enabling this can significantly improve drawing
  153 + /// performance as it allows a bitmap representation to be constructed in the
  154 + /// background rather than on the main thread. `true` by default.
  155 + /// - parameter completionHandler: A closure to be executed when the request has new image. The closure takes 1
  156 + /// argument: the image, if one could be created from the data.
  157 + ///
  158 + /// - returns: The request.
  159 + @discardableResult
  160 + public func streamImage(
  161 + imageScale: CGFloat = DataRequest.imageScale,
  162 + inflateResponseImage: Bool = true,
  163 + completionHandler: @escaping (Image) -> Void)
  164 + -> Self
  165 + {
  166 + var imageData = Data()
  167 +
  168 + return stream { chunkData in
  169 + if chunkData.starts(with: DataRequest.streamImageInitialBytePattern) {
  170 + imageData = Data()
  171 + }
  172 +
  173 + imageData.append(chunkData)
  174 +
  175 + if let image = DataRequest.serializeImage(from: imageData) {
  176 + completionHandler(image)
  177 + }
  178 + }
  179 + }
  180 +
  181 + private class func serializeImage(
  182 + from data: Data,
  183 + imageScale: CGFloat = DataRequest.imageScale,
  184 + inflateResponseImage: Bool = true)
  185 + -> UIImage?
  186 + {
  187 + guard data.count > 0 else { return nil }
  188 +
  189 + do {
  190 + let image = try DataRequest.image(from: data, withImageScale: imageScale)
  191 + if inflateResponseImage { image.af_inflate() }
  192 +
  193 + return image
  194 + } catch {
  195 + return nil
  196 + }
  197 + }
  198 +
  199 + private class func image(from data: Data, withImageScale imageScale: CGFloat) throws -> UIImage {
  200 + if let image = UIImage.af_threadSafeImage(with: data, scale: imageScale) {
  201 + return image
  202 + }
  203 +
  204 + throw AFIError.imageSerializationFailed
  205 + }
  206 +
  207 + public class var imageScale: CGFloat {
  208 + #if os(iOS) || os(tvOS)
  209 + return UIScreen.main.scale
  210 + #elseif os(watchOS)
  211 + return WKInterfaceDevice.current().screenScale
  212 + #endif
  213 + }
  214 +
  215 +#elseif os(macOS)
  216 +
  217 + // MARK: - macOS
  218 +
  219 + /// Creates a response serializer that returns an image initialized from the response data.
  220 + ///
  221 + /// - returns: An image response serializer.
  222 + public class func imageResponseSerializer() -> DataResponseSerializer<Image> {
  223 + return DataResponseSerializer { request, response, data, error in
  224 + let result = serializeResponseData(response: response, data: data, error: error)
  225 +
  226 + guard case let .success(data) = result else { return .failure(result.error!) }
  227 +
  228 + do {
  229 + try DataRequest.validateContentType(for: request, response: response)
  230 + } catch {
  231 + return .failure(error)
  232 + }
  233 +
  234 + guard let bitmapImage = NSBitmapImageRep(data: data) else {
  235 + return .failure(AFIError.imageSerializationFailed)
  236 + }
  237 +
  238 + let image = NSImage(size: NSSize(width: bitmapImage.pixelsWide, height: bitmapImage.pixelsHigh))
  239 + image.addRepresentation(bitmapImage)
  240 +
  241 + return .success(image)
  242 + }
  243 + }
  244 +
  245 + /// Adds a response handler to be called once the request has finished.
  246 + ///
  247 + /// - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 4
  248 + /// arguments: the URL request, the URL response, if one was received, the image, if
  249 + /// one could be created from the URL response and data, and any error produced while
  250 + /// creating the image.
  251 + /// - parameter queue: The queue on which the completion handler is dispatched. `nil` by default,
  252 + /// which results in using `DispatchQueue.main`.
  253 + ///
  254 + /// - returns: The request.
  255 + @discardableResult
  256 + public func responseImage(
  257 + queue: DispatchQueue? = nil,
  258 + completionHandler: @escaping (DataResponse<Image>) -> Void)
  259 + -> Self {
  260 + return response(
  261 + queue: queue,
  262 + responseSerializer: DataRequest.imageResponseSerializer(),
  263 + completionHandler: completionHandler
  264 + )
  265 + }
  266 +
  267 + /// Sets a closure to be called periodically during the lifecycle of the request as data is read from the server
  268 + /// and converted into images.
  269 + ///
  270 + /// - parameter completionHandler: A closure to be executed when the request has new image. The closure takes 1
  271 + /// argument: the image, if one could be created from the data.
  272 + ///
  273 + /// - returns: The request.
  274 + @discardableResult
  275 + public func streamImage(completionHandler: @escaping (Image) -> Void) -> Self {
  276 + var imageData = Data()
  277 +
  278 + return stream { chunkData in
  279 + if chunkData.starts(with: DataRequest.streamImageInitialBytePattern) {
  280 + imageData = Data()
  281 + }
  282 +
  283 + imageData.append(chunkData)
  284 +
  285 + if let image = DataRequest.serializeImage(from: imageData) {
  286 + completionHandler(image)
  287 + }
  288 + }
  289 + }
  290 +
  291 + private class func serializeImage(from data: Data) -> NSImage? {
  292 + guard data.count > 0 else { return nil }
  293 + guard let bitmapImage = NSBitmapImageRep(data: data) else { return nil }
  294 +
  295 + let image = NSImage(size: NSSize(width: bitmapImage.pixelsWide, height: bitmapImage.pixelsHigh))
  296 + image.addRepresentation(bitmapImage)
  297 +
  298 + return image
  299 + }
  300 +
  301 +#endif
  302 +
  303 + // MARK: - Content Type Validation
  304 +
  305 + /// Returns whether the content type of the response matches one of the acceptable content types.
  306 + ///
  307 + /// - parameter request: The request.
  308 + /// - parameter response: The server response.
  309 + ///
  310 + /// - throws: An `AFError` response validation failure when an error is encountered.
  311 + public class func validateContentType(for request: URLRequest?, response: HTTPURLResponse?) throws {
  312 + if let url = request?.url, url.isFileURL { return }
  313 +
  314 + guard let mimeType = response?.mimeType else {
  315 + let contentTypes = Array(DataRequest.acceptableImageContentTypes)
  316 + throw AFError.responseValidationFailed(reason: .missingContentType(acceptableContentTypes: contentTypes))
  317 + }
  318 +
  319 + guard DataRequest.acceptableImageContentTypes.contains(mimeType) else {
  320 + let contentTypes = Array(DataRequest.acceptableImageContentTypes)
  321 +
  322 + throw AFError.responseValidationFailed(
  323 + reason: .unacceptableContentType(acceptableContentTypes: contentTypes, responseContentType: mimeType)
  324 + )
  325 + }
  326 + }
  327 +}
... ...
ParentAssistant/Pods/AlamofireImage/Source/UIButton+AlamofireImage.swift 0 → 100644
... ... @@ -0,0 +1,473 @@
  1 +//
  2 +// UIButton+AlamofireImage.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +import Alamofire
  26 +import Foundation
  27 +
  28 +#if os(iOS) || os(tvOS)
  29 +
  30 +import UIKit
  31 +
  32 +extension UIButton {
  33 +
  34 + // MARK: - Private - AssociatedKeys
  35 +
  36 + private struct AssociatedKey {
  37 + static var imageDownloader = "af_UIButton.ImageDownloader"
  38 + static var sharedImageDownloader = "af_UIButton.SharedImageDownloader"
  39 + static var imageReceipts = "af_UIButton.ImageReceipts"
  40 + static var backgroundImageReceipts = "af_UIButton.BackgroundImageReceipts"
  41 + }
  42 +
  43 + // MARK: - Properties
  44 +
  45 + /// The instance image downloader used to download all images. If this property is `nil`, the `UIButton` will
  46 + /// fallback on the `af_sharedImageDownloader` for all downloads. The most common use case for needing to use a
  47 + /// custom instance image downloader is when images are behind different basic auth credentials.
  48 + public var af_imageDownloader: ImageDownloader? {
  49 + get {
  50 + return objc_getAssociatedObject(self, &AssociatedKey.imageDownloader) as? ImageDownloader
  51 + }
  52 + set {
  53 + objc_setAssociatedObject(self, &AssociatedKey.imageDownloader, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  54 + }
  55 + }
  56 +
  57 + /// The shared image downloader used to download all images. By default, this is the default `ImageDownloader`
  58 + /// instance backed with an `AutoPurgingImageCache` which automatically evicts images from the cache when the memory
  59 + /// capacity is reached or memory warning notifications occur. The shared image downloader is only used if the
  60 + /// `af_imageDownloader` is `nil`.
  61 + public class var af_sharedImageDownloader: ImageDownloader {
  62 + get {
  63 + guard let
  64 + downloader = objc_getAssociatedObject(self, &AssociatedKey.sharedImageDownloader) as? ImageDownloader
  65 + else {
  66 + return ImageDownloader.default
  67 + }
  68 +
  69 + return downloader
  70 + }
  71 + set {
  72 + objc_setAssociatedObject(self, &AssociatedKey.sharedImageDownloader, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  73 + }
  74 + }
  75 +
  76 + private var imageRequestReceipts: [UInt: RequestReceipt] {
  77 + get {
  78 + guard let
  79 + receipts = objc_getAssociatedObject(self, &AssociatedKey.imageReceipts) as? [UInt: RequestReceipt]
  80 + else {
  81 + return [:]
  82 + }
  83 +
  84 + return receipts
  85 + }
  86 + set {
  87 + objc_setAssociatedObject(self, &AssociatedKey.imageReceipts, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  88 + }
  89 + }
  90 +
  91 + private var backgroundImageRequestReceipts: [UInt: RequestReceipt] {
  92 + get {
  93 + guard let
  94 + receipts = objc_getAssociatedObject(self, &AssociatedKey.backgroundImageReceipts) as? [UInt: RequestReceipt]
  95 + else {
  96 + return [:]
  97 + }
  98 +
  99 + return receipts
  100 + }
  101 + set {
  102 + objc_setAssociatedObject(self, &AssociatedKey.backgroundImageReceipts, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  103 + }
  104 + }
  105 +
  106 + // MARK: - Image Downloads
  107 +
  108 + /// Asynchronously downloads an image from the specified URL and sets it once the request is finished.
  109 + ///
  110 + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be
  111 + /// set immediately, and then the remote image will be set once the image request is finished.
  112 + ///
  113 + /// - parameter state: The control state of the button to set the image on.
  114 + /// - parameter url: The URL used for your image request.
  115 + /// - parameter placeholderImage: The image to be set initially until the image request finished. If `nil`, the
  116 + /// image will not change its image until the image request finishes. Defaults
  117 + /// to `nil`.
  118 + /// - parameter filter: The image filter applied to the image after the image request is finished.
  119 + /// Defaults to `nil`.
  120 + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request.
  121 + /// Defaults to `nil`.
  122 + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue.
  123 + /// - parameter completion: A closure to be executed when the image request finishes. The closure takes a
  124 + /// single response value containing either the image or the error that occurred. If
  125 + /// the image was returned from the image cache, the response will be `nil`. Defaults
  126 + /// to `nil`.
  127 + public func af_setImage(
  128 + for state: UIControlState,
  129 + url: URL,
  130 + placeholderImage: UIImage? = nil,
  131 + filter: ImageFilter? = nil,
  132 + progress: ImageDownloader.ProgressHandler? = nil,
  133 + progressQueue: DispatchQueue = DispatchQueue.main,
  134 + completion: ((DataResponse<UIImage>) -> Void)? = nil)
  135 + {
  136 + af_setImage(
  137 + for: state,
  138 + urlRequest: urlRequest(with: url),
  139 + placeholderImage: placeholderImage,
  140 + filter: filter,
  141 + progress: progress,
  142 + progressQueue: progressQueue,
  143 + completion: completion
  144 + )
  145 + }
  146 +
  147 + /// Asynchronously downloads an image from the specified URL request and sets it once the request is finished.
  148 + ///
  149 + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be
  150 + /// set immediately, and then the remote image will be set once the image request is finished.
  151 + ///
  152 + /// - parameter state: The control state of the button to set the image on.
  153 + /// - parameter urlRequest: The URL request.
  154 + /// - parameter placeholderImage: The image to be set initially until the image request finished. If `nil`, the
  155 + /// image will not change its image until the image request finishes. Defaults
  156 + /// to `nil`.
  157 + /// - parameter filter: The image filter applied to the image after the image request is finished.
  158 + /// Defaults to `nil`.
  159 + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request.
  160 + /// Defaults to `nil`.
  161 + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue.
  162 + /// - parameter completion: A closure to be executed when the image request finishes. The closure takes a
  163 + /// single response value containing either the image or the error that occurred. If
  164 + /// the image was returned from the image cache, the response will be `nil`. Defaults
  165 + /// to `nil`.
  166 + public func af_setImage(
  167 + for state: UIControlState,
  168 + urlRequest: URLRequestConvertible,
  169 + placeholderImage: UIImage? = nil,
  170 + filter: ImageFilter? = nil,
  171 + progress: ImageDownloader.ProgressHandler? = nil,
  172 + progressQueue: DispatchQueue = DispatchQueue.main,
  173 + completion: ((DataResponse<UIImage>) -> Void)? = nil)
  174 + {
  175 + guard !isImageURLRequest(urlRequest, equalToActiveRequestURLForState: state) else {
  176 + let error = AFIError.requestCancelled
  177 + let response = DataResponse<UIImage>(request: nil, response: nil, data: nil, result: .failure(error))
  178 +
  179 + completion?(response)
  180 +
  181 + return
  182 + }
  183 +
  184 + af_cancelImageRequest(for: state)
  185 +
  186 + let imageDownloader = af_imageDownloader ?? UIButton.af_sharedImageDownloader
  187 + let imageCache = imageDownloader.imageCache
  188 +
  189 + // Use the image from the image cache if it exists
  190 + if
  191 + let request = urlRequest.urlRequest,
  192 + let image = imageCache?.image(for: request, withIdentifier: filter?.identifier)
  193 + {
  194 + let response = DataResponse<UIImage>(
  195 + request: urlRequest.urlRequest,
  196 + response: nil,
  197 + data: nil,
  198 + result: .success(image)
  199 + )
  200 +
  201 + setImage(image, for: state)
  202 + completion?(response)
  203 +
  204 + return
  205 + }
  206 +
  207 + // Set the placeholder since we're going to have to download
  208 + if let placeholderImage = placeholderImage { setImage(placeholderImage, for: state) }
  209 +
  210 + // Generate a unique download id to check whether the active request has changed while downloading
  211 + let downloadID = UUID().uuidString
  212 +
  213 + // Download the image, then set the image for the control state
  214 + let requestReceipt = imageDownloader.download(
  215 + urlRequest,
  216 + receiptID: downloadID,
  217 + filter: filter,
  218 + progress: progress,
  219 + progressQueue: progressQueue,
  220 + completion: { [weak self] response in
  221 + guard
  222 + let strongSelf = self,
  223 + strongSelf.isImageURLRequest(response.request, equalToActiveRequestURLForState: state) &&
  224 + strongSelf.imageRequestReceipt(for: state)?.receiptID == downloadID
  225 + else {
  226 + completion?(response)
  227 + return
  228 + }
  229 +
  230 + if let image = response.result.value {
  231 + strongSelf.setImage(image, for: state)
  232 + }
  233 +
  234 + strongSelf.setImageRequestReceipt(nil, for: state)
  235 +
  236 + completion?(response)
  237 + }
  238 + )
  239 +
  240 + setImageRequestReceipt(requestReceipt, for: state)
  241 + }
  242 +
  243 + /// Cancels the active download request for the image, if one exists.
  244 + public func af_cancelImageRequest(for state: UIControlState) {
  245 + guard let receipt = imageRequestReceipt(for: state) else { return }
  246 +
  247 + let imageDownloader = af_imageDownloader ?? UIButton.af_sharedImageDownloader
  248 + imageDownloader.cancelRequest(with: receipt)
  249 +
  250 + setImageRequestReceipt(nil, for: state)
  251 + }
  252 +
  253 + // MARK: - Background Image Downloads
  254 +
  255 + /// Asynchronously downloads an image from the specified URL and sets it once the request is finished.
  256 + ///
  257 + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be
  258 + /// set immediately, and then the remote image will be set once the image request is finished.
  259 + ///
  260 + /// - parameter state: The control state of the button to set the image on.
  261 + /// - parameter url: The URL used for the image request.
  262 + /// - parameter placeholderImage: The image to be set initially until the image request finished. If `nil`, the
  263 + /// background image will not change its image until the image request finishes.
  264 + /// Defaults to `nil`.
  265 + /// - parameter filter: The image filter applied to the image after the image request is finished.
  266 + /// Defaults to `nil`.
  267 + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request.
  268 + /// Defaults to `nil`.
  269 + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue.
  270 + /// - parameter completion: A closure to be executed when the image request finishes. The closure takes a
  271 + /// single response value containing either the image or the error that occurred. If
  272 + /// the image was returned from the image cache, the response will be `nil`. Defaults
  273 + /// to `nil`.
  274 + public func af_setBackgroundImage(
  275 + for state: UIControlState,
  276 + url: URL,
  277 + placeholderImage: UIImage? = nil,
  278 + filter: ImageFilter? = nil,
  279 + progress: ImageDownloader.ProgressHandler? = nil,
  280 + progressQueue: DispatchQueue = DispatchQueue.main,
  281 + completion: ((DataResponse<UIImage>) -> Void)? = nil)
  282 + {
  283 + af_setBackgroundImage(
  284 + for: state,
  285 + urlRequest: urlRequest(with: url),
  286 + placeholderImage: placeholderImage,
  287 + filter: filter,
  288 + progress: progress,
  289 + progressQueue: progressQueue,
  290 + completion: completion
  291 + )
  292 + }
  293 +
  294 + /// Asynchronously downloads an image from the specified URL request and sets it once the request is finished.
  295 + ///
  296 + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be
  297 + /// set immediately, and then the remote image will be set once the image request is finished.
  298 + ///
  299 + /// - parameter state: The control state of the button to set the image on.
  300 + /// - parameter urlRequest: The URL request.
  301 + /// - parameter placeholderImage: The image to be set initially until the image request finished. If `nil`, the
  302 + /// background image will not change its image until the image request finishes.
  303 + /// Defaults to `nil`.
  304 + /// - parameter filter: The image filter applied to the image after the image request is finished.
  305 + /// Defaults to `nil`.
  306 + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request.
  307 + /// Defaults to `nil`.
  308 + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue.
  309 + /// - parameter completion: A closure to be executed when the image request finishes. The closure takes a
  310 + /// single response value containing either the image or the error that occurred. If
  311 + /// the image was returned from the image cache, the response will be `nil`. Defaults
  312 + /// to `nil`.
  313 + public func af_setBackgroundImage(
  314 + for state: UIControlState,
  315 + urlRequest: URLRequestConvertible,
  316 + placeholderImage: UIImage? = nil,
  317 + filter: ImageFilter? = nil,
  318 + progress: ImageDownloader.ProgressHandler? = nil,
  319 + progressQueue: DispatchQueue = DispatchQueue.main,
  320 + completion: ((DataResponse<UIImage>) -> Void)? = nil)
  321 + {
  322 + guard !isImageURLRequest(urlRequest, equalToActiveRequestURLForState: state) else {
  323 + let error = AFIError.requestCancelled
  324 + let response = DataResponse<UIImage>(request: nil, response: nil, data: nil, result: .failure(error))
  325 +
  326 + completion?(response)
  327 +
  328 + return
  329 + }
  330 +
  331 + af_cancelBackgroundImageRequest(for: state)
  332 +
  333 + let imageDownloader = af_imageDownloader ?? UIButton.af_sharedImageDownloader
  334 + let imageCache = imageDownloader.imageCache
  335 +
  336 + // Use the image from the image cache if it exists
  337 + if
  338 + let request = urlRequest.urlRequest,
  339 + let image = imageCache?.image(for: request, withIdentifier: filter?.identifier)
  340 + {
  341 + let response = DataResponse<UIImage>(
  342 + request: urlRequest.urlRequest,
  343 + response: nil,
  344 + data: nil,
  345 + result: .success(image)
  346 + )
  347 +
  348 + setBackgroundImage(image, for: state)
  349 + completion?(response)
  350 +
  351 + return
  352 + }
  353 +
  354 + // Set the placeholder since we're going to have to download
  355 + if let placeholderImage = placeholderImage { self.setBackgroundImage(placeholderImage, for: state) }
  356 +
  357 + // Generate a unique download id to check whether the active request has changed while downloading
  358 + let downloadID = UUID().uuidString
  359 +
  360 + // Download the image, then set the image for the control state
  361 + let requestReceipt = imageDownloader.download(
  362 + urlRequest,
  363 + receiptID: downloadID,
  364 + filter: nil,
  365 + progress: progress,
  366 + progressQueue: progressQueue,
  367 + completion: { [weak self] response in
  368 + guard
  369 + let strongSelf = self,
  370 + strongSelf.isBackgroundImageURLRequest(response.request, equalToActiveRequestURLForState: state) &&
  371 + strongSelf.backgroundImageRequestReceipt(for: state)?.receiptID == downloadID
  372 + else {
  373 + completion?(response)
  374 + return
  375 + }
  376 +
  377 + if let image = response.result.value {
  378 + strongSelf.setBackgroundImage(image, for: state)
  379 + }
  380 +
  381 + strongSelf.setBackgroundImageRequestReceipt(nil, for: state)
  382 +
  383 + completion?(response)
  384 + }
  385 + )
  386 +
  387 + setBackgroundImageRequestReceipt(requestReceipt, for: state)
  388 + }
  389 +
  390 + /// Cancels the active download request for the background image, if one exists.
  391 + public func af_cancelBackgroundImageRequest(for state: UIControlState) {
  392 + guard let receipt = backgroundImageRequestReceipt(for: state) else { return }
  393 +
  394 + let imageDownloader = af_imageDownloader ?? UIButton.af_sharedImageDownloader
  395 + imageDownloader.cancelRequest(with: receipt)
  396 +
  397 + setBackgroundImageRequestReceipt(nil, for: state)
  398 + }
  399 +
  400 + // MARK: - Internal - Image Request Receipts
  401 +
  402 + func imageRequestReceipt(for state: UIControlState) -> RequestReceipt? {
  403 + guard let receipt = imageRequestReceipts[state.rawValue] else { return nil }
  404 + return receipt
  405 + }
  406 +
  407 + func setImageRequestReceipt(_ receipt: RequestReceipt?, for state: UIControlState) {
  408 + var receipts = imageRequestReceipts
  409 + receipts[state.rawValue] = receipt
  410 +
  411 + imageRequestReceipts = receipts
  412 + }
  413 +
  414 + // MARK: - Internal - Background Image Request Receipts
  415 +
  416 + func backgroundImageRequestReceipt(for state: UIControlState) -> RequestReceipt? {
  417 + guard let receipt = backgroundImageRequestReceipts[state.rawValue] else { return nil }
  418 + return receipt
  419 + }
  420 +
  421 + func setBackgroundImageRequestReceipt(_ receipt: RequestReceipt?, for state: UIControlState) {
  422 + var receipts = backgroundImageRequestReceipts
  423 + receipts[state.rawValue] = receipt
  424 +
  425 + backgroundImageRequestReceipts = receipts
  426 + }
  427 +
  428 + // MARK: - Private - URL Request Helpers
  429 +
  430 + private func isImageURLRequest(
  431 + _ urlRequest: URLRequestConvertible?,
  432 + equalToActiveRequestURLForState state: UIControlState)
  433 + -> Bool
  434 + {
  435 + if
  436 + let currentURL = imageRequestReceipt(for: state)?.request.task?.originalRequest?.url,
  437 + let requestURL = urlRequest?.urlRequest?.url,
  438 + currentURL == requestURL
  439 + {
  440 + return true
  441 + }
  442 +
  443 + return false
  444 + }
  445 +
  446 + private func isBackgroundImageURLRequest(
  447 + _ urlRequest: URLRequestConvertible?,
  448 + equalToActiveRequestURLForState state: UIControlState)
  449 + -> Bool
  450 + {
  451 + if
  452 + let currentRequestURL = backgroundImageRequestReceipt(for: state)?.request.task?.originalRequest?.url,
  453 + let requestURL = urlRequest?.urlRequest?.url,
  454 + currentRequestURL == requestURL
  455 + {
  456 + return true
  457 + }
  458 +
  459 + return false
  460 + }
  461 +
  462 + private func urlRequest(with url: URL) -> URLRequest {
  463 + var urlRequest = URLRequest(url: url)
  464 +
  465 + for mimeType in DataRequest.acceptableImageContentTypes {
  466 + urlRequest.addValue(mimeType, forHTTPHeaderField: "Accept")
  467 + }
  468 +
  469 + return urlRequest
  470 + }
  471 +}
  472 +
  473 +#endif
... ...
ParentAssistant/Pods/AlamofireImage/Source/UIImage+AlamofireImage.swift 0 → 100644
... ... @@ -0,0 +1,315 @@
  1 +//
  2 +// UIImage+AlamofireImage.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +#if os(iOS) || os(tvOS) || os(watchOS)
  26 +
  27 +import CoreGraphics
  28 +import Foundation
  29 +import UIKit
  30 +
  31 +// MARK: Initialization
  32 +
  33 +private let lock = NSLock()
  34 +
  35 +extension UIImage {
  36 + /// Initializes and returns the image object with the specified data in a thread-safe manner.
  37 + ///
  38 + /// It has been reported that there are thread-safety issues when initializing large amounts of images
  39 + /// simultaneously. In the event of these issues occurring, this method can be used in place of
  40 + /// the `init?(data:)` method.
  41 + ///
  42 + /// - parameter data: The data object containing the image data.
  43 + ///
  44 + /// - returns: An initialized `UIImage` object, or `nil` if the method failed.
  45 + public static func af_threadSafeImage(with data: Data) -> UIImage? {
  46 + lock.lock()
  47 + let image = UIImage(data: data)
  48 + lock.unlock()
  49 +
  50 + return image
  51 + }
  52 +
  53 + /// Initializes and returns the image object with the specified data and scale in a thread-safe manner.
  54 + ///
  55 + /// It has been reported that there are thread-safety issues when initializing large amounts of images
  56 + /// simultaneously. In the event of these issues occurring, this method can be used in place of
  57 + /// the `init?(data:scale:)` method.
  58 + ///
  59 + /// - parameter data: The data object containing the image data.
  60 + /// - parameter scale: The scale factor to assume when interpreting the image data. Applying a scale factor of 1.0
  61 + /// results in an image whose size matches the pixel-based dimensions of the image. Applying a
  62 + /// different scale factor changes the size of the image as reported by the size property.
  63 + ///
  64 + /// - returns: An initialized `UIImage` object, or `nil` if the method failed.
  65 + public static func af_threadSafeImage(with data: Data, scale: CGFloat) -> UIImage? {
  66 + lock.lock()
  67 + let image = UIImage(data: data, scale: scale)
  68 + lock.unlock()
  69 +
  70 + return image
  71 + }
  72 +}
  73 +
  74 +// MARK: - Inflation
  75 +
  76 +extension UIImage {
  77 + private struct AssociatedKey {
  78 + static var inflated = "af_UIImage.Inflated"
  79 + }
  80 +
  81 + /// Returns whether the image is inflated.
  82 + public var af_inflated: Bool {
  83 + get {
  84 + if let inflated = objc_getAssociatedObject(self, &AssociatedKey.inflated) as? Bool {
  85 + return inflated
  86 + } else {
  87 + return false
  88 + }
  89 + }
  90 + set {
  91 + objc_setAssociatedObject(self, &AssociatedKey.inflated, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  92 + }
  93 + }
  94 +
  95 + /// Inflates the underlying compressed image data to be backed by an uncompressed bitmap representation.
  96 + ///
  97 + /// Inflating compressed image formats (such as PNG or JPEG) can significantly improve drawing performance as it
  98 + /// allows a bitmap representation to be constructed in the background rather than on the main thread.
  99 + public func af_inflate() {
  100 + guard !af_inflated else { return }
  101 +
  102 + af_inflated = true
  103 + _ = cgImage?.dataProvider?.data
  104 + }
  105 +}
  106 +
  107 +// MARK: - Alpha
  108 +
  109 +extension UIImage {
  110 + /// Returns whether the image contains an alpha component.
  111 + public var af_containsAlphaComponent: Bool {
  112 + let alphaInfo = cgImage?.alphaInfo
  113 +
  114 + return (
  115 + alphaInfo == .first ||
  116 + alphaInfo == .last ||
  117 + alphaInfo == .premultipliedFirst ||
  118 + alphaInfo == .premultipliedLast
  119 + )
  120 + }
  121 +
  122 + /// Returns whether the image is opaque.
  123 + public var af_isOpaque: Bool { return !af_containsAlphaComponent }
  124 +}
  125 +
  126 +// MARK: - Scaling
  127 +
  128 +extension UIImage {
  129 + /// Returns a new version of the image scaled to the specified size.
  130 + ///
  131 + /// - parameter size: The size to use when scaling the new image.
  132 + ///
  133 + /// - returns: A new image object.
  134 + public func af_imageScaled(to size: CGSize) -> UIImage {
  135 + assert(size.width > 0 && size.height > 0, "You cannot safely scale an image to a zero width or height")
  136 +
  137 + UIGraphicsBeginImageContextWithOptions(size, af_isOpaque, 0.0)
  138 + draw(in: CGRect(origin: .zero, size: size))
  139 +
  140 + let scaledImage = UIGraphicsGetImageFromCurrentImageContext() ?? self
  141 + UIGraphicsEndImageContext()
  142 +
  143 + return scaledImage
  144 + }
  145 +
  146 + /// Returns a new version of the image scaled from the center while maintaining the aspect ratio to fit within
  147 + /// a specified size.
  148 + ///
  149 + /// The resulting image contains an alpha component used to pad the width or height with the necessary transparent
  150 + /// pixels to fit the specified size. In high performance critical situations, this may not be the optimal approach.
  151 + /// To maintain an opaque image, you could compute the `scaledSize` manually, then use the `af_imageScaledToSize`
  152 + /// method in conjunction with a `.Center` content mode to achieve the same visual result.
  153 + ///
  154 + /// - parameter size: The size to use when scaling the new image.
  155 + ///
  156 + /// - returns: A new image object.
  157 + public func af_imageAspectScaled(toFit size: CGSize) -> UIImage {
  158 + assert(size.width > 0 && size.height > 0, "You cannot safely scale an image to a zero width or height")
  159 +
  160 + let imageAspectRatio = self.size.width / self.size.height
  161 + let canvasAspectRatio = size.width / size.height
  162 +
  163 + var resizeFactor: CGFloat
  164 +
  165 + if imageAspectRatio > canvasAspectRatio {
  166 + resizeFactor = size.width / self.size.width
  167 + } else {
  168 + resizeFactor = size.height / self.size.height
  169 + }
  170 +
  171 + let scaledSize = CGSize(width: self.size.width * resizeFactor, height: self.size.height * resizeFactor)
  172 + let origin = CGPoint(x: (size.width - scaledSize.width) / 2.0, y: (size.height - scaledSize.height) / 2.0)
  173 +
  174 + UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
  175 + draw(in: CGRect(origin: origin, size: scaledSize))
  176 +
  177 + let scaledImage = UIGraphicsGetImageFromCurrentImageContext() ?? self
  178 + UIGraphicsEndImageContext()
  179 +
  180 + return scaledImage
  181 + }
  182 +
  183 + /// Returns a new version of the image scaled from the center while maintaining the aspect ratio to fill a
  184 + /// specified size. Any pixels that fall outside the specified size are clipped.
  185 + ///
  186 + /// - parameter size: The size to use when scaling the new image.
  187 + ///
  188 + /// - returns: A new image object.
  189 + public func af_imageAspectScaled(toFill size: CGSize) -> UIImage {
  190 + assert(size.width > 0 && size.height > 0, "You cannot safely scale an image to a zero width or height")
  191 +
  192 + let imageAspectRatio = self.size.width / self.size.height
  193 + let canvasAspectRatio = size.width / size.height
  194 +
  195 + var resizeFactor: CGFloat
  196 +
  197 + if imageAspectRatio > canvasAspectRatio {
  198 + resizeFactor = size.height / self.size.height
  199 + } else {
  200 + resizeFactor = size.width / self.size.width
  201 + }
  202 +
  203 + let scaledSize = CGSize(width: self.size.width * resizeFactor, height: self.size.height * resizeFactor)
  204 + let origin = CGPoint(x: (size.width - scaledSize.width) / 2.0, y: (size.height - scaledSize.height) / 2.0)
  205 +
  206 + UIGraphicsBeginImageContextWithOptions(size, af_isOpaque, 0.0)
  207 + draw(in: CGRect(origin: origin, size: scaledSize))
  208 +
  209 + let scaledImage = UIGraphicsGetImageFromCurrentImageContext() ?? self
  210 + UIGraphicsEndImageContext()
  211 +
  212 + return scaledImage
  213 + }
  214 +}
  215 +
  216 +// MARK: - Rounded Corners
  217 +
  218 +extension UIImage {
  219 + /// Returns a new version of the image with the corners rounded to the specified radius.
  220 + ///
  221 + /// - parameter radius: The radius to use when rounding the new image.
  222 + /// - parameter divideRadiusByImageScale: Whether to divide the radius by the image scale. Set to `true` when the
  223 + /// image has the same resolution for all screen scales such as @1x, @2x and
  224 + /// @3x (i.e. single image from web server). Set to `false` for images loaded
  225 + /// from an asset catalog with varying resolutions for each screen scale.
  226 + /// `false` by default.
  227 + ///
  228 + /// - returns: A new image object.
  229 + public func af_imageRounded(withCornerRadius radius: CGFloat, divideRadiusByImageScale: Bool = false) -> UIImage {
  230 + UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
  231 +
  232 + let scaledRadius = divideRadiusByImageScale ? radius / scale : radius
  233 +
  234 + let clippingPath = UIBezierPath(roundedRect: CGRect(origin: CGPoint.zero, size: size), cornerRadius: scaledRadius)
  235 + clippingPath.addClip()
  236 +
  237 + draw(in: CGRect(origin: CGPoint.zero, size: size))
  238 +
  239 + let roundedImage = UIGraphicsGetImageFromCurrentImageContext()!
  240 + UIGraphicsEndImageContext()
  241 +
  242 + return roundedImage
  243 + }
  244 +
  245 + /// Returns a new version of the image rounded into a circle.
  246 + ///
  247 + /// - returns: A new image object.
  248 + public func af_imageRoundedIntoCircle() -> UIImage {
  249 + let radius = min(size.width, size.height) / 2.0
  250 + var squareImage = self
  251 +
  252 + if size.width != size.height {
  253 + let squareDimension = min(size.width, size.height)
  254 + let squareSize = CGSize(width: squareDimension, height: squareDimension)
  255 + squareImage = af_imageAspectScaled(toFill: squareSize)
  256 + }
  257 +
  258 + UIGraphicsBeginImageContextWithOptions(squareImage.size, false, 0.0)
  259 +
  260 + let clippingPath = UIBezierPath(
  261 + roundedRect: CGRect(origin: CGPoint.zero, size: squareImage.size),
  262 + cornerRadius: radius
  263 + )
  264 +
  265 + clippingPath.addClip()
  266 +
  267 + squareImage.draw(in: CGRect(origin: CGPoint.zero, size: squareImage.size))
  268 +
  269 + let roundedImage = UIGraphicsGetImageFromCurrentImageContext()!
  270 + UIGraphicsEndImageContext()
  271 +
  272 + return roundedImage
  273 + }
  274 +}
  275 +
  276 +#endif
  277 +
  278 +#if os(iOS) || os(tvOS)
  279 +
  280 +import CoreImage
  281 +
  282 +// MARK: - Core Image Filters
  283 +
  284 +@available(iOS 9.0, *)
  285 +extension UIImage {
  286 + /// Returns a new version of the image using a CoreImage filter with the specified name and parameters.
  287 + ///
  288 + /// - parameter name: The name of the CoreImage filter to use on the new image.
  289 + /// - parameter parameters: The parameters to apply to the CoreImage filter.
  290 + ///
  291 + /// - returns: A new image object, or `nil` if the filter failed for any reason.
  292 + public func af_imageFiltered(withCoreImageFilter name: String, parameters: [String: Any]? = nil) -> UIImage? {
  293 + var image: CoreImage.CIImage? = ciImage
  294 +
  295 + if image == nil, let CGImage = self.cgImage {
  296 + image = CoreImage.CIImage(cgImage: CGImage)
  297 + }
  298 +
  299 + guard let coreImage = image else { return nil }
  300 +
  301 + let context = CIContext(options: [kCIContextPriorityRequestLow: true])
  302 +
  303 + var parameters: [String: Any] = parameters ?? [:]
  304 + parameters[kCIInputImageKey] = coreImage
  305 +
  306 + guard let filter = CIFilter(name: name, withInputParameters: parameters) else { return nil }
  307 + guard let outputImage = filter.outputImage else { return nil }
  308 +
  309 + let cgImageRef = context.createCGImage(outputImage, from: outputImage.extent)
  310 +
  311 + return UIImage(cgImage: cgImageRef!, scale: scale, orientation: imageOrientation)
  312 + }
  313 +}
  314 +
  315 +#endif
... ...
ParentAssistant/Pods/AlamofireImage/Source/UIImageView+AlamofireImage.swift 0 → 100644
... ... @@ -0,0 +1,392 @@
  1 +//
  2 +// UIImageView+AlamofireImage.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +import Alamofire
  26 +import Foundation
  27 +
  28 +#if os(iOS) || os(tvOS)
  29 +
  30 +import UIKit
  31 +
  32 +extension UIImageView {
  33 +
  34 + // MARK: - ImageTransition
  35 +
  36 + /// Used to wrap all `UIView` animation transition options alongside a duration.
  37 + public enum ImageTransition {
  38 + case noTransition
  39 + case crossDissolve(TimeInterval)
  40 + case curlDown(TimeInterval)
  41 + case curlUp(TimeInterval)
  42 + case flipFromBottom(TimeInterval)
  43 + case flipFromLeft(TimeInterval)
  44 + case flipFromRight(TimeInterval)
  45 + case flipFromTop(TimeInterval)
  46 + case custom(
  47 + duration: TimeInterval,
  48 + animationOptions: UIViewAnimationOptions,
  49 + animations: (UIImageView, Image) -> Void,
  50 + completion: ((Bool) -> Void)?
  51 + )
  52 +
  53 + /// The duration of the image transition in seconds.
  54 + public var duration: TimeInterval {
  55 + switch self {
  56 + case .noTransition:
  57 + return 0.0
  58 + case .crossDissolve(let duration):
  59 + return duration
  60 + case .curlDown(let duration):
  61 + return duration
  62 + case .curlUp(let duration):
  63 + return duration
  64 + case .flipFromBottom(let duration):
  65 + return duration
  66 + case .flipFromLeft(let duration):
  67 + return duration
  68 + case .flipFromRight(let duration):
  69 + return duration
  70 + case .flipFromTop(let duration):
  71 + return duration
  72 + case .custom(let duration, _, _, _):
  73 + return duration
  74 + }
  75 + }
  76 +
  77 + /// The animation options of the image transition.
  78 + public var animationOptions: UIViewAnimationOptions {
  79 + switch self {
  80 + case .noTransition:
  81 + return UIViewAnimationOptions()
  82 + case .crossDissolve:
  83 + return .transitionCrossDissolve
  84 + case .curlDown:
  85 + return .transitionCurlDown
  86 + case .curlUp:
  87 + return .transitionCurlUp
  88 + case .flipFromBottom:
  89 + return .transitionFlipFromBottom
  90 + case .flipFromLeft:
  91 + return .transitionFlipFromLeft
  92 + case .flipFromRight:
  93 + return .transitionFlipFromRight
  94 + case .flipFromTop:
  95 + return .transitionFlipFromTop
  96 + case .custom(_, let animationOptions, _, _):
  97 + return animationOptions
  98 + }
  99 + }
  100 +
  101 + /// The animation options of the image transition.
  102 + public var animations: ((UIImageView, Image) -> Void) {
  103 + switch self {
  104 + case .custom(_, _, let animations, _):
  105 + return animations
  106 + default:
  107 + return { $0.image = $1 }
  108 + }
  109 + }
  110 +
  111 + /// The completion closure associated with the image transition.
  112 + public var completion: ((Bool) -> Void)? {
  113 + switch self {
  114 + case .custom(_, _, _, let completion):
  115 + return completion
  116 + default:
  117 + return nil
  118 + }
  119 + }
  120 + }
  121 +
  122 + // MARK: - Private - AssociatedKeys
  123 +
  124 + private struct AssociatedKey {
  125 + static var imageDownloader = "af_UIImageView.ImageDownloader"
  126 + static var sharedImageDownloader = "af_UIImageView.SharedImageDownloader"
  127 + static var activeRequestReceipt = "af_UIImageView.ActiveRequestReceipt"
  128 + }
  129 +
  130 + // MARK: - Associated Properties
  131 +
  132 + /// The instance image downloader used to download all images. If this property is `nil`, the `UIImageView` will
  133 + /// fallback on the `af_sharedImageDownloader` for all downloads. The most common use case for needing to use a
  134 + /// custom instance image downloader is when images are behind different basic auth credentials.
  135 + public var af_imageDownloader: ImageDownloader? {
  136 + get {
  137 + return objc_getAssociatedObject(self, &AssociatedKey.imageDownloader) as? ImageDownloader
  138 + }
  139 + set(downloader) {
  140 + objc_setAssociatedObject(self, &AssociatedKey.imageDownloader, downloader, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  141 + }
  142 + }
  143 +
  144 + /// The shared image downloader used to download all images. By default, this is the default `ImageDownloader`
  145 + /// instance backed with an `AutoPurgingImageCache` which automatically evicts images from the cache when the memory
  146 + /// capacity is reached or memory warning notifications occur. The shared image downloader is only used if the
  147 + /// `af_imageDownloader` is `nil`.
  148 + public class var af_sharedImageDownloader: ImageDownloader {
  149 + get {
  150 + if let downloader = objc_getAssociatedObject(self, &AssociatedKey.sharedImageDownloader) as? ImageDownloader {
  151 + return downloader
  152 + } else {
  153 + return ImageDownloader.default
  154 + }
  155 + }
  156 + set {
  157 + objc_setAssociatedObject(self, &AssociatedKey.sharedImageDownloader, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  158 + }
  159 + }
  160 +
  161 + var af_activeRequestReceipt: RequestReceipt? {
  162 + get {
  163 + return objc_getAssociatedObject(self, &AssociatedKey.activeRequestReceipt) as? RequestReceipt
  164 + }
  165 + set {
  166 + objc_setAssociatedObject(self, &AssociatedKey.activeRequestReceipt, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  167 + }
  168 + }
  169 +
  170 + // MARK: - Image Download
  171 +
  172 + /// Asynchronously downloads an image from the specified URL, applies the specified image filter to the downloaded
  173 + /// image and sets it once finished while executing the image transition.
  174 + ///
  175 + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be
  176 + /// set immediately, and then the remote image will be set once the image request is finished.
  177 + ///
  178 + /// The `completion` closure is called after the image download and filtering are complete, but before the start of
  179 + /// the image transition. Please note it is no longer the responsibility of the `completion` closure to set the
  180 + /// image. It will be set automatically. If you require a second notification after the image transition completes,
  181 + /// use a `.Custom` image transition with a `completion` closure. The `.Custom` `completion` closure is called when
  182 + /// the image transition is finished.
  183 + ///
  184 + /// - parameter url: The URL used for the image request.
  185 + /// - parameter placeholderImage: The image to be set initially until the image request finished. If
  186 + /// `nil`, the image view will not change its image until the image
  187 + /// request finishes. Defaults to `nil`.
  188 + /// - parameter filter: The image filter applied to the image after the image request is
  189 + /// finished. Defaults to `nil`.
  190 + /// - parameter progress: The closure to be executed periodically during the lifecycle of the
  191 + /// request. Defaults to `nil`.
  192 + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the
  193 + /// main queue.
  194 + /// - parameter imageTransition: The image transition animation applied to the image when set.
  195 + /// Defaults to `.None`.
  196 + /// - parameter runImageTransitionIfCached: Whether to run the image transition if the image is cached. Defaults
  197 + /// to `false`.
  198 + /// - parameter completion: A closure to be executed when the image request finishes. The closure
  199 + /// has no return value and takes three arguments: the original request,
  200 + /// the response from the server and the result containing either the
  201 + /// image or the error that occurred. If the image was returned from the
  202 + /// image cache, the response will be `nil`. Defaults to `nil`.
  203 + public func af_setImage(
  204 + withURL url: URL,
  205 + placeholderImage: UIImage? = nil,
  206 + filter: ImageFilter? = nil,
  207 + progress: ImageDownloader.ProgressHandler? = nil,
  208 + progressQueue: DispatchQueue = DispatchQueue.main,
  209 + imageTransition: ImageTransition = .noTransition,
  210 + runImageTransitionIfCached: Bool = false,
  211 + completion: ((DataResponse<UIImage>) -> Void)? = nil)
  212 + {
  213 + af_setImage(
  214 + withURLRequest: urlRequest(with: url),
  215 + placeholderImage: placeholderImage,
  216 + filter: filter,
  217 + progress: progress,
  218 + progressQueue: progressQueue,
  219 + imageTransition: imageTransition,
  220 + runImageTransitionIfCached: runImageTransitionIfCached,
  221 + completion: completion
  222 + )
  223 + }
  224 +
  225 + /// Asynchronously downloads an image from the specified URL Request, applies the specified image filter to the downloaded
  226 + /// image and sets it once finished while executing the image transition.
  227 + ///
  228 + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be
  229 + /// set immediately, and then the remote image will be set once the image request is finished.
  230 + ///
  231 + /// The `completion` closure is called after the image download and filtering are complete, but before the start of
  232 + /// the image transition. Please note it is no longer the responsibility of the `completion` closure to set the
  233 + /// image. It will be set automatically. If you require a second notification after the image transition completes,
  234 + /// use a `.Custom` image transition with a `completion` closure. The `.Custom` `completion` closure is called when
  235 + /// the image transition is finished.
  236 + ///
  237 + /// - parameter urlRequest: The URL request.
  238 + /// - parameter placeholderImage: The image to be set initially until the image request finished. If
  239 + /// `nil`, the image view will not change its image until the image
  240 + /// request finishes. Defaults to `nil`.
  241 + /// - parameter filter: The image filter applied to the image after the image request is
  242 + /// finished. Defaults to `nil`.
  243 + /// - parameter progress: The closure to be executed periodically during the lifecycle of the
  244 + /// request. Defaults to `nil`.
  245 + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the
  246 + /// main queue.
  247 + /// - parameter imageTransition: The image transition animation applied to the image when set.
  248 + /// Defaults to `.None`.
  249 + /// - parameter runImageTransitionIfCached: Whether to run the image transition if the image is cached. Defaults
  250 + /// to `false`.
  251 + /// - parameter completion: A closure to be executed when the image request finishes. The closure
  252 + /// has no return value and takes three arguments: the original request,
  253 + /// the response from the server and the result containing either the
  254 + /// image or the error that occurred. If the image was returned from the
  255 + /// image cache, the response will be `nil`. Defaults to `nil`.
  256 + public func af_setImage(
  257 + withURLRequest urlRequest: URLRequestConvertible,
  258 + placeholderImage: UIImage? = nil,
  259 + filter: ImageFilter? = nil,
  260 + progress: ImageDownloader.ProgressHandler? = nil,
  261 + progressQueue: DispatchQueue = DispatchQueue.main,
  262 + imageTransition: ImageTransition = .noTransition,
  263 + runImageTransitionIfCached: Bool = false,
  264 + completion: ((DataResponse<UIImage>) -> Void)? = nil)
  265 + {
  266 + guard !isURLRequestURLEqualToActiveRequestURL(urlRequest) else {
  267 + let error = AFIError.requestCancelled
  268 + let response = DataResponse<UIImage>(request: nil, response: nil, data: nil, result: .failure(error))
  269 +
  270 + completion?(response)
  271 +
  272 + return
  273 + }
  274 +
  275 + af_cancelImageRequest()
  276 +
  277 + let imageDownloader = af_imageDownloader ?? UIImageView.af_sharedImageDownloader
  278 + let imageCache = imageDownloader.imageCache
  279 +
  280 + // Use the image from the image cache if it exists
  281 + if
  282 + let request = urlRequest.urlRequest,
  283 + let image = imageCache?.image(for: request, withIdentifier: filter?.identifier)
  284 + {
  285 + let response = DataResponse<UIImage>(request: request, response: nil, data: nil, result: .success(image))
  286 +
  287 + if runImageTransitionIfCached {
  288 + let tinyDelay = DispatchTime.now() + Double(Int64(0.001 * Float(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
  289 +
  290 + // Need to let the runloop cycle for the placeholder image to take affect
  291 + DispatchQueue.main.asyncAfter(deadline: tinyDelay) {
  292 + self.run(imageTransition, with: image)
  293 + completion?(response)
  294 + }
  295 + } else {
  296 + self.image = image
  297 + completion?(response)
  298 + }
  299 +
  300 + return
  301 + }
  302 +
  303 + // Set the placeholder since we're going to have to download
  304 + if let placeholderImage = placeholderImage { self.image = placeholderImage }
  305 +
  306 + // Generate a unique download id to check whether the active request has changed while downloading
  307 + let downloadID = UUID().uuidString
  308 +
  309 + // Download the image, then run the image transition or completion handler
  310 + let requestReceipt = imageDownloader.download(
  311 + urlRequest,
  312 + receiptID: downloadID,
  313 + filter: filter,
  314 + progress: progress,
  315 + progressQueue: progressQueue,
  316 + completion: { [weak self] response in
  317 + guard
  318 + let strongSelf = self,
  319 + strongSelf.isURLRequestURLEqualToActiveRequestURL(response.request) &&
  320 + strongSelf.af_activeRequestReceipt?.receiptID == downloadID
  321 + else {
  322 + completion?(response)
  323 + return
  324 + }
  325 +
  326 + if let image = response.result.value {
  327 + strongSelf.run(imageTransition, with: image)
  328 + }
  329 +
  330 + strongSelf.af_activeRequestReceipt = nil
  331 +
  332 + completion?(response)
  333 + }
  334 + )
  335 +
  336 + af_activeRequestReceipt = requestReceipt
  337 + }
  338 +
  339 + // MARK: - Image Download Cancellation
  340 +
  341 + /// Cancels the active download request, if one exists.
  342 + public func af_cancelImageRequest() {
  343 + guard let activeRequestReceipt = af_activeRequestReceipt else { return }
  344 +
  345 + let imageDownloader = af_imageDownloader ?? UIImageView.af_sharedImageDownloader
  346 + imageDownloader.cancelRequest(with: activeRequestReceipt)
  347 +
  348 + af_activeRequestReceipt = nil
  349 + }
  350 +
  351 + // MARK: - Image Transition
  352 +
  353 + /// Runs the image transition on the image view with the specified image.
  354 + ///
  355 + /// - parameter imageTransition: The image transition to ran on the image view.
  356 + /// - parameter image: The image to use for the image transition.
  357 + public func run(_ imageTransition: ImageTransition, with image: Image) {
  358 + UIView.transition(
  359 + with: self,
  360 + duration: imageTransition.duration,
  361 + options: imageTransition.animationOptions,
  362 + animations: { imageTransition.animations(self, image) },
  363 + completion: imageTransition.completion
  364 + )
  365 + }
  366 +
  367 + // MARK: - Private - URL Request Helper Methods
  368 +
  369 + private func urlRequest(with url: URL) -> URLRequest {
  370 + var urlRequest = URLRequest(url: url)
  371 +
  372 + for mimeType in DataRequest.acceptableImageContentTypes {
  373 + urlRequest.addValue(mimeType, forHTTPHeaderField: "Accept")
  374 + }
  375 +
  376 + return urlRequest
  377 + }
  378 +
  379 + private func isURLRequestURLEqualToActiveRequestURL(_ urlRequest: URLRequestConvertible?) -> Bool {
  380 + if
  381 + let currentRequestURL = af_activeRequestReceipt?.request.task?.originalRequest?.url,
  382 + let requestURL = urlRequest?.urlRequest?.url,
  383 + currentRequestURL == requestURL
  384 + {
  385 + return true
  386 + }
  387 +
  388 + return false
  389 + }
  390 +}
  391 +
  392 +#endif
... ...
ParentAssistant/Pods/Manifest.lock
1 1 PODS:
2   - - Alamofire (4.0.1)
  2 + - Alamofire (4.7.2)
  3 + - AlamofireImage (3.3.1):
  4 + - Alamofire (~> 4.5)
3 5 - DZNEmptyDataSet (1.8.1)
4 6 - HandyJSON (4.1.1)
5 7 - NIMSDK_LITE (4.9.0)
... ... @@ -19,7 +21,8 @@ PODS:
19 21 - XRCarouselView (2.5.6)
20 22  
21 23 DEPENDENCIES:
22   - - Alamofire (~> 4.0.1)
  24 + - Alamofire (~> 4.7.2)
  25 + - AlamofireImage (~> 3.3.1)
23 26 - DZNEmptyDataSet (~> 1.8.1)
24 27 - HandyJSON (~> 4.1.1)
25 28 - NIMSDK_LITE (~> 4.9.0)
... ... @@ -35,7 +38,8 @@ DEPENDENCIES:
35 38 - XRCarouselView (~> 2.5.6)
36 39  
37 40 SPEC CHECKSUMS:
38   - Alamofire: 7682d43245de14874acd142ec137b144aa1dd335
  41 + Alamofire: e4fa87002c137ba2d8d634d2c51fabcda0d5c223
  42 + AlamofireImage: 3b35b586853abaf94ca1250f4e94cff3c21a4c0d
39 43 DZNEmptyDataSet: 9525833b9e68ac21c30253e1d3d7076cc828eaa7
40 44 HandyJSON: 3a3de917c4118767ffe41c29b5acba23409649f4
41 45 NIMSDK_LITE: a69a019544299a1b597db6ebf98927f5e12fa17c
... ... @@ -50,6 +54,6 @@ SPEC CHECKSUMS:
50 54 UMCSecurityPlugins: 0831a08f3988f3cea9f1d3a7626cd9bee4fef150
51 55 XRCarouselView: 52529f924d26ee4787f9bd958150800b73e60922
52 56  
53   -PODFILE CHECKSUM: ef5a2eedc2a762110d9f7458ad01512ced09aba0
  57 +PODFILE CHECKSUM: fb172574c836b57e7c792807c655a091aff17050
54 58  
55 59 COCOAPODS: 1.4.0
... ...
ParentAssistant/Pods/Pods.xcodeproj/project.pbxproj
... ... @@ -7,431 +7,486 @@
7 7 objects = {
8 8  
9 9 /* Begin PBXBuildFile section */
10   - 00E153632A414101E0A66AE23569802B /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92331AB0F30415BE666C619D1A45513E /* Result.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
11   - 01866720BD41E2820300D8B9284FC061 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };
12   - 0203C16E98AD37E5A0C596D1B39C5119 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 0969E5011DCC0C421F637E6859279610 /* Reachability.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
13   - 0369C812B817E442E9BF7B2F561E1AEF /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1914DA670BEE4BC1F461E88ED1BD7C26 /* Configuration.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
14   - 05F1082B0C6E40F76E821D67DFAD9AB5 /* SDWebImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 172419A08571955755C3C6FB2044DD9D /* SDWebImageDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
15   - 079D990738735591330332B5F2551AE4 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCCC1A6E4AF8DAF6E5609D65548B3C79 /* NetworkReachabilityManager.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
16   - 0A2126372E9629100B22A44A94E73D71 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 33347618F6541AA20F52632F9EA10CA6 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
17   - 0ABF85713B5ABC01E4121F8DBCBBD195 /* Deserializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D374115D56716D6284C03A777CD2BB4 /* Deserializer.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
18   - 0C11C193B2F9FF679EB214C272C8A480 /* Transformable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4E76CB8696BAB20A617484E4726713B /* Transformable.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
19   - 0C4EA35F79172E81D6BF56A2FC856ED8 /* SVProgressAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 38EE23882943EDCED73523F643A71C39 /* SVProgressAnimatedView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
20   - 121B576C5153736760EDBD385DCE1A82 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DB0A7F29D540AB077DA6D9855C3F743 /* QuartzCore.framework */; };
21   - 12DE723E9DF6F13F3286874C3A95E30A /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EF7D93FE7442849AC14571996AC8ED /* Logger.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
22   - 143D0DFED5AF7708744EBDB443F9812D /* EnumType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C73B5BC3B66F99610607951FEC5FCB3 /* EnumType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
23   - 14CECE238604E1D44104E5BCD14EB2BE /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D3152CF39784BC2AAD4747AF03BB50A /* SessionDelegate.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
24   - 164781197625A3149B3BDBCAA2AC8CC3 /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E95345A11FCCED373B3A5758A6073CDB /* Validation.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
25   - 170AB456D9F3C346DCF407E42D84B5D5 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = BE70BDE392E6E92B76047D2DED4ED380 /* UIButton+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
26   - 17F8D48B0736FD13AC59D9311C074E9D /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = C203E9ABEF394B0009B142EEB9AA64FC /* NSData+ImageContentType.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
27   - 1A3841F2F008E6FEBA8B10F04DE5AD15 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DB0A7F29D540AB077DA6D9855C3F743 /* QuartzCore.framework */; };
28   - 1B9EDEDC964E6B08F78920B4F4B9DB84 /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = BF496B88C6E68626DC9D0C9FC152BD3C /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
29   - 1C39565C535B7D534368C5DFB46659B5 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 1983D355FD75B9D24A71756509C98131 /* SDWebImageDownloader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
30   - 204944D67267632DD7CD4BEFB60AC389 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8781B0306B0188AF528659F413E1B542 /* Response.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
31   - 23C92743D0D2154080836B58896172C9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };
32   - 240CD81B9BDAA551B583A82E3618D560 /* XRCarouselView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 323A41D79693687F0377B9ACACC90D4A /* XRCarouselView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
33   - 242367446F58A71823A8250396E775A3 /* HelpingMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9889E5067E9A54BAEC05298BBA10F671 /* HelpingMapper.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
34   - 264463742964367E06060C2E85D3EEF4 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E786E1AEE51D914333543AC4DEF9B3FB /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
35   - 27813DC0914AD972436022C87454185F /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FF65E4A0D399571B01517891F0309004 /* SDWebImage-dummy.m */; };
36   - 2AB8304BE65678C2043856E0F4AAFC9E /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A559DCF61F2E184BC9318C05F05CFF3 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; };
37   - 2B58B070F9D7324583D01EE906BC918C /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5104B9F40B6C55F71BDE788F76AA8F53 /* SessionManager.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
38   - 2B5DF32B1906ED4F0088D37CE08CB2B9 /* Metadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC3C517CD17DEB98E878268901D654E8 /* Metadata.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
39   - 343B30C989188B77FB1149FED753A63C /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 640ED88831DE9CA10759B8FC3751C531 /* ServerTrustPolicy.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
40   - 38BC499B109AEBC02AD6C88AB2ED057D /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FFCF8A6062658FA349B617C0D75723C2 /* SDWebImageManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
41   - 3C69CE7353282718747615DDA9563510 /* SVProgressHUD-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 93251EC8BEF89E6A4FA758DA38A1E47A /* SVProgressHUD-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
42   - 3D342698F0FA2B9391B7B1733D499623 /* SVRadialGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 20C0A79CAF95E65B981CC5F896E4334C /* SVRadialGradientLayer.h */; settings = {ATTRIBUTES = (Public, ); }; };
43   - 3DD10D4C59666719E941A5D0EB5D9582 /* XRCarouselView.m in Sources */ = {isa = PBXBuildFile; fileRef = A91D08749C812CD6EB281780E69AFED6 /* XRCarouselView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
44   - 44E9442A5B676A7E4941C47EB6C49C9F /* UIView+Toast.m in Sources */ = {isa = PBXBuildFile; fileRef = E533F265C56324D6F57EB232221F586A /* UIView+Toast.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; };
45   - 46389823D72FA2DA9F4AD34CE119E9FA /* Reachability-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 29BC53491C8D6BA4B81045D6FBBA043C /* Reachability-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
46   - 46749DE4D7ED1863AFF86DFB519EAAD0 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 9011EFC1DA29BE6CA0831595062B82ED /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
47   - 48F71FC920A4F562FF7ECFD25BD08F2E /* NSDecimalNumberTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2830040C9AF69744EEB45C092E65CA2A /* NSDecimalNumberTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
48   - 4A1D23F6526F175FCC2B35539E1B6AD6 /* SVProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = 17403F9FAA48DA29AAEB297BE9AC4D51 /* SVProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; };
49   - 4A2F8CD414D57920B53208F0F9A39E34 /* XRCarouselView.h in Headers */ = {isa = PBXBuildFile; fileRef = 57342E33349B812F65B6D994EA74E212 /* XRCarouselView.h */; settings = {ATTRIBUTES = (Public, ); }; };
50   - 4A961542DBC3F70E502B854EBB870694 /* EnumTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31A74FD90C96035085B5A148E9CBA64C /* EnumTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
51   - 4C144355E41C99902528AAD3CF069680 /* DZNEmptyDataSet-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 73AD0FFA16B2C0B1B8A40B3A76629975 /* DZNEmptyDataSet-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
52   - 4F7B3FA3957DCA2A67546E72117904F9 /* HexColorTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E85535E49256ABCDBBB9EA045CE6268 /* HexColorTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
53   - 502127E1D7BF9D8D8FA29AD2F7EF420E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };
54   - 50424A0F4A3907712832B1FA56C9E2A2 /* Measuable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D9407543C44ABED0AC48154C76831BE /* Measuable.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
55   - 53926FE56FBF1399E69B9F893ACFBDB1 /* Pods-ParentAssistant-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1706C196E50CAE9C6DE364B9BA5E9DCB /* Pods-ParentAssistant-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
56   - 5438E76D8DA2CB8E045DE40226F4A5AB /* DateFormatterTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4EC3094994043023CF3002A63DD6DA4 /* DateFormatterTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
57   - 545C0FA9073D729E2E8C3EF9678C0DEA /* TransformOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72ADD4F0113F0555435EA10BA789F8E2 /* TransformOf.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
58   - 5475A5933FABB5F9999E31020427B182 /* DataTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE92E07FF56795D096246F9059B540CA /* DataTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
59   - 58812AABBC0A1E7AE019752424DF31A7 /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99DF7E55400E9131640E0694D3C91764 /* MultipartFormData.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
60   - 5C95D2513AAB007D33804F074AC4DD33 /* Export.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33C9063E8CA60D73EE6050FCF59F433 /* Export.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
61   - 5E25BCD30BDE2E7A68D1A6FAF7253AD4 /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6429920CDFD8D08A5A0566565673330 /* DispatchQueue+Alamofire.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
62   - 5E9D11BEACC080376EA6F57C6167B34A /* HandyJSON-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 11DABA5B57A3076260D36D4A9AE646F5 /* HandyJSON-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
63   - 603F9D0686CE005205D389C1E4C6072A /* XRPlaceholder.png in Resources */ = {isa = PBXBuildFile; fileRef = FFEBBEC7D2ED4C631DFB3CBB04E6F926 /* XRPlaceholder.png */; };
64   - 604E191C52F306436E51253A4A21589C /* SwiftHash-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F2BF6E468482ED7EDAE9AFD6CA2C994 /* SwiftHash-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
65   - 63751EA36B3CCD03BF292C19F6B7C5FE /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 82C441F9B75595B2F266E6AC40AD7D85 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; };
66   - 6540CC4D369A32F6DE54AFA8D5D6FAF9 /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BB2B3251E63EE34530FC8A40E441CB23 /* Alamofire-dummy.m */; };
67   - 6694F9A05D6A58C5C27935913BF8AE56 /* Pods-ParentAssistant-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F6BAADF2798AA6F62DA82FAA92DECB07 /* Pods-ParentAssistant-dummy.m */; };
68   - 69735BB95E8E8111E0CEA96BBA19486A /* ExtendCustomModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E529332879B58C942DDF16DF5D39B4 /* ExtendCustomModelType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
69   - 6A14BBE1A1C5AFF3B9FCFFCC30685E04 /* Toast-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 835B1DEC82F034C2C12DC0723F18F6E9 /* Toast-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
70   - 6BE097BD2C38D14E51B20BCEB5C6F495 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };
71   - 6C3C226E0B46AFC4FD756BA6C5D9414E /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 6850886B55CE3CD9B901B28690292C5C /* SDWebImagePrefetcher.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
72   - 6F4160DEA9816F49351CCEF452CCF00C /* CustomDateFormatTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64CF5A867496880A0DAE25ED9EC8E512 /* CustomDateFormatTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
73   - 71770C33C6DBF555B10D0A42E5C034F4 /* NominalType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C5CEE4C10F2E83011011BAE5999B4FD /* NominalType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
74   - 73B9C996AED49ED7CF8EC2A6F1738059 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };
75   - 78F4229B4A746A38341474FEB9DADB25 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14EC82B350F60C65CB156014F5997DCE /* ParameterEncoding.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
76   - 7931BF35785763872BD11EB65164B1D5 /* TransformType.swift in Sources */ = {isa = PBXBuildFile; fileRef = F33461E2C03CDF90E02052B76ADADB01 /* TransformType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
77   - 794B16FD139EB13BA49AE711C49135BB /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AEE056145338863D7A727ACF1C3657C /* MD5.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
78   - 7AC13BF7B3C538D94DE7B9D836786514 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E90E960C03E09803780D5C47A55A4DB /* SDWebImageCompat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
79   - 7C3888324281E325ABBDDB3888D52125 /* DZNEmptyDataSet-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F6392C48C4C9A3D7130A57D84AFEE2B /* DZNEmptyDataSet-dummy.m */; };
80   - 7CE1363BFF8D96DD8059E0B5481A8D00 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };
81   - 7D23D4A779C42E695BD2EC80114AD9E8 /* Reachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AD254563DCC20283BB5C0C5B4E57B5C /* Reachability.h */; settings = {ATTRIBUTES = (Public, ); }; };
82   - 807283562FFCAF1B2AC3B251ABF34B5A /* URLTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D24FB404E9541910245BF3E68C5EE73 /* URLTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
83   - 82769877C29A8E71221C9918273D3FFF /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A51BA19C89D5E62EDCF2DB9D9FA43E0 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
84   - 8444B1FF566FC96D823C154BEE6A4A03 /* BuiltInBasicType.swift in Sources */ = {isa = PBXBuildFile; fileRef = F948022D8D1EFEF734A07E6ED4D6CAF9 /* BuiltInBasicType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
85   - 8511E9645F5C2B18746B4B4B29284451 /* UIScrollView+EmptyDataSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 41531DBB287870602D671C4D97E99B21 /* UIScrollView+EmptyDataSet.h */; settings = {ATTRIBUTES = (Public, ); }; };
86   - 86930F980FA87FB0CA5E197FEAA7A90C /* SVRadialGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = AE8B2524C105710A1C75E5F3C734796F /* SVRadialGradientLayer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
87   - 86EF282C771B9E7A12106ACBE6E820F5 /* ExtendCustomBasicType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32115C18B0BD53A5791A3FA797AB85AC /* ExtendCustomBasicType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
88   - 895952B7EE442E03D667D9565D8C84F4 /* HandyJSON.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B3D43CB0BDA34787F85B2C084FBB09A /* HandyJSON.h */; settings = {ATTRIBUTES = (Public, ); }; };
89   - 8B937C355B5CAAEC40B80F24AFA26569 /* Reachability-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 16CC2B704148D354077756FC0880DBCB /* Reachability-dummy.m */; };
90   - 8C1E8307CFE1A73F290CFCE8818B6123 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = B9A38D8C4EC4826AEDC2A52DD0187186 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
91   - 8E31EF89BD192C6AACDE9E0655861D3D /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B9B732FC24A0EC5E46E41D939F4A1130 /* UIKit.framework */; };
92   - 8F5C0849D2757FC5A7C81B81BA3813C3 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39F3B60B0A2AD7975DA5BCA943FA6BD5 /* ResponseSerialization.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
93   - 90B1C77BB42755C3E9AC821A09526E53 /* SHA1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A4D6703A8771BB168130EFB6EAC1C3E /* SHA1.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
94   - 952429322A476D5508670C477DE23669 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };
95   - 95F6802FB7C748286D6E1D6876552E8C /* BuiltInBridgeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6976D41DC0C992EA2F24C3A7358E958F /* BuiltInBridgeType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
96   - 963D3083B43A304CE4A81FF8908C644C /* DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0A49BF64844554AA6BC0B49FD9A9BE8 /* DateTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
97   - 9687BE425798E40CBC52870F8009209D /* UIView+Toast.h in Headers */ = {isa = PBXBuildFile; fileRef = 19FAAAAFAF3A705D1081BDCDC14CAFD6 /* UIView+Toast.h */; settings = {ATTRIBUTES = (Public, ); }; };
98   - 981EFF1371FCE40F1907DA262743B93E /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F2F35AD7354793D357E10226DE37995 /* Notifications.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
99   - 9EB13C869EF150828095C94F1FEFC517 /* Properties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05BE4EE179BFA37C2F5F3928F9237A1F /* Properties.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
100   - 9F24B341383F0FF8EA368B3A7F9BC087 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };
101   - A17930AC43F712547C2B4B58C1450B82 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C03FC1A11EE20AB8B6A4B398E11B26B0 /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
102   - A43438F0B3A712FB5739EA173AB6F134 /* ReflectionHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31257A57ECE5DD3A052A547DA8090EF9 /* ReflectionHelper.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
103   - A7B5C0EE248855B3357C98A489F835D9 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E2AA0C415512D5F3F34F7A99AA4D14A /* UIImageView+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
104   - A8D327620CE1909AD98F6B239AA60018 /* XRCarouselView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7437E1C250CA27898AA8815D1117643B /* XRCarouselView-dummy.m */; };
105   - A95766E9124B13BABFF00CFBEFEC0501 /* SVProgressAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = B6554BE7D86E2DF12BC2CFA630452CA0 /* SVProgressAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; };
106   - AB6A5752C4586385EE13F1E6E2E9F40E /* SVProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0322584439902B09D766EF9B00C87E2A /* SVProgressHUD-dummy.m */; };
107   - AC2961AE064F12C1AA82F853AE6CF4DE /* OtherExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9462CA128209C32EE6E6647C88609D1 /* OtherExtension.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
108   - AD2C576F50E67B2417C1D17FBF5E32B2 /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08E13F442024BE43D2F31AA6F2C300DA /* AFError.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
109   - B2D8BD6984912C60C7A22BF665987A73 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 140A2830037A30E45442BA52CBDA1CFC /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
110   - B35D34D1C1A4B0A5FAD90526DE5D88A4 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59271332AFD884264C5B45B6B6152051 /* ImageIO.framework */; };
111   - B575E905525EDD3311A9872A0C4307AD /* SVProgressHUD.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 65DEF3C169B8F1241E74C3D5C7DA5A6D /* SVProgressHUD.bundle */; };
112   - BA3AB9E7766B254534C357EB523687B6 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1836357ECED17B3B0BF22256498AA8EE /* UIView+WebCacheOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
113   - BBF90CAC12DA7C2713DB47B3BE5C898C /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 206933D2687A3DC4CD2836F2AEF28A3B /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
114   - BC9AB82CB1C91977B5C1C96A25A9CA22 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = F638493F2C879E2AF820AE53EA390269 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
115   - BD14752B5379EAA21AF328A8ABE08A6D /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = DB5FF7B561F6F548C82F1FC27FDD72E8 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; };
116   - BD2E6B5D9C3C38D8C1BDCFE0CD6E489D /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 469D54339A6D448DF6D1166FDB669676 /* UIImage+MultiFormat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
117   - BF901FE99C862B2093FF8E2F71B80F93 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 1439A3EA7193042844C3E9C52032677C /* SDImageCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
118   - C23D014A840F87E883B74ABEC475E608 /* HandyJSON-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FD2B11D4DCD30BDBA06841569E01E1BD /* HandyJSON-dummy.m */; };
119   - C577B322B52228B272D52FF32B7BE30C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };
120   - C5FD57751548EFFA6567AFD2EB47CD56 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 232E0E55F341C5600028F7AAA4F59E8A /* Request.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
121   - C633AE7C1F16ADA3AFEE968396B73A4B /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = B71F8A62F3906657D17D418212E1CBA1 /* UIImage+GIF.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
122   - C8D2BE872D244EB549F2EC97069CC4D0 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = BB7CE29DC4FFF250766240EA8DA973D1 /* UIImageView+HighlightedWebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
123   - C906E3F3B8CC5A9E003DB020DFAE7864 /* PropertyInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81D2AEE4F419083BF22474B240B3D9F6 /* PropertyInfo.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
124   - C98D39690CC370401444D498206BCA2B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };
125   - CAD7174B4833082EAE9507FB4CDCB07B /* Toast-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 85EBECC44FA24EC40748D3CB399DD1F3 /* Toast-dummy.m */; };
126   - D1341DA6F9B384B99BAB4C367DAD6BEC /* UIScrollView+EmptyDataSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F6A571F05F4D0DD12870CE83C8F787 /* UIScrollView+EmptyDataSet.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
127   - D1D5D64268DDC619511D3942F434D7DD /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = DF68D7CB4183F99C38744F4985CD422D /* SDWebImageDecoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
128   - D425D13A48689CCBEA1C0BE43928A682 /* ISO8601DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DFB6D55866F4F62D8116993D42B55A8 /* ISO8601DateTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
129   - D5686072DEC1A0E14F8C100FCC873F73 /* TaskDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD387D9E3BDF322939523D4DF31CA79 /* TaskDelegate.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
130   - D603EC0AAE41B1733F0A4A2FA4381910 /* SwiftHash-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 448D149E9E2122E63C2D8CDB8E1159CB /* SwiftHash-dummy.m */; };
131   - E198F398404F07805E5189165F3C1E64 /* Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9ED9DA2E61F2A4DD7E760C61C47A3F1 /* Timeline.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
132   - E49369FF3BD66698C3B61B8DE9C58DE0 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = E3370B03674C70DABFF75D9D2BA95DCE /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; };
133   - E72FACD066C66E010F4C91956E8E29CB /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = F6C063D5E492D3ED69858D446C30719E /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; };
134   - E990A247D80417D4555735E8A8DBD76C /* SVIndefiniteAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 72803D16FA054A0D26C303991C1F2B3C /* SVIndefiniteAnimatedView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
135   - EB3F85272BEE4C2EB0321741E8FE4B75 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = E33C2A8A35CA23130F27CFEC0285B7DB /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; };
136   - EBA0781A1E2822CF7DFD56ACD394A63E /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA07E2E477768269A8D0BECE492EBAF /* Alamofire.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
137   - EC3CC4DC8A5C9241AE7D9359EEAFC69F /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93ED65B5F47F5FEA00C9BC9D151B1D26 /* SystemConfiguration.framework */; };
138   - EF1B6B88FF4C6BC506B9C85BAEDF034E /* PointerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3447CC75BA7C93ED3BF68C2F65392471 /* PointerType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
139   - EF57A4E0C40DA6E906B390C69902421F /* AnyExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 931ED830C3B0B8852F1479DE61BA997E /* AnyExtensions.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
140   - F1A921225B642E15ED24FB4734240F8F /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 24C69C342339292A7BBB5C56D2C12D12 /* SDWebImageDownloaderOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
141   - F206FE65A9D924A3F6ED6221E3BBD35E /* SVIndefiniteAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = 6768B1FE2E118D79D8A1613520B9BB23 /* SVIndefiniteAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; };
142   - F79EC3C3CF96DFC885E8DD247FEF08EB /* SVProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DC66067EC016B21D6BC487C409083AF /* SVProgressHUD.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
143   - F8FB51647A0925CDAF63C5DAA23D8B4D /* Serializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39C3C21D34A34F85D09063C7E1255E9D /* Serializer.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  10 + 00E153632A414101E0A66AE23569802B /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C01563CB8CAFA848353DD90A07F2F47 /* Result.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  11 + 0369C812B817E442E9BF7B2F561E1AEF /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B19A6339BCDC426144D4987C81596418 /* Configuration.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  12 + 06B6D63D2B2E6F2896A15C18097D3730 /* UIView+Toast.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BD1FCCAAFC6349CA1E2AC3881DB81FC /* UIView+Toast.h */; settings = {ATTRIBUTES = (Public, ); }; };
  13 + 079D990738735591330332B5F2551AE4 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFA9DF74078A51C9573DF6952A753D1C /* NetworkReachabilityManager.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  14 + 0ABF85713B5ABC01E4121F8DBCBBD195 /* Deserializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFFC9D8585FF5A3FC4C7FD63A93DCE16 /* Deserializer.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  15 + 0C11C193B2F9FF679EB214C272C8A480 /* Transformable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ABA7E2E494925BF34BC9885BE24E31C /* Transformable.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  16 + 0D0F6E0ECE5915267F0EA404BDCD4BAC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  17 + 0D6E3F656916E4C6734BAF1DAB7CAEE7 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 61D09F1E0C8F29641858460B3928A5B0 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; };
  18 + 12DE723E9DF6F13F3286874C3A95E30A /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14E325E19530D7ADA41064D345141437 /* Logger.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  19 + 143D0DFED5AF7708744EBDB443F9812D /* EnumType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CC52F25BF175D139AA0E5C94DC363A9 /* EnumType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  20 + 14CECE238604E1D44104E5BCD14EB2BE /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BD55715F6A333D077B971AD89F07626 /* SessionDelegate.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  21 + 164781197625A3149B3BDBCAA2AC8CC3 /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 981D262EBFB4CA168BE569F48CC64843 /* Validation.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  22 + 189863C7E2504923687D78D7B081F8CA /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 229808FB79115B70777D682D8335C18E /* NSData+ImageContentType.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  23 + 18FE70ED14474EE6A49E85DE9C5E4C17 /* AlamofireImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 600ABB9AA8054F7B4E851C17D19FCAA0 /* AlamofireImage-dummy.m */; };
  24 + 1A34F151BC19E9D0725C689FC1038209 /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B05BD93D4EE278B866CC9AAF18763DB /* SDWebImageDecoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  25 + 1B9EDEDC964E6B08F78920B4F4B9DB84 /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 78F77FFCC80D398532E854672D527FD8 /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  26 + 1E2754F17B8625E93745EB87C0E58961 /* Pods-ParentAssistant-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1706C196E50CAE9C6DE364B9BA5E9DCB /* Pods-ParentAssistant-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  27 + 1F4FA4B67BA7582CA193404E3510B095 /* SVRadialGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = CBB0446840A0CDD4BB7D69692D07CC21 /* SVRadialGradientLayer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  28 + 204944D67267632DD7CD4BEFB60AC389 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = D82D7054D7F1E7FE0ACBE043A3FA7F50 /* Response.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  29 + 23C92743D0D2154080836B58896172C9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  30 + 242367446F58A71823A8250396E775A3 /* HelpingMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05B1F80DC3C02C2AD29D4C6CEA059CCD /* HelpingMapper.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  31 + 26479B07464784F3BF8C0853CA049976 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  32 + 29B1FA33CD27E5CAEC884DA6D0072CFC /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BBA6274610821F15000C6CC777D555B /* SDWebImageDownloader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  33 + 2B58B070F9D7324583D01EE906BC918C /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F6296C8F6861894C09A46E509B544A6 /* SessionManager.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  34 + 2B5DF32B1906ED4F0088D37CE08CB2B9 /* Metadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00395AB0A6A459E12899B1CC7AA3C954 /* Metadata.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  35 + 2EA01E4E252B14F7953C56C100482236 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 920C3AE864C4E24091B77772A498A58C /* SDWebImageCompat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  36 + 32EDA9ED83F4442303A46839027E152E /* AlamofireImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AD53A7A5BDC98AFD3CE8CF1BC407F10 /* AlamofireImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  37 + 332B3CC48AC35662839D5A89D1FD9C0B /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E4D61E78309E6543D6EBC75BE2967417 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
  38 + 33FCBEF6884A33B921FEC6A9511B8E20 /* SVProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A23A7E20FB52B9BFC4899C0FEBA2C6CE /* SVProgressHUD-dummy.m */; };
  39 + 343B30C989188B77FB1149FED753A63C /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAE58263CB0A52CDB5D3790DC6D0D74F /* ServerTrustPolicy.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  40 + 357EC08486308022D69F865CBFC53798 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 61CAF6761E3C21827415A9DA38D18547 /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; };
  41 + 36840E12F93D5E0D201B1D998B96EEB9 /* UIImageView+AlamofireImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4D00913B407B6DB96C7E7B48C21D904 /* UIImageView+AlamofireImage.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  42 + 385BDDC55889104E43C83664FD4C2BD3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  43 + 3A9E64415250045D18CD329DE4776D9A /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 496A0D655D409BDF23A3826300EBCD1B /* UIImageView+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  44 + 3B2224950C9D1CE87BA75653DDDD2A13 /* SDWebImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = F3CF9F638E5784E56583202BEBE63239 /* SDWebImageDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
  45 + 3D0142A71F210A641528761123C4F1C2 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ED641951605DEB02B067F9D1915C5A9 /* UIImage+MultiFormat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  46 + 3D34EECD1D7C0DC13F3E19C4C74F212E /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 358430CDB8CA6FB92C74E9FC7F6EB159 /* SDWebImageDownloaderOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  47 + 3F16FEA96023ABF8BB9A47112409421A /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = A2BD80EBA9375936EAA1AE0D930C61EC /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
  48 + 4140A49CB0D5F03DD7565AC94796D856 /* Toast-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E637F89EC35850C7250805992BB1C0 /* Toast-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  49 + 4214C2FD7E877BAD66B5E69E70D52CC2 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A53991A7FAF70CDAC1F059FB04F5543 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; };
  50 + 48F71FC920A4F562FF7ECFD25BD08F2E /* NSDecimalNumberTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 467C66A8C88F09EF9D0129564F08540C /* NSDecimalNumberTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  51 + 4A961542DBC3F70E502B854EBB870694 /* EnumTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BC1B5A06113F348365D3564FD6425C6 /* EnumTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  52 + 4C144355E41C99902528AAD3CF069680 /* DZNEmptyDataSet-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CECDC33DC6A3E686FD21577C5B23C258 /* DZNEmptyDataSet-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  53 + 4F7B3FA3957DCA2A67546E72117904F9 /* HexColorTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC1E0E16DEFECC3E2FE92A428C9920D /* HexColorTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  54 + 4FAADAA79CF5A8371B74578A2EC10761 /* XRCarouselView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B63F0AB7376A64C50DA03CACC7D9CC2E /* XRCarouselView-dummy.m */; };
  55 + 50424A0F4A3907712832B1FA56C9E2A2 /* Measuable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07BCC67F387326CAFCE34AF5FD2DBDE2 /* Measuable.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  56 + 53591DA77C42B53EB9AB3060008F41B6 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 02DAB9B7A1A3D2199EFC7FC7FC69ED85 /* SDWebImageManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  57 + 5438E76D8DA2CB8E045DE40226F4A5AB /* DateFormatterTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D7A5D10D9FFDD32C4D3CF85DDCFC707 /* DateFormatterTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  58 + 545C0FA9073D729E2E8C3EF9678C0DEA /* TransformOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC1BF45D7C52BC6493B283DDB371395F /* TransformOf.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  59 + 5475A5933FABB5F9999E31020427B182 /* DataTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6614C2951E5A4AB6D1DF2B076BF1A5C /* DataTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  60 + 56815D1138F9669E37F2004119169267 /* SVIndefiniteAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 70B842936FA16DF44F4AD4FC84E225A4 /* SVIndefiniteAnimatedView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  61 + 57B5D779BAB2A1CF8C2D4CF8F14066A0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  62 + 58812AABBC0A1E7AE019752424DF31A7 /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7C98E50FC5D694C89DBEE8A1486D900 /* MultipartFormData.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  63 + 59145DFC87F4E74844E76619E8C4114D /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 310743AC8DCCF3F81515515A6FC64B8A /* UIImage+GIF.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  64 + 5C95D2513AAB007D33804F074AC4DD33 /* Export.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1300F08331C16959F41C2533B209EF5 /* Export.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  65 + 5D0701D0FA9726E83C52A53F4BEAD02B /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99BBF9B209FE42B0D74F5CFB60627F /* UIView+WebCacheOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  66 + 5D287B058202AFDA4DED5D49B6ED0A1E /* UIView+Toast.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B41A43E5D5CCE97E46706AC4240B68 /* UIView+Toast.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; };
  67 + 5D8FA1EAFFDA438C0D3E909D54D6E657 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 155F8627DF2C4A4A091DD4AF34FFEF02 /* SDImageCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  68 + 5E25BCD30BDE2E7A68D1A6FAF7253AD4 /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2245A79B4B989C667CBB26B48B7A1896 /* DispatchQueue+Alamofire.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  69 + 5E9D11BEACC080376EA6F57C6167B34A /* HandyJSON-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 293A8917426C277C951BE22C661A240A /* HandyJSON-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  70 + 60E47009DC055C6C140154BC96B5C58C /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC0A874231DDAD102B02D7EFD048FDE2 /* Image.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  71 + 613167D898FF421A6F75D1FE5D145B9B /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CD0FA7EE743F01B3A6385702606A408 /* Alamofire.framework */; };
  72 + 6257B7791953547BB4FD33142C6A4016 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DFCFB41829DC67B9036DEF9766C6C88 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; };
  73 + 638A8C8931AA82B35E4165A32BDEF8CA /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BFF20BC7E4F55C09BAC34A664D91FED /* UIButton+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  74 + 6540CC4D369A32F6DE54AFA8D5D6FAF9 /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 489ED6DFB42C7C8F6A4875005025A913 /* Alamofire-dummy.m */; };
  75 + 666A863EA9B0A00CA5EDDB4C96EA014B /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = F775144A6F17788F065E01BFD8DC2D5C /* Reachability.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  76 + 68EF6ACDBEC67DED9ACB63B4CFA05404 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = ED4D8AA9257567AC16CB397E7E8BF346 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
  77 + 69735BB95E8E8111E0CEA96BBA19486A /* ExtendCustomModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68D3997593CBB0B018C81C73E8337C2C /* ExtendCustomModelType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  78 + 6C5B6525AD8543CD0EA5382D9B9EBF00 /* SVIndefiniteAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = 5BF833E322898122D95617BD9520476D /* SVIndefiniteAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; };
  79 + 6F4160DEA9816F49351CCEF452CCF00C /* CustomDateFormatTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98932AABF2712E9978244730956580D5 /* CustomDateFormatTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  80 + 71770C33C6DBF555B10D0A42E5C034F4 /* NominalType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C29AD1BD351F370FBE921BBE6756CEC9 /* NominalType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  81 + 73B9C996AED49ED7CF8EC2A6F1738059 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  82 + 78F4229B4A746A38341474FEB9DADB25 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F3763627E35DE67CD17EE93E640DD39 /* ParameterEncoding.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  83 + 7931BF35785763872BD11EB65164B1D5 /* TransformType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F75E090F317987C0134B9DD1E5963C9 /* TransformType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  84 + 7B8F1E3301B7F3D1AF25FDE0E2618647 /* SVProgressAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = DBA6EC35D53897ED2A96FEDE1BB384BA /* SVProgressAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; };
  85 + 7C3888324281E325ABBDDB3888D52125 /* DZNEmptyDataSet-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EC105ECBFE938402821EF19D7C5DA1DA /* DZNEmptyDataSet-dummy.m */; };
  86 + 807283562FFCAF1B2AC3B251ABF34B5A /* URLTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B31E52FEB6E5A6A955D4050CB76B18C /* URLTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  87 + 80AF024EF162F4FB88CCAAA2FA6FAAD5 /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F1187580C59983EBFA6A55260AF21079 /* SDWebImage-dummy.m */; };
  88 + 8444B1FF566FC96D823C154BEE6A4A03 /* BuiltInBasicType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68ECD5E13EA08D669EEBD74218B18FA5 /* BuiltInBasicType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  89 + 8511E9645F5C2B18746B4B4B29284451 /* UIScrollView+EmptyDataSet.h in Headers */ = {isa = PBXBuildFile; fileRef = DD324E3E21CD21F91211149384F64690 /* UIScrollView+EmptyDataSet.h */; settings = {ATTRIBUTES = (Public, ); }; };
  90 + 85B4114292AEC3C6DCD2F9500A064F9B /* UIImage+AlamofireImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E3282E372FE0A6C0D2227384238F921 /* UIImage+AlamofireImage.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  91 + 86DCCE5F06E9EDF67344C60D4859F032 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 715810392F163BB36DFE8AC307460289 /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; };
  92 + 86EF282C771B9E7A12106ACBE6E820F5 /* ExtendCustomBasicType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7701D17547204EF54A538449343E8A4 /* ExtendCustomBasicType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  93 + 895952B7EE442E03D667D9565D8C84F4 /* HandyJSON.h in Headers */ = {isa = PBXBuildFile; fileRef = 92B55B2A9C151490137F69027B7F531E /* HandyJSON.h */; settings = {ATTRIBUTES = (Public, ); }; };
  94 + 8E31EF89BD192C6AACDE9E0655861D3D /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BAE5BE9DB67074649A1927384361E0A8 /* UIKit.framework */; };
  95 + 8F5C0849D2757FC5A7C81B81BA3813C3 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BE4F7B39AE70471948017C04083277A /* ResponseSerialization.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  96 + 90E5A049B2FE3D38A1EA782CBB763739 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 01529461C8BC5BFBF1FAD1AE7D691496 /* SystemConfiguration.framework */; };
  97 + 92BC60F896B3049AEF17412EE13B32D5 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = D96BCA19B9F922B2258E4C0D40666B58 /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
  98 + 930D1C2CE2E4A32830066A7F4240F88F /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D9602FA58305177F98B7472A155DE66 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; };
  99 + 93258C9412DF54DD088A385C2CCC79D1 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D43927282F3DD1C78741ABFCC5E0C768 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
  100 + 9371A6AC1CEABB24E7275AACD3FDC21A /* Reachability.h in Headers */ = {isa = PBXBuildFile; fileRef = EF0B6E4594449A55A06C44CB6D1223F0 /* Reachability.h */; settings = {ATTRIBUTES = (Public, ); }; };
  101 + 945146A0826BB693F1B9496A0620A97F /* SVProgressHUD.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 729A72124A700ED6D7D56FE6E3316184 /* SVProgressHUD.bundle */; };
  102 + 95F6802FB7C748286D6E1D6876552E8C /* BuiltInBridgeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 916CF2DD179C34072F0CED7EA7E172C4 /* BuiltInBridgeType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  103 + 963D3083B43A304CE4A81FF8908C644C /* DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10D6F8B588CB7C3C02CD426DADF34CE4 /* DateTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  104 + 980154A8EB800AAF627251C8AAD7EAA9 /* XRCarouselView.m in Sources */ = {isa = PBXBuildFile; fileRef = 89457F43B7DE2154380C8DD976759AA2 /* XRCarouselView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  105 + 981EFF1371FCE40F1907DA262743B93E /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = E215EB7C10CD4B2F724959DB344FE5C0 /* Notifications.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  106 + 98C28E5A4A7CC37A671D4BBAE25EB3CB /* XRCarouselView.h in Headers */ = {isa = PBXBuildFile; fileRef = AA29655EDD56783CB2C21A411019B7BA /* XRCarouselView.h */; settings = {ATTRIBUTES = (Public, ); }; };
  107 + 9D9717AC018F075F378E52B078CDBFB5 /* ImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDA2AA9043380263CFFD99AE883B70ED /* ImageDownloader.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  108 + 9DBB6831E79F70D2E8C4DFD169E228E2 /* Request+AlamofireImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC28263CA0EDAEA1CBC1173B87FEA769 /* Request+AlamofireImage.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  109 + 9E686D93A33DD9756B0C21B68BD7D758 /* ImageFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A58625E1014C6D82D1825309986334E1 /* ImageFilter.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  110 + 9EB13C869EF150828095C94F1FEFC517 /* Properties.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECC6F721935680D316DC183994F4F569 /* Properties.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  111 + 9FC9BC048B02CFF720B9CFBE4DC80264 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DA08525DC2775B611071866CF38CC96 /* SDWebImagePrefetcher.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  112 + A04DAA4579CD1E21D2161AABB36244C4 /* SVProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = F81C313FED69F64F2F4F403B4C4EC3F6 /* SVProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; };
  113 + A133EAE3F50C55B4E1A03A5F9D6B3A4B /* UIButton+AlamofireImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4ACCC8EE8E5E07D0CD171894588314 /* UIButton+AlamofireImage.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  114 + A24D31929B67BB4D0EED65AA74C0E3F9 /* SVProgressAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = A8CB977B7AFFFA509CAA11CD0C03AEB5 /* SVProgressAnimatedView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  115 + A43438F0B3A712FB5739EA173AB6F134 /* ReflectionHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35322B49B5EBE0CF14B7BC8677497347 /* ReflectionHelper.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  116 + AC2961AE064F12C1AA82F853AE6CF4DE /* OtherExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4457386C2A87F3E11630992C9CAA7836 /* OtherExtension.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  117 + AD2C576F50E67B2417C1D17FBF5E32B2 /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EBA3110EB94A0568FF28796D778675E /* AFError.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  118 + B0114B93073F87D24BE99FCEE08CDAE2 /* XRCarouselView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 49DC3C5FB6A7B1CDAA1410FAABB684E0 /* XRCarouselView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  119 + B06A3FFD3EBF03FF3166F6E1B0D665F9 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 98BA100696255C8CFD15860D64267467 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
  120 + B2CC21A9D71EA49F2A55896265CF8E29 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B82FE543DC2AE8EF3A0F380DE2B5988A /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  121 + B58BEA72F3BC139D3784844F73AA791F /* SHA1.swift in Sources */ = {isa = PBXBuildFile; fileRef = E651A4469FA2206746488B70290D48C0 /* SHA1.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  122 + BBC827F8711B46CA8FC3854C99DF703A /* SVProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A591BFD7762D296F2E84EBC08129BFA /* SVProgressHUD.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  123 + C23D014A840F87E883B74ABEC475E608 /* HandyJSON-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 46E35C087C53D197C9D213DF73A74B66 /* HandyJSON-dummy.m */; };
  124 + C4DC2D005B7A1313DF98AFF23E15D1B3 /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8249AA0D5DBC641B891AE927074850B2 /* MD5.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  125 + C577B322B52228B272D52FF32B7BE30C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  126 + C5FD57751548EFFA6567AFD2EB47CD56 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = E74F653E7072F40DB006FC90854FC840 /* Request.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  127 + C906E3F3B8CC5A9E003DB020DFAE7864 /* PropertyInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CA29ADD75C3FE58A4ED07E10D427C9F /* PropertyInfo.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  128 + CA6644C7C70AC449F8D9968CA529C381 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 852A7B853425A17ACDE963BB0C57B689 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
  129 + CB5529FBDB9ED31E939EFD0EF7D8EBE3 /* SwiftHash-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DF7918BBC8A10388FDE15B624F66A8E9 /* SwiftHash-dummy.m */; };
  130 + CBFDD17FED69C5F001648B331CE5FDDE /* Pods-ParentAssistant-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F6BAADF2798AA6F62DA82FAA92DECB07 /* Pods-ParentAssistant-dummy.m */; };
  131 + D1341DA6F9B384B99BAB4C367DAD6BEC /* UIScrollView+EmptyDataSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AC81C76B41B0ABF4E94921ADBA70C30 /* UIScrollView+EmptyDataSet.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  132 + D22AD2613455598A94BFCCA33AA9B2CE /* Reachability-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 17EFC56D8D5FA327B6DEB6D0ADC56C1C /* Reachability-dummy.m */; };
  133 + D425D13A48689CCBEA1C0BE43928A682 /* ISO8601DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7379E87D9FF2E196ADB91DC8A0A5F2F3 /* ISO8601DateTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  134 + D4C68ED144E24084583644C877C41229 /* Reachability-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 078CF0A581F3816CBA8D7047271D2CE9 /* Reachability-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  135 + D5686072DEC1A0E14F8C100FCC873F73 /* TaskDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DBA7A206E80F9E00E01BEFE74D6D69 /* TaskDelegate.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  136 + DC896F68B018619A895D3BE4C70D0E4D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  137 + DC9317C7F961BB389FA7ECC2260B08F0 /* Toast-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 53599A8492E17F111CC5C8D3C50E872A /* Toast-dummy.m */; };
  138 + E198F398404F07805E5189165F3C1E64 /* Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A34017AEE736DE7CC86E3201A0B303C /* Timeline.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  139 + E34A395CCE4DFEB66FE70DC91B6FA149 /* SVRadialGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 770A612E1A02028636A4D09BDEB87D10 /* SVRadialGradientLayer.h */; settings = {ATTRIBUTES = (Public, ); }; };
  140 + E363FB7AFABD373D4D2EB91EEAEAA556 /* SVProgressHUD-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 06E0F3A00F6C087D410087D3FE65529D /* SVProgressHUD-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  141 + E83FA4C154706E4EEAD3DE51B86C5BAB /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B77DE72B7ED4AED0DBED016D1274EFE8 /* ImageIO.framework */; };
  142 + E90F4E9FD8EA1D01B118497ACBB199D8 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CD28D005A100BC203777597B48B8AD06 /* UIImageView+HighlightedWebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  143 + E96AB8B40C45FF09A9F396DCFD27D1C0 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B751448AE7B6607E97470BFD4082216 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
  144 + EBA0781A1E2822CF7DFD56ACD394A63E /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A5A5A7B7C1088D4D4ABDFAAF6E54F3 /* Alamofire.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  145 + EC5530E67F5D0CEEB72B1E36367AF20E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  146 + ECE9CADAD4EB77DEC8B08FD74D6DD3BE /* XRPlaceholder.png in Resources */ = {isa = PBXBuildFile; fileRef = B00FEDA7D2B852B770837D954A635F0B /* XRPlaceholder.png */; };
  147 + ED693ED034E99CACC204CFDFCE742485 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  148 + EF1B6B88FF4C6BC506B9C85BAEDF034E /* PointerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABE9E390C3EADB423277CE1E912E10AA /* PointerType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  149 + EF57A4E0C40DA6E906B390C69902421F /* AnyExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF39B11A9C408A7CFA8E347E7F717E80 /* AnyExtensions.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  150 + F254CF02931202CD44537EAD61D27BE8 /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEA8115215CE30840A6225F435645485 /* ImageCache.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  151 + F323261D44C70B6D6C4127E85BA62E2E /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 94B64C32F67C820564A1C07F82FB412C /* QuartzCore.framework */; };
  152 + F89476E482F3768E646BBBF8CD21E6EF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  153 + F8FB51647A0925CDAF63C5DAA23D8B4D /* Serializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF0EB1CAE5B795EB85A1165F6D98C372 /* Serializer.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  154 + F9554493CBDF921FEF278972C7FA3221 /* SwiftHash-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B25C902A48A887CDEA53D385B48C92E /* SwiftHash-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  155 + FB9814E780909550F494F507BEB3B6B5 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 94B64C32F67C820564A1C07F82FB412C /* QuartzCore.framework */; };
  156 + FF0007F0502C85600F98BC8E62F739D2 /* AFIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE04BA7BB2F95B59112DED31AECB069E /* AFIError.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
144 157 /* End PBXBuildFile section */
145 158  
146 159 /* Begin PBXContainerItemProxy section */
147   - 14508FFAEE6EBD1C2386229671393CCD /* PBXContainerItemProxy */ = {
  160 + 189D44E9EA4F94C8EC2EBCD3B9A94437 /* PBXContainerItemProxy */ = {
148 161 isa = PBXContainerItemProxy;
149 162 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
150 163 proxyType = 1;
151   - remoteGlobalIDString = 6376DC419EEA98495631602218A4F31B;
152   - remoteInfo = SwiftHash;
  164 + remoteGlobalIDString = 1465651EBBC44AD3276DDE2476CDA450;
  165 + remoteInfo = HandyJSON;
  166 + };
  167 + 1DC0B6708B1B4007743DC8E966822305 /* PBXContainerItemProxy */ = {
  168 + isa = PBXContainerItemProxy;
  169 + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
  170 + proxyType = 1;
  171 + remoteGlobalIDString = D386C75EFD4F03725E4EFB866B600B9A;
  172 + remoteInfo = DZNEmptyDataSet;
153 173 };
154   - 1F4310C891A7C6531B2EC2F44755F5D2 /* PBXContainerItemProxy */ = {
  174 + 38E587F9ED2E7A43122E76199C12388D /* PBXContainerItemProxy */ = {
155 175 isa = PBXContainerItemProxy;
156 176 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
157 177 proxyType = 1;
158   - remoteGlobalIDString = 8FA4EA707F3B6CFDACB1C85C722D2E73;
  178 + remoteGlobalIDString = 37F4E36BECBDD0070D2501E766C0238B;
159 179 remoteInfo = SDWebImage;
160 180 };
161   - 40A6BB26078AD6CC3BFED24490AA679C /* PBXContainerItemProxy */ = {
  181 + 4AE51A1942CC8930F7A20592BF7BC9CB /* PBXContainerItemProxy */ = {
162 182 isa = PBXContainerItemProxy;
163 183 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
164 184 proxyType = 1;
165   - remoteGlobalIDString = D386C75EFD4F03725E4EFB866B600B9A;
166   - remoteInfo = DZNEmptyDataSet;
  185 + remoteGlobalIDString = 9EFE4C70245EE2857D336B8B9FA4E825;
  186 + remoteInfo = AlamofireImage;
167 187 };
168   - 594A8718DA74EC137A691ED506FE6CCB /* PBXContainerItemProxy */ = {
  188 + 4B6C29399AB72BDC0DC80584EC3BD333 /* PBXContainerItemProxy */ = {
169 189 isa = PBXContainerItemProxy;
170 190 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
171 191 proxyType = 1;
172   - remoteGlobalIDString = 27189F0EDBCA8831C460D0166F6F37A1;
173   - remoteInfo = XRCarouselView;
  192 + remoteGlobalIDString = A0A5E57D4BB5AA2602B591D713407086;
  193 + remoteInfo = SwiftHash;
174 194 };
175   - 82A515E1EF9A2DA9422FDE7D829F0650 /* PBXContainerItemProxy */ = {
  195 + 4EDB1BF0F4A9280D81BBE57A53DD7917 /* PBXContainerItemProxy */ = {
176 196 isa = PBXContainerItemProxy;
177 197 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
178 198 proxyType = 1;
179   - remoteGlobalIDString = AAC4087A5A57F5566AB9B54FEBADBC36;
180   - remoteInfo = Reachability;
  199 + remoteGlobalIDString = 0A4402E270B0A4B00A031931BD805EF1;
  200 + remoteInfo = XRCarouselView;
181 201 };
182   - 8E7E6D806A10070D238FC81F6BAB4860 /* PBXContainerItemProxy */ = {
  202 + 9554361F88EB7FDE40F109D073B49910 /* PBXContainerItemProxy */ = {
183 203 isa = PBXContainerItemProxy;
184 204 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
185 205 proxyType = 1;
186   - remoteGlobalIDString = 9A9DDC64623B3F5E6DC7009C16752B95;
  206 + remoteGlobalIDString = 620180280B57A3DF973662E546D211E4;
187 207 remoteInfo = Toast;
188 208 };
189   - 8EE514F180AE8F72FA2CB958642AC2D2 /* PBXContainerItemProxy */ = {
  209 + A1758AA696D56310AA192B587162169A /* PBXContainerItemProxy */ = {
190 210 isa = PBXContainerItemProxy;
191 211 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
192 212 proxyType = 1;
193   - remoteGlobalIDString = E55BDEBC8F73D6B7936791D0822F70D6;
194   - remoteInfo = SVProgressHUD;
  213 + remoteGlobalIDString = 88E9EC28B8B46C3631E6B242B50F4442;
  214 + remoteInfo = Alamofire;
195 215 };
196   - A81D9D0AD4D99710674892A4C13CE7C4 /* PBXContainerItemProxy */ = {
  216 + B52B9C3E170467E0CA53E1CF539F3C3C /* PBXContainerItemProxy */ = {
197 217 isa = PBXContainerItemProxy;
198 218 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
199 219 proxyType = 1;
200 220 remoteGlobalIDString = 88E9EC28B8B46C3631E6B242B50F4442;
201 221 remoteInfo = Alamofire;
202 222 };
203   - EE8B3E8B9AA89EC765C0E539B4E7EDC7 /* PBXContainerItemProxy */ = {
  223 + C3177531DBE096BDE468C9291366B775 /* PBXContainerItemProxy */ = {
204 224 isa = PBXContainerItemProxy;
205 225 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
206 226 proxyType = 1;
207   - remoteGlobalIDString = 1465651EBBC44AD3276DDE2476CDA450;
208   - remoteInfo = HandyJSON;
  227 + remoteGlobalIDString = CE1092398200ECC7DE7468626D1D0B98;
  228 + remoteInfo = Reachability;
  229 + };
  230 + CA2DE504A4CA7EA9E0FBEE6863FE1B71 /* PBXContainerItemProxy */ = {
  231 + isa = PBXContainerItemProxy;
  232 + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
  233 + proxyType = 1;
  234 + remoteGlobalIDString = 637267420040487628765A2667620742;
  235 + remoteInfo = SVProgressHUD;
209 236 };
210 237 /* End PBXContainerItemProxy section */
211 238  
212 239 /* Begin PBXFileReference section */
213   - 02C19698DC383415660AD836A73862CF /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
214   - 0322584439902B09D766EF9B00C87E2A /* SVProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SVProgressHUD-dummy.m"; sourceTree = "<group>"; };
215   - 03475756EB49A978A9F331D44971B60B /* libcrypto.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libcrypto.a; path = NIMSDK/Libs/libcrypto.a; sourceTree = "<group>"; };
216   - 05BE4EE179BFA37C2F5F3928F9237A1F /* Properties.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Properties.swift; path = Source/Properties.swift; sourceTree = "<group>"; };
  240 + 00395AB0A6A459E12899B1CC7AA3C954 /* Metadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Metadata.swift; path = Source/Metadata.swift; sourceTree = "<group>"; };
  241 + 00E5D50454806A1FFA39BF7A572D4A37 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  242 + 01529461C8BC5BFBF1FAD1AE7D691496 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; };
  243 + 0241F285DD08F109C7549C2CDA98F2F6 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  244 + 02DAB9B7A1A3D2199EFC7FC7FC69ED85 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = "<group>"; };
  245 + 045B43DFAA088FDD2E5F7DE61A99D3EF /* UMCommon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMCommon.framework; sourceTree = "<group>"; };
  246 + 057C8BFD76D95D8932478DFC5DA7DB3E /* UMErrorCatch.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMErrorCatch.framework; sourceTree = "<group>"; };
  247 + 05B1F80DC3C02C2AD29D4C6CEA059CCD /* HelpingMapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HelpingMapper.swift; path = Source/HelpingMapper.swift; sourceTree = "<group>"; };
  248 + 06E0F3A00F6C087D410087D3FE65529D /* SVProgressHUD-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-umbrella.h"; sourceTree = "<group>"; };
217 249 074C4EB853C59CB4403154F8FC3B42A1 /* Pods-ParentAssistant.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ParentAssistant.modulemap"; sourceTree = "<group>"; };
218   - 07E1E2C8AC8B32A86D7C0A576243A070 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = "<group>"; };
219   - 08E13F442024BE43D2F31AA6F2C300DA /* AFError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFError.swift; path = Source/AFError.swift; sourceTree = "<group>"; };
220   - 095F51C7CEE9EF306E13A58319881EFF /* Reachability.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Reachability.modulemap; sourceTree = "<group>"; };
221   - 0969E5011DCC0C421F637E6859279610 /* Reachability.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Reachability.m; sourceTree = "<group>"; };
222   - 09E993E3E47BE7E80DCFECCEA59937CC /* XRCarouselView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = XRCarouselView.framework; path = XRCarouselView.framework; sourceTree = BUILT_PRODUCTS_DIR; };
223   - 0CDCA399D86C4D9BFD1AAA60E4F5A9F5 /* HandyJSON.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = HandyJSON.modulemap; sourceTree = "<group>"; };
224   - 106A3E63162DD85E6D0BEC1EE1FFDBB4 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
225   - 11DABA5B57A3076260D36D4A9AE646F5 /* HandyJSON-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "HandyJSON-umbrella.h"; sourceTree = "<group>"; };
226   - 140A2830037A30E45442BA52CBDA1CFC /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = "<group>"; };
227   - 1439A3EA7193042844C3E9C52032677C /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = "<group>"; };
228   - 14EC82B350F60C65CB156014F5997DCE /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = "<group>"; };
229   - 16CC2B704148D354077756FC0880DBCB /* Reachability-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Reachability-dummy.m"; sourceTree = "<group>"; };
  250 + 078CF0A581F3816CBA8D7047271D2CE9 /* Reachability-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Reachability-umbrella.h"; sourceTree = "<group>"; };
  251 + 07BCC67F387326CAFCE34AF5FD2DBDE2 /* Measuable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Measuable.swift; path = Source/Measuable.swift; sourceTree = "<group>"; };
  252 + 08D048205A3343D5E251F506CBBE23E6 /* HandyJSON.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = HandyJSON.modulemap; sourceTree = "<group>"; };
  253 + 0ABC8592074E5B83BDBF01388C67A8B7 /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = "<group>"; };
  254 + 0B751448AE7B6607E97470BFD4082216 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = "<group>"; };
  255 + 0BD55715F6A333D077B971AD89F07626 /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Source/SessionDelegate.swift; sourceTree = "<group>"; };
  256 + 0DFCFB41829DC67B9036DEF9766C6C88 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = "<group>"; };
  257 + 0F3763627E35DE67CD17EE93E640DD39 /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = "<group>"; };
  258 + 0F4FDE3A8C9BEA27417C27172F5BC2A5 /* SVProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-prefix.pch"; sourceTree = "<group>"; };
  259 + 0F6296C8F6861894C09A46E509B544A6 /* SessionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionManager.swift; path = Source/SessionManager.swift; sourceTree = "<group>"; };
  260 + 10D6F8B588CB7C3C02CD426DADF34CE4 /* DateTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateTransform.swift; path = Source/DateTransform.swift; sourceTree = "<group>"; };
  261 + 110D34637F4EF19C8F46B101A1509ABE /* HandyJSON.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = HandyJSON.framework; path = HandyJSON.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  262 + 14E325E19530D7ADA41064D345141437 /* Logger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logger.swift; path = Source/Logger.swift; sourceTree = "<group>"; };
  263 + 155F8627DF2C4A4A091DD4AF34FFEF02 /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = "<group>"; };
  264 + 156F9486C74F4094ACE7858B18E5C41D /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = "<group>"; };
230 265 1706C196E50CAE9C6DE364B9BA5E9DCB /* Pods-ParentAssistant-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ParentAssistant-umbrella.h"; sourceTree = "<group>"; };
231   - 1719FF827E35476E2C51408C0A9BD81C /* HandyJSON.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = HandyJSON.framework; path = HandyJSON.framework; sourceTree = BUILT_PRODUCTS_DIR; };
232   - 172419A08571955755C3C6FB2044DD9D /* SDWebImageDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDecoder.h; path = SDWebImage/SDWebImageDecoder.h; sourceTree = "<group>"; };
233   - 17403F9FAA48DA29AAEB297BE9AC4D51 /* SVProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressHUD.h; path = SVProgressHUD/SVProgressHUD.h; sourceTree = "<group>"; };
234   - 1836357ECED17B3B0BF22256498AA8EE /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = "<group>"; };
235   - 18F6A571F05F4D0DD12870CE83C8F787 /* UIScrollView+EmptyDataSet.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+EmptyDataSet.m"; path = "Source/UIScrollView+EmptyDataSet.m"; sourceTree = "<group>"; };
236   - 1914DA670BEE4BC1F461E88ED1BD7C26 /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Source/Configuration.swift; sourceTree = "<group>"; };
237   - 1983D355FD75B9D24A71756509C98131 /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = "<group>"; };
238   - 19FAAAAFAF3A705D1081BDCDC14CAFD6 /* UIView+Toast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+Toast.h"; path = "Toast/Toast/UIView+Toast.h"; sourceTree = "<group>"; };
239   - 1D374115D56716D6284C03A777CD2BB4 /* Deserializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deserializer.swift; path = Source/Deserializer.swift; sourceTree = "<group>"; };
240   - 1DC66067EC016B21D6BC487C409083AF /* SVProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressHUD.m; path = SVProgressHUD/SVProgressHUD.m; sourceTree = "<group>"; };
241   - 206933D2687A3DC4CD2836F2AEF28A3B /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = "<group>"; };
242   - 2098C9BB32F72BB65BA83ADD1F338099 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
243   - 20C0A79CAF95E65B981CC5F896E4334C /* SVRadialGradientLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVRadialGradientLayer.h; path = SVProgressHUD/SVRadialGradientLayer.h; sourceTree = "<group>"; };
244   - 232E0E55F341C5600028F7AAA4F59E8A /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = "<group>"; };
245   - 24C69C342339292A7BBB5C56D2C12D12 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = "<group>"; };
246   - 26EF7D93FE7442849AC14571996AC8ED /* Logger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logger.swift; path = Source/Logger.swift; sourceTree = "<group>"; };
247   - 2830040C9AF69744EEB45C092E65CA2A /* NSDecimalNumberTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSDecimalNumberTransform.swift; path = Source/NSDecimalNumberTransform.swift; sourceTree = "<group>"; };
248   - 297F8CEFA42DFD823263EA02BC36D29A /* HandyJSON-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "HandyJSON-prefix.pch"; sourceTree = "<group>"; };
249   - 29BC53491C8D6BA4B81045D6FBBA043C /* Reachability-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Reachability-umbrella.h"; sourceTree = "<group>"; };
250   - 2AD254563DCC20283BB5C0C5B4E57B5C /* Reachability.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = "<group>"; };
251   - 2D3152CF39784BC2AAD4747AF03BB50A /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Source/SessionDelegate.swift; sourceTree = "<group>"; };
252   - 2E85535E49256ABCDBBB9EA045CE6268 /* HexColorTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HexColorTransform.swift; path = Source/HexColorTransform.swift; sourceTree = "<group>"; };
253   - 2E90E960C03E09803780D5C47A55A4DB /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = "<group>"; };
254   - 2EE1F3AAF4D2513EA3BFF47F019026DC /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Alamofire.modulemap; sourceTree = "<group>"; };
255   - 2F2F35AD7354793D357E10226DE37995 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = "<group>"; };
256   - 31257A57ECE5DD3A052A547DA8090EF9 /* ReflectionHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReflectionHelper.swift; path = Source/ReflectionHelper.swift; sourceTree = "<group>"; };
257   - 31A74FD90C96035085B5A148E9CBA64C /* EnumTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnumTransform.swift; path = Source/EnumTransform.swift; sourceTree = "<group>"; };
258   - 32115C18B0BD53A5791A3FA797AB85AC /* ExtendCustomBasicType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExtendCustomBasicType.swift; path = Source/ExtendCustomBasicType.swift; sourceTree = "<group>"; };
259   - 323A41D79693687F0377B9ACACC90D4A /* XRCarouselView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XRCarouselView-umbrella.h"; sourceTree = "<group>"; };
260   - 328C2C3F0CBE7948196AEE1B0FA7B3F4 /* DZNEmptyDataSet.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DZNEmptyDataSet.xcconfig; sourceTree = "<group>"; };
261   - 33347618F6541AA20F52632F9EA10CA6 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = "<group>"; };
262   - 33F1F6213579E70C284C8445EBD7DBDD /* SVProgressHUD.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SVProgressHUD.framework; path = SVProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; };
263   - 3447CC75BA7C93ED3BF68C2F65392471 /* PointerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PointerType.swift; path = Source/PointerType.swift; sourceTree = "<group>"; };
264   - 3813A00560E8E809CF107BA098D6A666 /* Toast.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Toast.xcconfig; sourceTree = "<group>"; };
265   - 38EE23882943EDCED73523F643A71C39 /* SVProgressAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressAnimatedView.m; path = SVProgressHUD/SVProgressAnimatedView.m; sourceTree = "<group>"; };
266   - 39C3C21D34A34F85D09063C7E1255E9D /* Serializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Serializer.swift; path = Source/Serializer.swift; sourceTree = "<group>"; };
267   - 39F3B60B0A2AD7975DA5BCA943FA6BD5 /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = "<group>"; };
268   - 41009B988332564AFC9DAF9C3817C7FA /* SwiftHash.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SwiftHash.framework; path = SwiftHash.framework; sourceTree = BUILT_PRODUCTS_DIR; };
269   - 41531DBB287870602D671C4D97E99B21 /* UIScrollView+EmptyDataSet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+EmptyDataSet.h"; path = "Source/UIScrollView+EmptyDataSet.h"; sourceTree = "<group>"; };
270   - 42DB5E77081A2858012F4CBF354A0D27 /* Reachability-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Reachability-prefix.pch"; sourceTree = "<group>"; };
271   - 4357F76011180D7A84AB5281135FBC76 /* Reachability.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Reachability.xcconfig; sourceTree = "<group>"; };
272   - 43766E6C5ADEB0502C1E3C6049C5D9AC /* SVProgressHUD.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.xcconfig; sourceTree = "<group>"; };
273   - 448D149E9E2122E63C2D8CDB8E1159CB /* SwiftHash-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SwiftHash-dummy.m"; sourceTree = "<group>"; };
274   - 469D54339A6D448DF6D1166FDB669676 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = "<group>"; };
275   - 481FE62B9A76B9C994CED4CDBF22F059 /* SVProgressHUD.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SVProgressHUD.modulemap; sourceTree = "<group>"; };
  266 + 17EFC56D8D5FA327B6DEB6D0ADC56C1C /* Reachability-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Reachability-dummy.m"; sourceTree = "<group>"; };
  267 + 187D5302F110245F1D24D217827BFBC1 /* AlamofireImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AlamofireImage.xcconfig; sourceTree = "<group>"; };
  268 + 1A34017AEE736DE7CC86E3201A0B303C /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = "<group>"; };
  269 + 1A53991A7FAF70CDAC1F059FB04F5543 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = "<group>"; };
  270 + 1ABA7E2E494925BF34BC9885BE24E31C /* Transformable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Transformable.swift; path = Source/Transformable.swift; sourceTree = "<group>"; };
  271 + 1BF83289F3929832EC0ED8E333158C69 /* DZNEmptyDataSet.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DZNEmptyDataSet.xcconfig; sourceTree = "<group>"; };
  272 + 2245A79B4B989C667CBB26B48B7A1896 /* DispatchQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Alamofire.swift"; path = "Source/DispatchQueue+Alamofire.swift"; sourceTree = "<group>"; };
  273 + 229808FB79115B70777D682D8335C18E /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = "<group>"; };
  274 + 2387EDABD5D4A7ABE66B86C30A524A6C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  275 + 293A8917426C277C951BE22C661A240A /* HandyJSON-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "HandyJSON-umbrella.h"; sourceTree = "<group>"; };
  276 + 29B41A43E5D5CCE97E46706AC4240B68 /* UIView+Toast.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+Toast.m"; path = "Toast/Toast/UIView+Toast.m"; sourceTree = "<group>"; };
  277 + 2A58122C4E55BBB959E9F3D985E070AB /* SwiftHash.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftHash.xcconfig; sourceTree = "<group>"; };
  278 + 2BC1B5A06113F348365D3564FD6425C6 /* EnumTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnumTransform.swift; path = Source/EnumTransform.swift; sourceTree = "<group>"; };
  279 + 2BE4F7B39AE70471948017C04083277A /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = "<group>"; };
  280 + 2D7A5D10D9FFDD32C4D3CF85DDCFC707 /* DateFormatterTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateFormatterTransform.swift; path = Source/DateFormatterTransform.swift; sourceTree = "<group>"; };
  281 + 2E3282E372FE0A6C0D2227384238F921 /* UIImage+AlamofireImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImage+AlamofireImage.swift"; path = "Source/UIImage+AlamofireImage.swift"; sourceTree = "<group>"; };
  282 + 30A5A5A7B7C1088D4D4ABDFAAF6E54F3 /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = "<group>"; };
  283 + 310743AC8DCCF3F81515515A6FC64B8A /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = "<group>"; };
  284 + 344E5051853CBAE87166BAA69476DDB1 /* SVProgressHUD.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SVProgressHUD.framework; path = SVProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  285 + 35322B49B5EBE0CF14B7BC8677497347 /* ReflectionHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReflectionHelper.swift; path = Source/ReflectionHelper.swift; sourceTree = "<group>"; };
  286 + 358430CDB8CA6FB92C74E9FC7F6EB159 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = "<group>"; };
  287 + 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
  288 + 3CD0FA7EE743F01B3A6385702606A408 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  289 + 444E77BBBDD4B2AB34C6742B6752BBCB /* XRCarouselView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = XRCarouselView.framework; path = XRCarouselView.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  290 + 4457386C2A87F3E11630992C9CAA7836 /* OtherExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OtherExtension.swift; path = Source/OtherExtension.swift; sourceTree = "<group>"; };
  291 + 467C66A8C88F09EF9D0129564F08540C /* NSDecimalNumberTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSDecimalNumberTransform.swift; path = Source/NSDecimalNumberTransform.swift; sourceTree = "<group>"; };
  292 + 46E35C087C53D197C9D213DF73A74B66 /* HandyJSON-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "HandyJSON-dummy.m"; sourceTree = "<group>"; };
  293 + 489ED6DFB42C7C8F6A4875005025A913 /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = "<group>"; };
  294 + 496A0D655D409BDF23A3826300EBCD1B /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = "<group>"; };
  295 + 49DC3C5FB6A7B1CDAA1410FAABB684E0 /* XRCarouselView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XRCarouselView-umbrella.h"; sourceTree = "<group>"; };
  296 + 4BBA6274610821F15000C6CC777D555B /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = "<group>"; };
276 297 4CD112151D95CAE264BE24BD4513934F /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
277   - 4DB0A7F29D540AB077DA6D9855C3F743 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
278   - 5104B9F40B6C55F71BDE788F76AA8F53 /* SessionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionManager.swift; path = Source/SessionManager.swift; sourceTree = "<group>"; };
279   - 52C9D81718FDCE850DDAF365FD190B4F /* SVProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-prefix.pch"; sourceTree = "<group>"; };
280   - 52F1099514615B3BA1CA982ECF578DDF /* Toast-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-prefix.pch"; sourceTree = "<group>"; };
281   - 54E529332879B58C942DDF16DF5D39B4 /* ExtendCustomModelType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExtendCustomModelType.swift; path = Source/ExtendCustomModelType.swift; sourceTree = "<group>"; };
282   - 57342E33349B812F65B6D994EA74E212 /* XRCarouselView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XRCarouselView.h; path = XRCarouselView/XRCarouselView.h; sourceTree = "<group>"; };
  298 + 4ED641951605DEB02B067F9D1915C5A9 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = "<group>"; };
  299 + 507695995D3D9F4276EAFC4603ABFF54 /* Toast.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Toast.framework; path = Toast.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  300 + 52303324A62AD0B74F2DD46E74D232EB /* SwiftHash.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SwiftHash.framework; path = SwiftHash.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  301 + 53599A8492E17F111CC5C8D3C50E872A /* Toast-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Toast-dummy.m"; sourceTree = "<group>"; };
  302 + 5684F0F90E3FAEFBE15A94EE1C636644 /* SwiftHash.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SwiftHash.modulemap; sourceTree = "<group>"; };
283 303 587E904615A6336F6F7628482D5BC8D3 /* Pods-ParentAssistant-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ParentAssistant-frameworks.sh"; sourceTree = "<group>"; };
284   - 59271332AFD884264C5B45B6B6152051 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; };
285   - 5B56491AFD4EC6985EBCCEF221A0FCB8 /* SwiftHash-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftHash-prefix.pch"; sourceTree = "<group>"; };
286   - 5C3FCED1EF014BDAA42DACC871E2516A /* Reachability.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Reachability.framework; path = Reachability.framework; sourceTree = BUILT_PRODUCTS_DIR; };
287   - 5C73B5BC3B66F99610607951FEC5FCB3 /* EnumType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnumType.swift; path = Source/EnumType.swift; sourceTree = "<group>"; };
288   - 5DCF2929ACA53CE3D9FD6342DF5F8D9D /* libaacplus.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libaacplus.a; path = NIMSDK/Libs/libaacplus.a; sourceTree = "<group>"; };
289   - 5F6392C48C4C9A3D7130A57D84AFEE2B /* DZNEmptyDataSet-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "DZNEmptyDataSet-dummy.m"; sourceTree = "<group>"; };
290   - 60794CE8C2369C4AA061EE9A931DDFED /* XRCarouselView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XRCarouselView-prefix.pch"; sourceTree = "<group>"; };
291   - 640ED88831DE9CA10759B8FC3751C531 /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = "<group>"; };
292   - 64CF5A867496880A0DAE25ED9EC8E512 /* CustomDateFormatTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomDateFormatTransform.swift; path = Source/CustomDateFormatTransform.swift; sourceTree = "<group>"; };
293   - 65DEF3C169B8F1241E74C3D5C7DA5A6D /* SVProgressHUD.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = SVProgressHUD.bundle; path = SVProgressHUD/SVProgressHUD.bundle; sourceTree = "<group>"; };
294   - 6768B1FE2E118D79D8A1613520B9BB23 /* SVIndefiniteAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVIndefiniteAnimatedView.h; path = SVProgressHUD/SVIndefiniteAnimatedView.h; sourceTree = "<group>"; };
295   - 6850886B55CE3CD9B901B28690292C5C /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = "<group>"; };
296   - 6976D41DC0C992EA2F24C3A7358E958F /* BuiltInBridgeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BuiltInBridgeType.swift; path = Source/BuiltInBridgeType.swift; sourceTree = "<group>"; };
297   - 6B3D43CB0BDA34787F85B2C084FBB09A /* HandyJSON.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = HandyJSON.h; path = Source/HandyJSON.h; sourceTree = "<group>"; };
298   - 6D24FB404E9541910245BF3E68C5EE73 /* URLTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLTransform.swift; path = Source/URLTransform.swift; sourceTree = "<group>"; };
299   - 6E2AA0C415512D5F3F34F7A99AA4D14A /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = "<group>"; };
  304 + 58B4CFDB50C6966BC7B9CB0CBD1C60E7 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  305 + 5BF833E322898122D95617BD9520476D /* SVIndefiniteAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVIndefiniteAnimatedView.h; path = SVProgressHUD/SVIndefiniteAnimatedView.h; sourceTree = "<group>"; };
  306 + 600ABB9AA8054F7B4E851C17D19FCAA0 /* AlamofireImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AlamofireImage-dummy.m"; sourceTree = "<group>"; };
  307 + 60528D650715D578BD996859FC810107 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  308 + 605BF197AFCD5A69E3A6A700329C2FCA /* libssl.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libssl.a; path = NIMSDK/Libs/libssl.a; sourceTree = "<group>"; };
  309 + 61CAF6761E3C21827415A9DA38D18547 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = "<group>"; };
  310 + 61D09F1E0C8F29641858460B3928A5B0 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = "<group>"; };
  311 + 661171DD778BD7E26EE68F008228F1C9 /* DZNEmptyDataSet-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DZNEmptyDataSet-prefix.pch"; sourceTree = "<group>"; };
  312 + 676078733016383B143B493E79D3CEF5 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  313 + 676E6BA89EE0D10BE38626EE3E3B8A9F /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = "<group>"; };
  314 + 68D3997593CBB0B018C81C73E8337C2C /* ExtendCustomModelType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExtendCustomModelType.swift; path = Source/ExtendCustomModelType.swift; sourceTree = "<group>"; };
  315 + 68ECD5E13EA08D669EEBD74218B18FA5 /* BuiltInBasicType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BuiltInBasicType.swift; path = Source/BuiltInBasicType.swift; sourceTree = "<group>"; };
  316 + 6B05BD93D4EE278B866CC9AAF18763DB /* SDWebImageDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDecoder.m; path = SDWebImage/SDWebImageDecoder.m; sourceTree = "<group>"; };
  317 + 6BD1FCCAAFC6349CA1E2AC3881DB81FC /* UIView+Toast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+Toast.h"; path = "Toast/Toast/UIView+Toast.h"; sourceTree = "<group>"; };
  318 + 6CC52F25BF175D139AA0E5C94DC363A9 /* EnumType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnumType.swift; path = Source/EnumType.swift; sourceTree = "<group>"; };
  319 + 6DA08525DC2775B611071866CF38CC96 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = "<group>"; };
  320 + 6E2FF425EC8FB1E33922042D418E2A79 /* XRCarouselView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = XRCarouselView.modulemap; sourceTree = "<group>"; };
300 321 6EB59F100C77215BCBB4FAD12F0FF358 /* Pods-ParentAssistant.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ParentAssistant.debug.xcconfig"; sourceTree = "<group>"; };
301   - 6F37849A9F05E24161217B664F776F12 /* HandyJSON.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = HandyJSON.xcconfig; sourceTree = "<group>"; };
302   - 72803D16FA054A0D26C303991C1F2B3C /* SVIndefiniteAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVIndefiniteAnimatedView.m; path = SVProgressHUD/SVIndefiniteAnimatedView.m; sourceTree = "<group>"; };
303   - 72ADD4F0113F0555435EA10BA789F8E2 /* TransformOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformOf.swift; path = Source/TransformOf.swift; sourceTree = "<group>"; };
304   - 73AD0FFA16B2C0B1B8A40B3A76629975 /* DZNEmptyDataSet-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DZNEmptyDataSet-umbrella.h"; sourceTree = "<group>"; };
305   - 7437E1C250CA27898AA8815D1117643B /* XRCarouselView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "XRCarouselView-dummy.m"; sourceTree = "<group>"; };
  322 + 70B842936FA16DF44F4AD4FC84E225A4 /* SVIndefiniteAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVIndefiniteAnimatedView.m; path = SVProgressHUD/SVIndefiniteAnimatedView.m; sourceTree = "<group>"; };
  323 + 70FB099686511A528F52E5AB1C4FDB4A /* Reachability.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Reachability.modulemap; sourceTree = "<group>"; };
  324 + 715810392F163BB36DFE8AC307460289 /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = "<group>"; };
  325 + 729A72124A700ED6D7D56FE6E3316184 /* SVProgressHUD.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = SVProgressHUD.bundle; path = SVProgressHUD/SVProgressHUD.bundle; sourceTree = "<group>"; };
  326 + 72C584102060EC4C983B4B76AB4B8C8F /* Pods_ParentAssistant.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ParentAssistant.framework; path = "Pods-ParentAssistant.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
  327 + 7379E87D9FF2E196ADB91DC8A0A5F2F3 /* ISO8601DateTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ISO8601DateTransform.swift; path = Source/ISO8601DateTransform.swift; sourceTree = "<group>"; };
  328 + 770A612E1A02028636A4D09BDEB87D10 /* SVRadialGradientLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVRadialGradientLayer.h; path = SVProgressHUD/SVRadialGradientLayer.h; sourceTree = "<group>"; };
  329 + 770EB1960009D9CCA67CBA11FBC8490A /* AlamofireImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AlamofireImage-prefix.pch"; sourceTree = "<group>"; };
306 330 77EFE064376F26AEED2B1971235A88EF /* Pods-ParentAssistant.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ParentAssistant.release.xcconfig"; sourceTree = "<group>"; };
307   - 7C5CEE4C10F2E83011011BAE5999B4FD /* NominalType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NominalType.swift; path = Source/NominalType.swift; sourceTree = "<group>"; };
308   - 7D9407543C44ABED0AC48154C76831BE /* Measuable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Measuable.swift; path = Source/Measuable.swift; sourceTree = "<group>"; };
309   - 7DFB6D55866F4F62D8116993D42B55A8 /* ISO8601DateTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ISO8601DateTransform.swift; path = Source/ISO8601DateTransform.swift; sourceTree = "<group>"; };
310   - 81D2AEE4F419083BF22474B240B3D9F6 /* PropertyInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PropertyInfo.swift; path = Source/PropertyInfo.swift; sourceTree = "<group>"; };
311   - 820C0B25502D820076E6945A9666E544 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
312   - 82C441F9B75595B2F266E6AC40AD7D85 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = "<group>"; };
313   - 835B1DEC82F034C2C12DC0723F18F6E9 /* Toast-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-umbrella.h"; sourceTree = "<group>"; };
314   - 85EBECC44FA24EC40748D3CB399DD1F3 /* Toast-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Toast-dummy.m"; sourceTree = "<group>"; };
315   - 871C0D1C45FD62FE7B82D8E083C00466 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = "<group>"; };
316   - 87691736C308811895AF6EB052ECD8BE /* DZNEmptyDataSet-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DZNEmptyDataSet-prefix.pch"; sourceTree = "<group>"; };
317   - 8781B0306B0188AF528659F413E1B542 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = "<group>"; };
318   - 87D16ABF7E5F8A01191A86657C5C16BA /* XRCarouselView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = XRCarouselView.xcconfig; sourceTree = "<group>"; };
  331 + 78F77FFCC80D398532E854672D527FD8 /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = "<group>"; };
  332 + 79353402DE45C743DE8658FE2C413D90 /* libaacplus.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libaacplus.a; path = NIMSDK/Libs/libaacplus.a; sourceTree = "<group>"; };
  333 + 79BB6C2420E33F3EC3D693AD20145082 /* Reachability-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Reachability-prefix.pch"; sourceTree = "<group>"; };
  334 + 7A45AEAFC59FC8550866653E018742E3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  335 + 7AC81C76B41B0ABF4E94921ADBA70C30 /* UIScrollView+EmptyDataSet.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+EmptyDataSet.m"; path = "Source/UIScrollView+EmptyDataSet.m"; sourceTree = "<group>"; };
  336 + 7C01563CB8CAFA848353DD90A07F2F47 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = "<group>"; };
  337 + 7C4ACCC8EE8E5E07D0CD171894588314 /* UIButton+AlamofireImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+AlamofireImage.swift"; path = "Source/UIButton+AlamofireImage.swift"; sourceTree = "<group>"; };
  338 + 7C9D89FB057D8F2ECBB232C7A81EF4B5 /* DZNEmptyDataSet.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = DZNEmptyDataSet.framework; path = DZNEmptyDataSet.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  339 + 7EBA3110EB94A0568FF28796D778675E /* AFError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFError.swift; path = Source/AFError.swift; sourceTree = "<group>"; };
  340 + 7ED5CEE60A46EFCFCE43D1A6C52D3869 /* Reachability.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Reachability.xcconfig; sourceTree = "<group>"; };
  341 + 8249AA0D5DBC641B891AE927074850B2 /* MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MD5.swift; path = Sources/MD5.swift; sourceTree = "<group>"; };
  342 + 84AE5CF00E8941985B8EB7DFC8A475E7 /* Toast-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-prefix.pch"; sourceTree = "<group>"; };
  343 + 852A7B853425A17ACDE963BB0C57B689 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = "<group>"; };
  344 + 85DBA7A206E80F9E00E01BEFE74D6D69 /* TaskDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TaskDelegate.swift; path = Source/TaskDelegate.swift; sourceTree = "<group>"; };
  345 + 865E120DE5EA698A2789C2686BC45C7A /* AlamofireImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AlamofireImage.modulemap; sourceTree = "<group>"; };
  346 + 874C609455AB27C910DD97EBDD79E965 /* Toast.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Toast.modulemap; sourceTree = "<group>"; };
319 347 891E32DCEDF9E73C788DB01E69C7162C /* Pods-ParentAssistant-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ParentAssistant-resources.sh"; sourceTree = "<group>"; };
320   - 8A51BA19C89D5E62EDCF2DB9D9FA43E0 /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = "<group>"; };
321   - 8CDA4E6BD46E857912EC5B5F99364A24 /* SwiftHash.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SwiftHash.modulemap; sourceTree = "<group>"; };
322   - 8D2C5397761E61B24600821547A409CD /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
323   - 9011EFC1DA29BE6CA0831595062B82ED /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = "<group>"; };
324   - 92331AB0F30415BE666C619D1A45513E /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = "<group>"; };
325   - 931ED830C3B0B8852F1479DE61BA997E /* AnyExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyExtensions.swift; path = Source/AnyExtensions.swift; sourceTree = "<group>"; };
326   - 93251EC8BEF89E6A4FA758DA38A1E47A /* SVProgressHUD-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-umbrella.h"; sourceTree = "<group>"; };
  348 + 89457F43B7DE2154380C8DD976759AA2 /* XRCarouselView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XRCarouselView.m; path = XRCarouselView/XRCarouselView.m; sourceTree = "<group>"; };
  349 + 8A591BFD7762D296F2E84EBC08129BFA /* SVProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressHUD.m; path = SVProgressHUD/SVProgressHUD.m; sourceTree = "<group>"; };
  350 + 8B25C902A48A887CDEA53D385B48C92E /* SwiftHash-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftHash-umbrella.h"; sourceTree = "<group>"; };
  351 + 8BFF20BC7E4F55C09BAC34A664D91FED /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = "<group>"; };
  352 + 8E2EC639DC31085C2078E4638A61266B /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImage.framework; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  353 + 8EC8A0BF26B3414588BF92C66234FD4B /* XRCarouselView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = XRCarouselView.xcconfig; sourceTree = "<group>"; };
  354 + 8F75E090F317987C0134B9DD1E5963C9 /* TransformType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformType.swift; path = Source/TransformType.swift; sourceTree = "<group>"; };
  355 + 916CF2DD179C34072F0CED7EA7E172C4 /* BuiltInBridgeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BuiltInBridgeType.swift; path = Source/BuiltInBridgeType.swift; sourceTree = "<group>"; };
  356 + 920C3AE864C4E24091B77772A498A58C /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = "<group>"; };
  357 + 92B55B2A9C151490137F69027B7F531E /* HandyJSON.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = HandyJSON.h; path = Source/HandyJSON.h; sourceTree = "<group>"; };
  358 + 937EE30FD85AB8EED4F8467502DD290F /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Alamofire.framework; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  359 + 93831DF9B9AE2775CB38F92DAD62BF35 /* NIMSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NIMSDK.framework; path = NIMSDK/NIMSDK.framework; sourceTree = "<group>"; };
327 360 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
328   - 93ED65B5F47F5FEA00C9BC9D151B1D26 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; };
329   - 9889E5067E9A54BAEC05298BBA10F671 /* HelpingMapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HelpingMapper.swift; path = Source/HelpingMapper.swift; sourceTree = "<group>"; };
330   - 99DF7E55400E9131640E0694D3C91764 /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = "<group>"; };
331   - 9A4D6703A8771BB168130EFB6EAC1C3E /* SHA1.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SHA1.swift; path = Sources/SHA1.swift; sourceTree = "<group>"; };
332   - 9A559DCF61F2E184BC9318C05F05CFF3 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = "<group>"; };
333   - 9AEE056145338863D7A727ACF1C3657C /* MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MD5.swift; path = Sources/MD5.swift; sourceTree = "<group>"; };
334   - 9F2BF6E468482ED7EDAE9AFD6CA2C994 /* SwiftHash-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftHash-umbrella.h"; sourceTree = "<group>"; };
335   - A48FF17CB17A07E2B4AEC609B9947C52 /* libevent.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libevent.a; path = NIMSDK/Libs/libevent.a; sourceTree = "<group>"; };
336   - A59A469B0852E07D2428D72E4C62B1E7 /* Toast.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Toast.framework; path = Toast.framework; sourceTree = BUILT_PRODUCTS_DIR; };
337   - A91D08749C812CD6EB281780E69AFED6 /* XRCarouselView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XRCarouselView.m; path = XRCarouselView/XRCarouselView.m; sourceTree = "<group>"; };
338   - AC7C53CF4231A641CE59A3CD5991C5C1 /* SDWebImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.xcconfig; sourceTree = "<group>"; };
339   - AE8B2524C105710A1C75E5F3C734796F /* SVRadialGradientLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVRadialGradientLayer.m; path = SVProgressHUD/SVRadialGradientLayer.m; sourceTree = "<group>"; };
340   - B0A49BF64844554AA6BC0B49FD9A9BE8 /* DateTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateTransform.swift; path = Source/DateTransform.swift; sourceTree = "<group>"; };
341   - B4C40BE5E03351505F3B0830F40CFA9E /* libssl.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libssl.a; path = NIMSDK/Libs/libssl.a; sourceTree = "<group>"; };
342   - B4EC3094994043023CF3002A63DD6DA4 /* DateFormatterTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateFormatterTransform.swift; path = Source/DateFormatterTransform.swift; sourceTree = "<group>"; };
343   - B507541260F671D342B11E7250120BBF /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
344   - B6554BE7D86E2DF12BC2CFA630452CA0 /* SVProgressAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressAnimatedView.h; path = SVProgressHUD/SVProgressAnimatedView.h; sourceTree = "<group>"; };
345   - B71F8A62F3906657D17D418212E1CBA1 /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = "<group>"; };
346   - B88D8470A1A1E4F507B1E9895B074253 /* Pods_ParentAssistant.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ParentAssistant.framework; path = "Pods-ParentAssistant.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
347   - B9A38D8C4EC4826AEDC2A52DD0187186 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = "<group>"; };
348   - B9B732FC24A0EC5E46E41D939F4A1130 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
349   - BB2B3251E63EE34530FC8A40E441CB23 /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = "<group>"; };
350   - BB7CE29DC4FFF250766240EA8DA973D1 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = "<group>"; };
351   - BC3C517CD17DEB98E878268901D654E8 /* Metadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Metadata.swift; path = Source/Metadata.swift; sourceTree = "<group>"; };
352   - BCCC1A6E4AF8DAF6E5609D65548B3C79 /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = "<group>"; };
  361 + 93E637F89EC35850C7250805992BB1C0 /* Toast-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-umbrella.h"; sourceTree = "<group>"; };
  362 + 94B64C32F67C820564A1C07F82FB412C /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
  363 + 950B05ADF5C9C81AF940E6DFFABE4DB9 /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = "<group>"; };
  364 + 95CAD531E474553E7D52B95131219D1A /* Reachability.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Reachability.framework; path = Reachability.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  365 + 9741F11BA31165953D6A9744F073FF08 /* Toast.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Toast.xcconfig; sourceTree = "<group>"; };
  366 + 981D262EBFB4CA168BE569F48CC64843 /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = "<group>"; };
  367 + 98932AABF2712E9978244730956580D5 /* CustomDateFormatTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomDateFormatTransform.swift; path = Source/CustomDateFormatTransform.swift; sourceTree = "<group>"; };
  368 + 98BA100696255C8CFD15860D64267467 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = "<group>"; };
  369 + 9AD53A7A5BDC98AFD3CE8CF1BC407F10 /* AlamofireImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AlamofireImage-umbrella.h"; sourceTree = "<group>"; };
  370 + 9B31E52FEB6E5A6A955D4050CB76B18C /* URLTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLTransform.swift; path = Source/URLTransform.swift; sourceTree = "<group>"; };
  371 + 9CA29ADD75C3FE58A4ED07E10D427C9F /* PropertyInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PropertyInfo.swift; path = Source/PropertyInfo.swift; sourceTree = "<group>"; };
  372 + 9D9602FA58305177F98B7472A155DE66 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = "<group>"; };
  373 + A23A7E20FB52B9BFC4899C0FEBA2C6CE /* SVProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SVProgressHUD-dummy.m"; sourceTree = "<group>"; };
  374 + A2BD80EBA9375936EAA1AE0D930C61EC /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = "<group>"; };
  375 + A58625E1014C6D82D1825309986334E1 /* ImageFilter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageFilter.swift; path = Source/ImageFilter.swift; sourceTree = "<group>"; };
  376 + A6614C2951E5A4AB6D1DF2B076BF1A5C /* DataTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataTransform.swift; path = Source/DataTransform.swift; sourceTree = "<group>"; };
  377 + A8CB977B7AFFFA509CAA11CD0C03AEB5 /* SVProgressAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressAnimatedView.m; path = SVProgressHUD/SVProgressAnimatedView.m; sourceTree = "<group>"; };
  378 + AA29655EDD56783CB2C21A411019B7BA /* XRCarouselView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XRCarouselView.h; path = XRCarouselView/XRCarouselView.h; sourceTree = "<group>"; };
  379 + ABE9E390C3EADB423277CE1E912E10AA /* PointerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PointerType.swift; path = Source/PointerType.swift; sourceTree = "<group>"; };
  380 + AC0A874231DDAD102B02D7EFD048FDE2 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Source/Image.swift; sourceTree = "<group>"; };
  381 + AE04BA7BB2F95B59112DED31AECB069E /* AFIError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFIError.swift; path = Source/AFIError.swift; sourceTree = "<group>"; };
  382 + AF0EB1CAE5B795EB85A1165F6D98C372 /* Serializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Serializer.swift; path = Source/Serializer.swift; sourceTree = "<group>"; };
  383 + B00FEDA7D2B852B770837D954A635F0B /* XRPlaceholder.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = XRPlaceholder.png; path = XRCarouselView/XRPlaceholder.png; sourceTree = "<group>"; };
  384 + B03DB8D1B8FEFA6F91F509A16D6176F3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  385 + B19A6339BCDC426144D4987C81596418 /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Source/Configuration.swift; sourceTree = "<group>"; };
  386 + B4595D719B06D3C0D44248E3DD5B1962 /* XRCarouselView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XRCarouselView-prefix.pch"; sourceTree = "<group>"; };
  387 + B4FE0743D323412387DC64C29B1AE5F7 /* libcrypto.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libcrypto.a; path = NIMSDK/Libs/libcrypto.a; sourceTree = "<group>"; };
  388 + B63F0AB7376A64C50DA03CACC7D9CC2E /* XRCarouselView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "XRCarouselView-dummy.m"; sourceTree = "<group>"; };
  389 + B77DE72B7ED4AED0DBED016D1274EFE8 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; };
  390 + B82FE543DC2AE8EF3A0F380DE2B5988A /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = "<group>"; };
  391 + B9806961B1DB01F087677787DFCC6CE0 /* AlamofireImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AlamofireImage.framework; path = AlamofireImage.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  392 + B9A33258A85F658D3C02E30EC92D43FF /* DZNEmptyDataSet.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = DZNEmptyDataSet.modulemap; sourceTree = "<group>"; };
  393 + BAE5BE9DB67074649A1927384361E0A8 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
  394 + BB6422771B215BFE2B4A9C0D9C9BC82B /* SVProgressHUD.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SVProgressHUD.modulemap; sourceTree = "<group>"; };
  395 + BC99BBF9B209FE42B0D74F5CFB60627F /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = "<group>"; };
353 396 BCECD0FF1E6F7E48270234DAF00B07B7 /* Pods-ParentAssistant-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ParentAssistant-acknowledgements.markdown"; sourceTree = "<group>"; };
354   - BE70BDE392E6E92B76047D2DED4ED380 /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = "<group>"; };
355   - BE846687076AD4570ACE89EC260747A1 /* UMErrorCatch.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMErrorCatch.framework; sourceTree = "<group>"; };
356   - BF1709B1277BE62B09381A0534563DE2 /* SwiftHash.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftHash.xcconfig; sourceTree = "<group>"; };
357   - BF496B88C6E68626DC9D0C9FC152BD3C /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = "<group>"; };
358   - BFD387D9E3BDF322939523D4DF31CA79 /* TaskDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TaskDelegate.swift; path = Source/TaskDelegate.swift; sourceTree = "<group>"; };
359   - C03FC1A11EE20AB8B6A4B398E11B26B0 /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = "<group>"; };
360   - C203E9ABEF394B0009B142EEB9AA64FC /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = "<group>"; };
361   - C33C9063E8CA60D73EE6050FCF59F433 /* Export.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Export.swift; path = Source/Export.swift; sourceTree = "<group>"; };
362   - C62416D612C6BD82B2867F75585C4C56 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
363   - CC9B184B04C60B80BBEF83595DBE8AF4 /* XRCarouselView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = XRCarouselView.modulemap; sourceTree = "<group>"; };
364   - CE1C92985D9321104698E3AFAF68594E /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImage.framework; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; };
365   - CEA07E2E477768269A8D0BECE492EBAF /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = "<group>"; };
366   - CF9CDCEBD5D016D3F349D31FFDAEA20A /* NIMSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NIMSDK.framework; path = NIMSDK/NIMSDK.framework; sourceTree = "<group>"; };
367   - D124D84D327A6ADF3D01C95E84C09A31 /* UMAnalytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMAnalytics.framework; sourceTree = "<group>"; };
368   - D912920D1BEEB7757AF4BE74E2EC8FA6 /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = "<group>"; };
369   - D9ED9DA2E61F2A4DD7E760C61C47A3F1 /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = "<group>"; };
370   - DB5FF7B561F6F548C82F1FC27FDD72E8 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = "<group>"; };
371   - DBE314BE44865438F00A5054E414EF77 /* Toast.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Toast.modulemap; sourceTree = "<group>"; };
372   - DD0E89B8C1439B9F5FDB39EA0232B3EA /* DZNEmptyDataSet.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = DZNEmptyDataSet.framework; path = DZNEmptyDataSet.framework; sourceTree = BUILT_PRODUCTS_DIR; };
373   - DE3D895CEB8D8D9876BA0F9346FF9D69 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
374   - DE92E07FF56795D096246F9059B540CA /* DataTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataTransform.swift; path = Source/DataTransform.swift; sourceTree = "<group>"; };
375   - DF68D7CB4183F99C38744F4985CD422D /* SDWebImageDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDecoder.m; path = SDWebImage/SDWebImageDecoder.m; sourceTree = "<group>"; };
376   - DF826B20D920C607DF652F2F3EA4C2F8 /* UMCommon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMCommon.framework; sourceTree = "<group>"; };
377   - E058896CA0DFFEF3CCEFAD6FEBA0DB11 /* UTDID.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UTDID.framework; path = thirdparties/UTDID.framework; sourceTree = "<group>"; };
  397 + BE69851A50C89CE0E218AE8504C1188B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  398 + BFC1E0E16DEFECC3E2FE92A428C9920D /* HexColorTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HexColorTransform.swift; path = Source/HexColorTransform.swift; sourceTree = "<group>"; };
  399 + C29AD1BD351F370FBE921BBE6756CEC9 /* NominalType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NominalType.swift; path = Source/NominalType.swift; sourceTree = "<group>"; };
  400 + C2DEDD1DC5D26933057AC26E39F2EBD3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  401 + C6D4C38A8515FAAD57E78A742F0EB73A /* HandyJSON.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = HandyJSON.xcconfig; sourceTree = "<group>"; };
  402 + C746EF0B8C90559C66A538F15D8EBAAF /* SVProgressHUD.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.xcconfig; sourceTree = "<group>"; };
  403 + C7C6E9C97726F9691282BA5009E78833 /* libevent.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libevent.a; path = NIMSDK/Libs/libevent.a; sourceTree = "<group>"; };
  404 + C7C98E50FC5D694C89DBEE8A1486D900 /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = "<group>"; };
  405 + CAE58263CB0A52CDB5D3790DC6D0D74F /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = "<group>"; };
  406 + CBB0446840A0CDD4BB7D69692D07CC21 /* SVRadialGradientLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVRadialGradientLayer.m; path = SVProgressHUD/SVRadialGradientLayer.m; sourceTree = "<group>"; };
  407 + CC28263CA0EDAEA1CBC1173B87FEA769 /* Request+AlamofireImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Request+AlamofireImage.swift"; path = "Source/Request+AlamofireImage.swift"; sourceTree = "<group>"; };
  408 + CD28D005A100BC203777597B48B8AD06 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = "<group>"; };
  409 + CECDC33DC6A3E686FD21577C5B23C258 /* DZNEmptyDataSet-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DZNEmptyDataSet-umbrella.h"; sourceTree = "<group>"; };
  410 + D43927282F3DD1C78741ABFCC5E0C768 /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = "<group>"; };
  411 + D4D00913B407B6DB96C7E7B48C21D904 /* UIImageView+AlamofireImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImageView+AlamofireImage.swift"; path = "Source/UIImageView+AlamofireImage.swift"; sourceTree = "<group>"; };
  412 + D79CBFE6F9821431996C8160F19D90C6 /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Alamofire.modulemap; sourceTree = "<group>"; };
  413 + D82D7054D7F1E7FE0ACBE043A3FA7F50 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = "<group>"; };
  414 + D8A2F9829AECA7F54C384A6E17AB7124 /* SwiftHash-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftHash-prefix.pch"; sourceTree = "<group>"; };
  415 + D9320E1CCD06A69A623CACF8D469F5FD /* SDWebImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.xcconfig; sourceTree = "<group>"; };
  416 + D96BCA19B9F922B2258E4C0D40666B58 /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = "<group>"; };
  417 + DBA6EC35D53897ED2A96FEDE1BB384BA /* SVProgressAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressAnimatedView.h; path = SVProgressHUD/SVProgressAnimatedView.h; sourceTree = "<group>"; };
  418 + DD324E3E21CD21F91211149384F64690 /* UIScrollView+EmptyDataSet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+EmptyDataSet.h"; path = "Source/UIScrollView+EmptyDataSet.h"; sourceTree = "<group>"; };
  419 + DF39B11A9C408A7CFA8E347E7F717E80 /* AnyExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyExtensions.swift; path = Source/AnyExtensions.swift; sourceTree = "<group>"; };
  420 + DF7918BBC8A10388FDE15B624F66A8E9 /* SwiftHash-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SwiftHash-dummy.m"; sourceTree = "<group>"; };
  421 + DFFC9D8585FF5A3FC4C7FD63A93DCE16 /* Deserializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deserializer.swift; path = Source/Deserializer.swift; sourceTree = "<group>"; };
  422 + E1300F08331C16959F41C2533B209EF5 /* Export.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Export.swift; path = Source/Export.swift; sourceTree = "<group>"; };
378 423 E1CD65D31F6DC7B830E7132E6B396C30 /* Pods-ParentAssistant-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ParentAssistant-acknowledgements.plist"; sourceTree = "<group>"; };
379   - E3370B03674C70DABFF75D9D2BA95DCE /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = "<group>"; };
380   - E33C2A8A35CA23130F27CFEC0285B7DB /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = "<group>"; };
381   - E4E76CB8696BAB20A617484E4726713B /* Transformable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Transformable.swift; path = Source/Transformable.swift; sourceTree = "<group>"; };
382   - E533F265C56324D6F57EB232221F586A /* UIView+Toast.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+Toast.m"; path = "Toast/Toast/UIView+Toast.m"; sourceTree = "<group>"; };
383   - E786E1AEE51D914333543AC4DEF9B3FB /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = "<group>"; };
384   - E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
385   - E9462CA128209C32EE6E6647C88609D1 /* OtherExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OtherExtension.swift; path = Source/OtherExtension.swift; sourceTree = "<group>"; };
386   - E95345A11FCCED373B3A5758A6073CDB /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = "<group>"; };
387   - E956F54FF76DE5D347505F3AF7694F03 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Alamofire.framework; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; };
388   - EA6D07581B965169F4C036A600CF86BB /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = "<group>"; };
389   - F33461E2C03CDF90E02052B76ADADB01 /* TransformType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformType.swift; path = Source/TransformType.swift; sourceTree = "<group>"; };
390   - F638493F2C879E2AF820AE53EA390269 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = "<group>"; };
391   - F6429920CDFD8D08A5A0566565673330 /* DispatchQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Alamofire.swift"; path = "Source/DispatchQueue+Alamofire.swift"; sourceTree = "<group>"; };
  424 + E215EB7C10CD4B2F724959DB344FE5C0 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = "<group>"; };
  425 + E2607500177BC99C04478DAB57D80EB7 /* SecurityEnvSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SecurityEnvSDK.framework; path = thirdparties/SecurityEnvSDK.framework; sourceTree = "<group>"; };
  426 + E4D61E78309E6543D6EBC75BE2967417 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = "<group>"; };
  427 + E651A4469FA2206746488B70290D48C0 /* SHA1.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SHA1.swift; path = Sources/SHA1.swift; sourceTree = "<group>"; };
  428 + E74F653E7072F40DB006FC90854FC840 /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = "<group>"; };
  429 + E7701D17547204EF54A538449343E8A4 /* ExtendCustomBasicType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExtendCustomBasicType.swift; path = Source/ExtendCustomBasicType.swift; sourceTree = "<group>"; };
  430 + EADCBFE671FB00B5F5FDBD2B3F6EC3CD /* UMAnalytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMAnalytics.framework; sourceTree = "<group>"; };
  431 + EC105ECBFE938402821EF19D7C5DA1DA /* DZNEmptyDataSet-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "DZNEmptyDataSet-dummy.m"; sourceTree = "<group>"; };
  432 + EC1BF45D7C52BC6493B283DDB371395F /* TransformOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformOf.swift; path = Source/TransformOf.swift; sourceTree = "<group>"; };
  433 + ECC6F721935680D316DC183994F4F569 /* Properties.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Properties.swift; path = Source/Properties.swift; sourceTree = "<group>"; };
  434 + ED4D8AA9257567AC16CB397E7E8BF346 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = "<group>"; };
  435 + EEE063E46D8691853E8CDB3C33506BF8 /* UTDID.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UTDID.framework; path = thirdparties/UTDID.framework; sourceTree = "<group>"; };
  436 + EF0B6E4594449A55A06C44CB6D1223F0 /* Reachability.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = "<group>"; };
  437 + EFA9DF74078A51C9573DF6952A753D1C /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = "<group>"; };
  438 + F1187580C59983EBFA6A55260AF21079 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = "<group>"; };
  439 + F1CF04B231D1BFC627F83398DFB40BBE /* HandyJSON-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "HandyJSON-prefix.pch"; sourceTree = "<group>"; };
  440 + F3CF9F638E5784E56583202BEBE63239 /* SDWebImageDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDecoder.h; path = SDWebImage/SDWebImageDecoder.h; sourceTree = "<group>"; };
392 441 F6BAADF2798AA6F62DA82FAA92DECB07 /* Pods-ParentAssistant-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ParentAssistant-dummy.m"; sourceTree = "<group>"; };
393   - F6C063D5E492D3ED69858D446C30719E /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = "<group>"; };
394   - F948022D8D1EFEF734A07E6ED4D6CAF9 /* BuiltInBasicType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BuiltInBasicType.swift; path = Source/BuiltInBasicType.swift; sourceTree = "<group>"; };
395   - FBC74E5E6FF8BCD3F240C1F0C8B9B427 /* DZNEmptyDataSet.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = DZNEmptyDataSet.modulemap; sourceTree = "<group>"; };
396   - FC9D90B14CC51CAAC698C0623AB16C70 /* SecurityEnvSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SecurityEnvSDK.framework; path = thirdparties/SecurityEnvSDK.framework; sourceTree = "<group>"; };
397   - FD2B11D4DCD30BDBA06841569E01E1BD /* HandyJSON-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "HandyJSON-dummy.m"; sourceTree = "<group>"; };
398   - FF65E4A0D399571B01517891F0309004 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = "<group>"; };
399   - FF928773E158E70CF5C2B45EA69A4223 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
400   - FFCF8A6062658FA349B617C0D75723C2 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = "<group>"; };
401   - FFEBBEC7D2ED4C631DFB3CBB04E6F926 /* XRPlaceholder.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = XRPlaceholder.png; path = XRCarouselView/XRPlaceholder.png; sourceTree = "<group>"; };
  442 + F775144A6F17788F065E01BFD8DC2D5C /* Reachability.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Reachability.m; sourceTree = "<group>"; };
  443 + F81C313FED69F64F2F4F403B4C4EC3F6 /* SVProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressHUD.h; path = SVProgressHUD/SVProgressHUD.h; sourceTree = "<group>"; };
  444 + FDA2AA9043380263CFFD99AE883B70ED /* ImageDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDownloader.swift; path = Source/ImageDownloader.swift; sourceTree = "<group>"; };
  445 + FEA8115215CE30840A6225F435645485 /* ImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageCache.swift; path = Source/ImageCache.swift; sourceTree = "<group>"; };
402 446 /* End PBXFileReference section */
403 447  
404 448 /* Begin PBXFrameworksBuildPhase section */
405   - 158EE653FB0E0E7AF979010BC3A73E13 /* Frameworks */ = {
  449 + 12D9BD764C2F5E43285530C00A583D52 /* Frameworks */ = {
406 450 isa = PBXFrameworksBuildPhase;
407 451 buildActionMask = 2147483647;
408 452 files = (
409   - 952429322A476D5508670C477DE23669 /* Foundation.framework in Frameworks */,
  453 + ED693ED034E99CACC204CFDFCE742485 /* Foundation.framework in Frameworks */,
  454 + E83FA4C154706E4EEAD3DE51B86C5BAB /* ImageIO.framework in Frameworks */,
410 455 );
411 456 runOnlyForDeploymentPostprocessing = 0;
412 457 };
413   - 25507DD6D7F1D774CD72F194200A6D77 /* Frameworks */ = {
  458 + 1EA38DA40C4FF7316B10B0C373342222 /* Frameworks */ = {
414 459 isa = PBXFrameworksBuildPhase;
415 460 buildActionMask = 2147483647;
416 461 files = (
417   - 23C92743D0D2154080836B58896172C9 /* Foundation.framework in Frameworks */,
  462 + DC896F68B018619A895D3BE4C70D0E4D /* Foundation.framework in Frameworks */,
  463 + FB9814E780909550F494F507BEB3B6B5 /* QuartzCore.framework in Frameworks */,
418 464 );
419 465 runOnlyForDeploymentPostprocessing = 0;
420 466 };
421   - 2FCA03AB4708FF069C969DAC4ED689A3 /* Frameworks */ = {
  467 + 223B4FF7CBCA930946A68B4E3FF7DEB6 /* Frameworks */ = {
422 468 isa = PBXFrameworksBuildPhase;
423 469 buildActionMask = 2147483647;
424 470 files = (
425   - 01866720BD41E2820300D8B9284FC061 /* Foundation.framework in Frameworks */,
  471 + 385BDDC55889104E43C83664FD4C2BD3 /* Foundation.framework in Frameworks */,
  472 + F323261D44C70B6D6C4127E85BA62E2E /* QuartzCore.framework in Frameworks */,
426 473 );
427 474 runOnlyForDeploymentPostprocessing = 0;
428 475 };
429   - 46A2C828E74BB80E0DE22F9A57D702B2 /* Frameworks */ = {
  476 + 25507DD6D7F1D774CD72F194200A6D77 /* Frameworks */ = {
  477 + isa = PBXFrameworksBuildPhase;
  478 + buildActionMask = 2147483647;
  479 + files = (
  480 + 23C92743D0D2154080836B58896172C9 /* Foundation.framework in Frameworks */,
  481 + );
  482 + runOnlyForDeploymentPostprocessing = 0;
  483 + };
  484 + 56B1A45788A7E3C5C89C92256F33AE24 /* Frameworks */ = {
430 485 isa = PBXFrameworksBuildPhase;
431 486 buildActionMask = 2147483647;
432 487 files = (
433   - C98D39690CC370401444D498206BCA2B /* Foundation.framework in Frameworks */,
434   - 1A3841F2F008E6FEBA8B10F04DE5AD15 /* QuartzCore.framework in Frameworks */,
  488 + EC5530E67F5D0CEEB72B1E36367AF20E /* Foundation.framework in Frameworks */,
  489 + 90E5A049B2FE3D38A1EA782CBB763739 /* SystemConfiguration.framework in Frameworks */,
435 490 );
436 491 runOnlyForDeploymentPostprocessing = 0;
437 492 };
... ... @@ -444,486 +499,492 @@
444 499 );
445 500 runOnlyForDeploymentPostprocessing = 0;
446 501 };
447   - 99195E4207764744AEC07ECCBCD550EB /* Frameworks */ = {
  502 + 62158AC2B12F4A1FA191B1DD22989FE1 /* Frameworks */ = {
448 503 isa = PBXFrameworksBuildPhase;
449 504 buildActionMask = 2147483647;
450 505 files = (
451   - 73B9C996AED49ED7CF8EC2A6F1738059 /* Foundation.framework in Frameworks */,
  506 + F89476E482F3768E646BBBF8CD21E6EF /* Foundation.framework in Frameworks */,
452 507 );
453 508 runOnlyForDeploymentPostprocessing = 0;
454 509 };
455   - A115DC87278A31F6B371DA2C1AF9CD02 /* Frameworks */ = {
  510 + 6FA848EABA8BCB08AFA8A7CBA0F79DA3 /* Frameworks */ = {
456 511 isa = PBXFrameworksBuildPhase;
457 512 buildActionMask = 2147483647;
458 513 files = (
459   - 7CE1363BFF8D96DD8059E0B5481A8D00 /* Foundation.framework in Frameworks */,
460   - 121B576C5153736760EDBD385DCE1A82 /* QuartzCore.framework in Frameworks */,
  514 + 0D0F6E0ECE5915267F0EA404BDCD4BAC /* Foundation.framework in Frameworks */,
461 515 );
462 516 runOnlyForDeploymentPostprocessing = 0;
463 517 };
464   - D871485AC7FB55A15B0AC2046B09D62B /* Frameworks */ = {
  518 + 99195E4207764744AEC07ECCBCD550EB /* Frameworks */ = {
465 519 isa = PBXFrameworksBuildPhase;
466 520 buildActionMask = 2147483647;
467 521 files = (
468   - 502127E1D7BF9D8D8FA29AD2F7EF420E /* Foundation.framework in Frameworks */,
  522 + 73B9C996AED49ED7CF8EC2A6F1738059 /* Foundation.framework in Frameworks */,
469 523 );
470 524 runOnlyForDeploymentPostprocessing = 0;
471 525 };
472   - E44680339038F2F0730AF783DAEFFCB6 /* Frameworks */ = {
  526 + BF98FBBDC964E0CC738F6B323B4C1BB8 /* Frameworks */ = {
473 527 isa = PBXFrameworksBuildPhase;
474 528 buildActionMask = 2147483647;
475 529 files = (
476   - 6BE097BD2C38D14E51B20BCEB5C6F495 /* Foundation.framework in Frameworks */,
477   - B35D34D1C1A4B0A5FAD90526DE5D88A4 /* ImageIO.framework in Frameworks */,
  530 + 613167D898FF421A6F75D1FE5D145B9B /* Alamofire.framework in Frameworks */,
  531 + 26479B07464784F3BF8C0853CA049976 /* Foundation.framework in Frameworks */,
478 532 );
479 533 runOnlyForDeploymentPostprocessing = 0;
480 534 };
481   - EBA80D6B1394A46D45B033AB75657E91 /* Frameworks */ = {
  535 + CC88855CE2CDECCE28DB46B1FDBF88B7 /* Frameworks */ = {
482 536 isa = PBXFrameworksBuildPhase;
483 537 buildActionMask = 2147483647;
484 538 files = (
485   - 9F24B341383F0FF8EA368B3A7F9BC087 /* Foundation.framework in Frameworks */,
486   - EC3CC4DC8A5C9241AE7D9359EEAFC69F /* SystemConfiguration.framework in Frameworks */,
  539 + 57B5D779BAB2A1CF8C2D4CF8F14066A0 /* Foundation.framework in Frameworks */,
487 540 );
488 541 runOnlyForDeploymentPostprocessing = 0;
489 542 };
490 543 /* End PBXFrameworksBuildPhase section */
491 544  
492 545 /* Begin PBXGroup section */
493   - 001E2CA6EA468C671F75E62723E01ABD /* Support Files */ = {
  546 + 0310C750335673BB116A6C5FAFEEFE49 /* Support Files */ = {
494 547 isa = PBXGroup;
495 548 children = (
496   - FBC74E5E6FF8BCD3F240C1F0C8B9B427 /* DZNEmptyDataSet.modulemap */,
497   - 328C2C3F0CBE7948196AEE1B0FA7B3F4 /* DZNEmptyDataSet.xcconfig */,
498   - 5F6392C48C4C9A3D7130A57D84AFEE2B /* DZNEmptyDataSet-dummy.m */,
499   - 87691736C308811895AF6EB052ECD8BE /* DZNEmptyDataSet-prefix.pch */,
500   - 73AD0FFA16B2C0B1B8A40B3A76629975 /* DZNEmptyDataSet-umbrella.h */,
501   - 02C19698DC383415660AD836A73862CF /* Info.plist */,
  549 + C2DEDD1DC5D26933057AC26E39F2EBD3 /* Info.plist */,
  550 + 70FB099686511A528F52E5AB1C4FDB4A /* Reachability.modulemap */,
  551 + 7ED5CEE60A46EFCFCE43D1A6C52D3869 /* Reachability.xcconfig */,
  552 + 17EFC56D8D5FA327B6DEB6D0ADC56C1C /* Reachability-dummy.m */,
  553 + 79BB6C2420E33F3EC3D693AD20145082 /* Reachability-prefix.pch */,
  554 + 078CF0A581F3816CBA8D7047271D2CE9 /* Reachability-umbrella.h */,
502 555 );
503 556 name = "Support Files";
504   - path = "../Target Support Files/DZNEmptyDataSet";
  557 + path = "../Target Support Files/Reachability";
505 558 sourceTree = "<group>";
506 559 };
507   - 035886489A99DD807583400603AB5019 /* Alamofire */ = {
  560 + 03D7A135F0C051D7B2ADB4B1311D2155 /* Support Files */ = {
508 561 isa = PBXGroup;
509 562 children = (
510   - 08E13F442024BE43D2F31AA6F2C300DA /* AFError.swift */,
511   - CEA07E2E477768269A8D0BECE492EBAF /* Alamofire.swift */,
512   - F6429920CDFD8D08A5A0566565673330 /* DispatchQueue+Alamofire.swift */,
513   - 99DF7E55400E9131640E0694D3C91764 /* MultipartFormData.swift */,
514   - BCCC1A6E4AF8DAF6E5609D65548B3C79 /* NetworkReachabilityManager.swift */,
515   - 2F2F35AD7354793D357E10226DE37995 /* Notifications.swift */,
516   - 14EC82B350F60C65CB156014F5997DCE /* ParameterEncoding.swift */,
517   - 232E0E55F341C5600028F7AAA4F59E8A /* Request.swift */,
518   - 8781B0306B0188AF528659F413E1B542 /* Response.swift */,
519   - 39F3B60B0A2AD7975DA5BCA943FA6BD5 /* ResponseSerialization.swift */,
520   - 92331AB0F30415BE666C619D1A45513E /* Result.swift */,
521   - 640ED88831DE9CA10759B8FC3751C531 /* ServerTrustPolicy.swift */,
522   - 2D3152CF39784BC2AAD4747AF03BB50A /* SessionDelegate.swift */,
523   - 5104B9F40B6C55F71BDE788F76AA8F53 /* SessionManager.swift */,
524   - BFD387D9E3BDF322939523D4DF31CA79 /* TaskDelegate.swift */,
525   - D9ED9DA2E61F2A4DD7E760C61C47A3F1 /* Timeline.swift */,
526   - E95345A11FCCED373B3A5758A6073CDB /* Validation.swift */,
527   - A87864D22DE2007F4600F7C0E566D95C /* Support Files */,
  563 + B03DB8D1B8FEFA6F91F509A16D6176F3 /* Info.plist */,
  564 + 0ABC8592074E5B83BDBF01388C67A8B7 /* SDWebImage.modulemap */,
  565 + D9320E1CCD06A69A623CACF8D469F5FD /* SDWebImage.xcconfig */,
  566 + F1187580C59983EBFA6A55260AF21079 /* SDWebImage-dummy.m */,
  567 + 676E6BA89EE0D10BE38626EE3E3B8A9F /* SDWebImage-prefix.pch */,
  568 + B82FE543DC2AE8EF3A0F380DE2B5988A /* SDWebImage-umbrella.h */,
528 569 );
529   - name = Alamofire;
530   - path = Alamofire;
  570 + name = "Support Files";
  571 + path = "../Target Support Files/SDWebImage";
531 572 sourceTree = "<group>";
532 573 };
533   - 0AFF261FC6409676B5FE2EA67480CAE4 /* UMCSecurityPlugins */ = {
  574 + 0BD61037A6B393F3F3CECE029889F374 /* Resources */ = {
534 575 isa = PBXGroup;
535 576 children = (
536   - 8FC2DD334C1E70C1C4C5C8F0FA196151 /* Frameworks */,
  577 + 729A72124A700ED6D7D56FE6E3316184 /* SVProgressHUD.bundle */,
537 578 );
538   - name = UMCSecurityPlugins;
539   - path = UMCSecurityPlugins;
  579 + name = Resources;
540 580 sourceTree = "<group>";
541 581 };
542   - 197A90DE72E89B51A1E8F89461EABB00 /* Frameworks */ = {
  582 + 0D5414319A3865994CB656BBA34C49BD /* HandyJSON */ = {
543 583 isa = PBXGroup;
544 584 children = (
545   - 5DCF2929ACA53CE3D9FD6342DF5F8D9D /* libaacplus.a */,
546   - 03475756EB49A978A9F331D44971B60B /* libcrypto.a */,
547   - A48FF17CB17A07E2B4AEC609B9947C52 /* libevent.a */,
548   - B4C40BE5E03351505F3B0830F40CFA9E /* libssl.a */,
549   - CF9CDCEBD5D016D3F349D31FFDAEA20A /* NIMSDK.framework */,
  585 + DF39B11A9C408A7CFA8E347E7F717E80 /* AnyExtensions.swift */,
  586 + 68ECD5E13EA08D669EEBD74218B18FA5 /* BuiltInBasicType.swift */,
  587 + 916CF2DD179C34072F0CED7EA7E172C4 /* BuiltInBridgeType.swift */,
  588 + B19A6339BCDC426144D4987C81596418 /* Configuration.swift */,
  589 + 98932AABF2712E9978244730956580D5 /* CustomDateFormatTransform.swift */,
  590 + A6614C2951E5A4AB6D1DF2B076BF1A5C /* DataTransform.swift */,
  591 + 2D7A5D10D9FFDD32C4D3CF85DDCFC707 /* DateFormatterTransform.swift */,
  592 + 10D6F8B588CB7C3C02CD426DADF34CE4 /* DateTransform.swift */,
  593 + DFFC9D8585FF5A3FC4C7FD63A93DCE16 /* Deserializer.swift */,
  594 + 2BC1B5A06113F348365D3564FD6425C6 /* EnumTransform.swift */,
  595 + 6CC52F25BF175D139AA0E5C94DC363A9 /* EnumType.swift */,
  596 + E1300F08331C16959F41C2533B209EF5 /* Export.swift */,
  597 + E7701D17547204EF54A538449343E8A4 /* ExtendCustomBasicType.swift */,
  598 + 68D3997593CBB0B018C81C73E8337C2C /* ExtendCustomModelType.swift */,
  599 + 92B55B2A9C151490137F69027B7F531E /* HandyJSON.h */,
  600 + 05B1F80DC3C02C2AD29D4C6CEA059CCD /* HelpingMapper.swift */,
  601 + BFC1E0E16DEFECC3E2FE92A428C9920D /* HexColorTransform.swift */,
  602 + 7379E87D9FF2E196ADB91DC8A0A5F2F3 /* ISO8601DateTransform.swift */,
  603 + 14E325E19530D7ADA41064D345141437 /* Logger.swift */,
  604 + 07BCC67F387326CAFCE34AF5FD2DBDE2 /* Measuable.swift */,
  605 + 00395AB0A6A459E12899B1CC7AA3C954 /* Metadata.swift */,
  606 + C29AD1BD351F370FBE921BBE6756CEC9 /* NominalType.swift */,
  607 + 467C66A8C88F09EF9D0129564F08540C /* NSDecimalNumberTransform.swift */,
  608 + 4457386C2A87F3E11630992C9CAA7836 /* OtherExtension.swift */,
  609 + ABE9E390C3EADB423277CE1E912E10AA /* PointerType.swift */,
  610 + ECC6F721935680D316DC183994F4F569 /* Properties.swift */,
  611 + 9CA29ADD75C3FE58A4ED07E10D427C9F /* PropertyInfo.swift */,
  612 + 35322B49B5EBE0CF14B7BC8677497347 /* ReflectionHelper.swift */,
  613 + AF0EB1CAE5B795EB85A1165F6D98C372 /* Serializer.swift */,
  614 + 1ABA7E2E494925BF34BC9885BE24E31C /* Transformable.swift */,
  615 + EC1BF45D7C52BC6493B283DDB371395F /* TransformOf.swift */,
  616 + 8F75E090F317987C0134B9DD1E5963C9 /* TransformType.swift */,
  617 + 9B31E52FEB6E5A6A955D4050CB76B18C /* URLTransform.swift */,
  618 + 8F43C2634E0BE8006FDE8986D81A795E /* Support Files */,
550 619 );
551   - name = Frameworks;
  620 + name = HandyJSON;
  621 + path = HandyJSON;
552 622 sourceTree = "<group>";
553 623 };
554   - 20B56609144CE204DFA8221F742B2D76 /* Frameworks */ = {
  624 + 14FDC70D8950849FB1C0282A12C38C4E /* Frameworks */ = {
555 625 isa = PBXGroup;
556 626 children = (
557   - 287B6E205C5204939598639BF0799466 /* iOS */,
  627 + 045B43DFAA088FDD2E5F7DE61A99D3EF /* UMCommon.framework */,
558 628 );
559 629 name = Frameworks;
560 630 sourceTree = "<group>";
561 631 };
562   - 2113AB85D8791161623936EC0882CA20 /* Support Files */ = {
  632 + 1F4DE6AE0412496E30F0F30AD61DD011 /* iOS */ = {
563 633 isa = PBXGroup;
564 634 children = (
565   - 8D2C5397761E61B24600821547A409CD /* Info.plist */,
566   - DBE314BE44865438F00A5054E414EF77 /* Toast.modulemap */,
567   - 3813A00560E8E809CF107BA098D6A666 /* Toast.xcconfig */,
568   - 85EBECC44FA24EC40748D3CB399DD1F3 /* Toast-dummy.m */,
569   - 52F1099514615B3BA1CA982ECF578DDF /* Toast-prefix.pch */,
570   - 835B1DEC82F034C2C12DC0723F18F6E9 /* Toast-umbrella.h */,
571   - );
572   - name = "Support Files";
573   - path = "../Target Support Files/Toast";
574   - sourceTree = "<group>";
575   - };
576   - 287B6E205C5204939598639BF0799466 /* iOS */ = {
577   - isa = PBXGroup;
578   - children = (
579   - E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */,
580   - 59271332AFD884264C5B45B6B6152051 /* ImageIO.framework */,
581   - 4DB0A7F29D540AB077DA6D9855C3F743 /* QuartzCore.framework */,
582   - 93ED65B5F47F5FEA00C9BC9D151B1D26 /* SystemConfiguration.framework */,
583   - B9B732FC24A0EC5E46E41D939F4A1130 /* UIKit.framework */,
  635 + 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */,
  636 + B77DE72B7ED4AED0DBED016D1274EFE8 /* ImageIO.framework */,
  637 + 94B64C32F67C820564A1C07F82FB412C /* QuartzCore.framework */,
  638 + 01529461C8BC5BFBF1FAD1AE7D691496 /* SystemConfiguration.framework */,
  639 + BAE5BE9DB67074649A1927384361E0A8 /* UIKit.framework */,
584 640 );
585 641 name = iOS;
586 642 sourceTree = "<group>";
587 643 };
588   - 2A1708CE4EC9BA0CA7B5865FF66228B4 /* Support Files */ = {
  644 + 2021A6AEED487F441EF547B9DCEFF3E6 /* Support Files */ = {
589 645 isa = PBXGroup;
590 646 children = (
591   - 0CDCA399D86C4D9BFD1AAA60E4F5A9F5 /* HandyJSON.modulemap */,
592   - 6F37849A9F05E24161217B664F776F12 /* HandyJSON.xcconfig */,
593   - FD2B11D4DCD30BDBA06841569E01E1BD /* HandyJSON-dummy.m */,
594   - 297F8CEFA42DFD823263EA02BC36D29A /* HandyJSON-prefix.pch */,
595   - 11DABA5B57A3076260D36D4A9AE646F5 /* HandyJSON-umbrella.h */,
596   - 2098C9BB32F72BB65BA83ADD1F338099 /* Info.plist */,
  647 + 60528D650715D578BD996859FC810107 /* Info.plist */,
  648 + BB6422771B215BFE2B4A9C0D9C9BC82B /* SVProgressHUD.modulemap */,
  649 + C746EF0B8C90559C66A538F15D8EBAAF /* SVProgressHUD.xcconfig */,
  650 + A23A7E20FB52B9BFC4899C0FEBA2C6CE /* SVProgressHUD-dummy.m */,
  651 + 0F4FDE3A8C9BEA27417C27172F5BC2A5 /* SVProgressHUD-prefix.pch */,
  652 + 06E0F3A00F6C087D410087D3FE65529D /* SVProgressHUD-umbrella.h */,
597 653 );
598 654 name = "Support Files";
599   - path = "../Target Support Files/HandyJSON";
600   - sourceTree = "<group>";
601   - };
602   - 309ACF9CB8917F8180F0C78892CC4962 /* Targets Support Files */ = {
603   - isa = PBXGroup;
604   - children = (
605   - BE317C13F71B97F884FEF35459393B25 /* Pods-ParentAssistant */,
606   - );
607   - name = "Targets Support Files";
  655 + path = "../Target Support Files/SVProgressHUD";
608 656 sourceTree = "<group>";
609 657 };
610   - 330169F0E739AF701BDEBB5894F8434A /* SDWebImage */ = {
  658 + 2409C0E750E5175AA19E7BA4DA2A475D /* Frameworks */ = {
611 659 isa = PBXGroup;
612 660 children = (
613   - 5E15FAEE84F8B146F03BE7AFBAC36661 /* Core */,
614   - 630CEDD835E65E88DC71885CD9EF4E92 /* Support Files */,
  661 + 79353402DE45C743DE8658FE2C413D90 /* libaacplus.a */,
  662 + B4FE0743D323412387DC64C29B1AE5F7 /* libcrypto.a */,
  663 + C7C6E9C97726F9691282BA5009E78833 /* libevent.a */,
  664 + 605BF197AFCD5A69E3A6A700329C2FCA /* libssl.a */,
  665 + 93831DF9B9AE2775CB38F92DAD62BF35 /* NIMSDK.framework */,
615 666 );
616   - name = SDWebImage;
617   - path = SDWebImage;
  667 + name = Frameworks;
618 668 sourceTree = "<group>";
619 669 };
620   - 37C774715FC3CB332E3DBBFF760D1DA7 /* DZNEmptyDataSet */ = {
  670 + 301A38DCCF06B3AC4AF5322410158E12 /* XRCarouselView */ = {
621 671 isa = PBXGroup;
622 672 children = (
623   - 41531DBB287870602D671C4D97E99B21 /* UIScrollView+EmptyDataSet.h */,
624   - 18F6A571F05F4D0DD12870CE83C8F787 /* UIScrollView+EmptyDataSet.m */,
625   - 001E2CA6EA468C671F75E62723E01ABD /* Support Files */,
  673 + AA29655EDD56783CB2C21A411019B7BA /* XRCarouselView.h */,
  674 + 89457F43B7DE2154380C8DD976759AA2 /* XRCarouselView.m */,
  675 + 796662A504D2560DE6FA8F82F7CCA93C /* Resources */,
  676 + 96AED64B9563F84118E7D6B1CF316040 /* Support Files */,
626 677 );
627   - name = DZNEmptyDataSet;
628   - path = DZNEmptyDataSet;
  678 + name = XRCarouselView;
  679 + path = XRCarouselView;
629 680 sourceTree = "<group>";
630 681 };
631   - 3860473AD1F18D1A7419BE2875F3630F /* Frameworks */ = {
  682 + 309ACF9CB8917F8180F0C78892CC4962 /* Targets Support Files */ = {
632 683 isa = PBXGroup;
633 684 children = (
634   - BE846687076AD4570ACE89EC260747A1 /* UMErrorCatch.framework */,
  685 + BE317C13F71B97F884FEF35459393B25 /* Pods-ParentAssistant */,
635 686 );
636   - name = Frameworks;
  687 + name = "Targets Support Files";
637 688 sourceTree = "<group>";
638 689 };
639   - 38EFF4314C3C2EB48B86E623B8035A4B /* UMCAnalytics */ = {
  690 + 3A24F7BBB5CB0025CF2072B4FB964C24 /* Products */ = {
640 691 isa = PBXGroup;
641 692 children = (
642   - 58FD8FF25B60AC3F652B1FDCA8518B99 /* Frameworks */,
  693 + 937EE30FD85AB8EED4F8467502DD290F /* Alamofire.framework */,
  694 + B9806961B1DB01F087677787DFCC6CE0 /* AlamofireImage.framework */,
  695 + 7C9D89FB057D8F2ECBB232C7A81EF4B5 /* DZNEmptyDataSet.framework */,
  696 + 110D34637F4EF19C8F46B101A1509ABE /* HandyJSON.framework */,
  697 + 72C584102060EC4C983B4B76AB4B8C8F /* Pods_ParentAssistant.framework */,
  698 + 95CAD531E474553E7D52B95131219D1A /* Reachability.framework */,
  699 + 8E2EC639DC31085C2078E4638A61266B /* SDWebImage.framework */,
  700 + 344E5051853CBAE87166BAA69476DDB1 /* SVProgressHUD.framework */,
  701 + 52303324A62AD0B74F2DD46E74D232EB /* SwiftHash.framework */,
  702 + 507695995D3D9F4276EAFC4603ABFF54 /* Toast.framework */,
  703 + 444E77BBBDD4B2AB34C6742B6752BBCB /* XRCarouselView.framework */,
643 704 );
644   - name = UMCAnalytics;
645   - path = UMCAnalytics;
  705 + name = Products;
646 706 sourceTree = "<group>";
647 707 };
648   - 3C7A5A0E8FB6FB9142B786013E33F9B1 /* NIMSDK_LITE */ = {
  708 + 3FF4649D5096372902422FFDFDD8E56D /* SwiftHash */ = {
649 709 isa = PBXGroup;
650 710 children = (
651   - 197A90DE72E89B51A1E8F89461EABB00 /* Frameworks */,
  711 + 8249AA0D5DBC641B891AE927074850B2 /* MD5.swift */,
  712 + E651A4469FA2206746488B70290D48C0 /* SHA1.swift */,
  713 + B6C77C2D1243C37F15069EBD4B8827B8 /* Support Files */,
652 714 );
653   - name = NIMSDK_LITE;
654   - path = NIMSDK_LITE;
  715 + name = SwiftHash;
  716 + path = SwiftHash;
655 717 sourceTree = "<group>";
656 718 };
657   - 3FF5DEC88DC62971403983A6F02247FE /* Toast */ = {
  719 + 43383F8D50059A08F0FE7124DFF675F1 /* Core */ = {
658 720 isa = PBXGroup;
659 721 children = (
660   - 19FAAAAFAF3A705D1081BDCDC14CAFD6 /* UIView+Toast.h */,
661   - E533F265C56324D6F57EB232221F586A /* UIView+Toast.m */,
662   - 2113AB85D8791161623936EC0882CA20 /* Support Files */,
  722 + 1A53991A7FAF70CDAC1F059FB04F5543 /* NSData+ImageContentType.h */,
  723 + 229808FB79115B70777D682D8335C18E /* NSData+ImageContentType.m */,
  724 + A2BD80EBA9375936EAA1AE0D930C61EC /* SDImageCache.h */,
  725 + 155F8627DF2C4A4A091DD4AF34FFEF02 /* SDImageCache.m */,
  726 + 61D09F1E0C8F29641858460B3928A5B0 /* SDWebImageCompat.h */,
  727 + 920C3AE864C4E24091B77772A498A58C /* SDWebImageCompat.m */,
  728 + F3CF9F638E5784E56583202BEBE63239 /* SDWebImageDecoder.h */,
  729 + 6B05BD93D4EE278B866CC9AAF18763DB /* SDWebImageDecoder.m */,
  730 + 9D9602FA58305177F98B7472A155DE66 /* SDWebImageDownloader.h */,
  731 + 4BBA6274610821F15000C6CC777D555B /* SDWebImageDownloader.m */,
  732 + 852A7B853425A17ACDE963BB0C57B689 /* SDWebImageDownloaderOperation.h */,
  733 + 358430CDB8CA6FB92C74E9FC7F6EB159 /* SDWebImageDownloaderOperation.m */,
  734 + D43927282F3DD1C78741ABFCC5E0C768 /* SDWebImageManager.h */,
  735 + 02DAB9B7A1A3D2199EFC7FC7FC69ED85 /* SDWebImageManager.m */,
  736 + ED4D8AA9257567AC16CB397E7E8BF346 /* SDWebImageOperation.h */,
  737 + 61CAF6761E3C21827415A9DA38D18547 /* SDWebImagePrefetcher.h */,
  738 + 6DA08525DC2775B611071866CF38CC96 /* SDWebImagePrefetcher.m */,
  739 + D96BCA19B9F922B2258E4C0D40666B58 /* UIButton+WebCache.h */,
  740 + 8BFF20BC7E4F55C09BAC34A664D91FED /* UIButton+WebCache.m */,
  741 + 0DFCFB41829DC67B9036DEF9766C6C88 /* UIImage+GIF.h */,
  742 + 310743AC8DCCF3F81515515A6FC64B8A /* UIImage+GIF.m */,
  743 + 715810392F163BB36DFE8AC307460289 /* UIImage+MultiFormat.h */,
  744 + 4ED641951605DEB02B067F9D1915C5A9 /* UIImage+MultiFormat.m */,
  745 + 0B751448AE7B6607E97470BFD4082216 /* UIImageView+HighlightedWebCache.h */,
  746 + CD28D005A100BC203777597B48B8AD06 /* UIImageView+HighlightedWebCache.m */,
  747 + E4D61E78309E6543D6EBC75BE2967417 /* UIImageView+WebCache.h */,
  748 + 496A0D655D409BDF23A3826300EBCD1B /* UIImageView+WebCache.m */,
  749 + 98BA100696255C8CFD15860D64267467 /* UIView+WebCacheOperation.h */,
  750 + BC99BBF9B209FE42B0D74F5CFB60627F /* UIView+WebCacheOperation.m */,
663 751 );
664   - name = Toast;
665   - path = Toast;
  752 + name = Core;
666 753 sourceTree = "<group>";
667 754 };
668   - 4957D806F4D44D6387F398B8ECD395C9 /* Support Files */ = {
  755 + 56CCB4F4B6E9E8D3FDF3A892A90571F4 /* AlamofireImage */ = {
669 756 isa = PBXGroup;
670 757 children = (
671   - FF928773E158E70CF5C2B45EA69A4223 /* Info.plist */,
672   - 8CDA4E6BD46E857912EC5B5F99364A24 /* SwiftHash.modulemap */,
673   - BF1709B1277BE62B09381A0534563DE2 /* SwiftHash.xcconfig */,
674   - 448D149E9E2122E63C2D8CDB8E1159CB /* SwiftHash-dummy.m */,
675   - 5B56491AFD4EC6985EBCCEF221A0FCB8 /* SwiftHash-prefix.pch */,
676   - 9F2BF6E468482ED7EDAE9AFD6CA2C994 /* SwiftHash-umbrella.h */,
677   - );
678   - name = "Support Files";
679   - path = "../Target Support Files/SwiftHash";
  758 + AE04BA7BB2F95B59112DED31AECB069E /* AFIError.swift */,
  759 + AC0A874231DDAD102B02D7EFD048FDE2 /* Image.swift */,
  760 + FEA8115215CE30840A6225F435645485 /* ImageCache.swift */,
  761 + FDA2AA9043380263CFFD99AE883B70ED /* ImageDownloader.swift */,
  762 + A58625E1014C6D82D1825309986334E1 /* ImageFilter.swift */,
  763 + CC28263CA0EDAEA1CBC1173B87FEA769 /* Request+AlamofireImage.swift */,
  764 + 7C4ACCC8EE8E5E07D0CD171894588314 /* UIButton+AlamofireImage.swift */,
  765 + 2E3282E372FE0A6C0D2227384238F921 /* UIImage+AlamofireImage.swift */,
  766 + D4D00913B407B6DB96C7E7B48C21D904 /* UIImageView+AlamofireImage.swift */,
  767 + ED22116B8F3EBCF03BF952FD1412F8A7 /* Support Files */,
  768 + );
  769 + name = AlamofireImage;
  770 + path = AlamofireImage;
680 771 sourceTree = "<group>";
681 772 };
682   - 55375898F80E2F483F6A33CD3B40855D /* SwiftHash */ = {
  773 + 626BE02B583652D883A14A0561438CB2 /* Frameworks */ = {
683 774 isa = PBXGroup;
684 775 children = (
685   - 9AEE056145338863D7A727ACF1C3657C /* MD5.swift */,
686   - 9A4D6703A8771BB168130EFB6EAC1C3E /* SHA1.swift */,
687   - 4957D806F4D44D6387F398B8ECD395C9 /* Support Files */,
  776 + 3CD0FA7EE743F01B3A6385702606A408 /* Alamofire.framework */,
  777 + 1F4DE6AE0412496E30F0F30AD61DD011 /* iOS */,
688 778 );
689   - name = SwiftHash;
690   - path = SwiftHash;
  779 + name = Frameworks;
691 780 sourceTree = "<group>";
692 781 };
693   - 5763DABFBEC61EF21CE978F465358A89 /* SVProgressHUD */ = {
  782 + 67A94A45D2AA43B64721FE393BF0B924 /* Frameworks */ = {
694 783 isa = PBXGroup;
695 784 children = (
696   - 6768B1FE2E118D79D8A1613520B9BB23 /* SVIndefiniteAnimatedView.h */,
697   - 72803D16FA054A0D26C303991C1F2B3C /* SVIndefiniteAnimatedView.m */,
698   - B6554BE7D86E2DF12BC2CFA630452CA0 /* SVProgressAnimatedView.h */,
699   - 38EE23882943EDCED73523F643A71C39 /* SVProgressAnimatedView.m */,
700   - 17403F9FAA48DA29AAEB297BE9AC4D51 /* SVProgressHUD.h */,
701   - 1DC66067EC016B21D6BC487C409083AF /* SVProgressHUD.m */,
702   - 20C0A79CAF95E65B981CC5F896E4334C /* SVRadialGradientLayer.h */,
703   - AE8B2524C105710A1C75E5F3C734796F /* SVRadialGradientLayer.m */,
704   - 85CC9E6AC38974A790C417FCB9FD89FE /* Resources */,
705   - C78510EC4A1F228614ECFEB07DFC0275 /* Support Files */,
  785 + 057C8BFD76D95D8932478DFC5DA7DB3E /* UMErrorCatch.framework */,
706 786 );
707   - name = SVProgressHUD;
708   - path = SVProgressHUD;
  787 + name = Frameworks;
709 788 sourceTree = "<group>";
710 789 };
711   - 58FD8FF25B60AC3F652B1FDCA8518B99 /* Frameworks */ = {
  790 + 67B27D86547E925A9481C071E5DC217B /* UMCCommon */ = {
712 791 isa = PBXGroup;
713 792 children = (
714   - D124D84D327A6ADF3D01C95E84C09A31 /* UMAnalytics.framework */,
  793 + 14FDC70D8950849FB1C0282A12C38C4E /* Frameworks */,
715 794 );
716   - name = Frameworks;
  795 + name = UMCCommon;
  796 + path = UMCCommon;
717 797 sourceTree = "<group>";
718 798 };
719   - 59C2933D98416017CC5447DA025532B4 /* UMCErrorCatch */ = {
  799 + 75CE8CBE50D56BFC3821ECF0A886130F /* Support Files */ = {
720 800 isa = PBXGroup;
721 801 children = (
722   - 3860473AD1F18D1A7419BE2875F3630F /* Frameworks */,
  802 + D79CBFE6F9821431996C8160F19D90C6 /* Alamofire.modulemap */,
  803 + 950B05ADF5C9C81AF940E6DFFABE4DB9 /* Alamofire.xcconfig */,
  804 + 489ED6DFB42C7C8F6A4875005025A913 /* Alamofire-dummy.m */,
  805 + 156F9486C74F4094ACE7858B18E5C41D /* Alamofire-prefix.pch */,
  806 + 78F77FFCC80D398532E854672D527FD8 /* Alamofire-umbrella.h */,
  807 + 58B4CFDB50C6966BC7B9CB0CBD1C60E7 /* Info.plist */,
723 808 );
724   - name = UMCErrorCatch;
725   - path = UMCErrorCatch;
  809 + name = "Support Files";
  810 + path = "../Target Support Files/Alamofire";
726 811 sourceTree = "<group>";
727 812 };
728   - 5E15FAEE84F8B146F03BE7AFBAC36661 /* Core */ = {
  813 + 796662A504D2560DE6FA8F82F7CCA93C /* Resources */ = {
729 814 isa = PBXGroup;
730 815 children = (
731   - DB5FF7B561F6F548C82F1FC27FDD72E8 /* NSData+ImageContentType.h */,
732   - C203E9ABEF394B0009B142EEB9AA64FC /* NSData+ImageContentType.m */,
733   - 140A2830037A30E45442BA52CBDA1CFC /* SDImageCache.h */,
734   - 1439A3EA7193042844C3E9C52032677C /* SDImageCache.m */,
735   - 82C441F9B75595B2F266E6AC40AD7D85 /* SDWebImageCompat.h */,
736   - 2E90E960C03E09803780D5C47A55A4DB /* SDWebImageCompat.m */,
737   - 172419A08571955755C3C6FB2044DD9D /* SDWebImageDecoder.h */,
738   - DF68D7CB4183F99C38744F4985CD422D /* SDWebImageDecoder.m */,
739   - 9A559DCF61F2E184BC9318C05F05CFF3 /* SDWebImageDownloader.h */,
740   - 1983D355FD75B9D24A71756509C98131 /* SDWebImageDownloader.m */,
741   - 33347618F6541AA20F52632F9EA10CA6 /* SDWebImageDownloaderOperation.h */,
742   - 24C69C342339292A7BBB5C56D2C12D12 /* SDWebImageDownloaderOperation.m */,
743   - 8A51BA19C89D5E62EDCF2DB9D9FA43E0 /* SDWebImageManager.h */,
744   - FFCF8A6062658FA349B617C0D75723C2 /* SDWebImageManager.m */,
745   - B9A38D8C4EC4826AEDC2A52DD0187186 /* SDWebImageOperation.h */,
746   - E33C2A8A35CA23130F27CFEC0285B7DB /* SDWebImagePrefetcher.h */,
747   - 6850886B55CE3CD9B901B28690292C5C /* SDWebImagePrefetcher.m */,
748   - C03FC1A11EE20AB8B6A4B398E11B26B0 /* UIButton+WebCache.h */,
749   - BE70BDE392E6E92B76047D2DED4ED380 /* UIButton+WebCache.m */,
750   - E3370B03674C70DABFF75D9D2BA95DCE /* UIImage+GIF.h */,
751   - B71F8A62F3906657D17D418212E1CBA1 /* UIImage+GIF.m */,
752   - F6C063D5E492D3ED69858D446C30719E /* UIImage+MultiFormat.h */,
753   - 469D54339A6D448DF6D1166FDB669676 /* UIImage+MultiFormat.m */,
754   - 9011EFC1DA29BE6CA0831595062B82ED /* UIImageView+HighlightedWebCache.h */,
755   - BB7CE29DC4FFF250766240EA8DA973D1 /* UIImageView+HighlightedWebCache.m */,
756   - 206933D2687A3DC4CD2836F2AEF28A3B /* UIImageView+WebCache.h */,
757   - 6E2AA0C415512D5F3F34F7A99AA4D14A /* UIImageView+WebCache.m */,
758   - F638493F2C879E2AF820AE53EA390269 /* UIView+WebCacheOperation.h */,
759   - 1836357ECED17B3B0BF22256498AA8EE /* UIView+WebCacheOperation.m */,
  816 + B00FEDA7D2B852B770837D954A635F0B /* XRPlaceholder.png */,
760 817 );
761   - name = Core;
  818 + name = Resources;
762 819 sourceTree = "<group>";
763 820 };
764   - 630CEDD835E65E88DC71885CD9EF4E92 /* Support Files */ = {
  821 + 7B6FD119C5043EA8D24938E17F689C68 /* NIMSDK_LITE */ = {
765 822 isa = PBXGroup;
766 823 children = (
767   - 106A3E63162DD85E6D0BEC1EE1FFDBB4 /* Info.plist */,
768   - D912920D1BEEB7757AF4BE74E2EC8FA6 /* SDWebImage.modulemap */,
769   - AC7C53CF4231A641CE59A3CD5991C5C1 /* SDWebImage.xcconfig */,
770   - FF65E4A0D399571B01517891F0309004 /* SDWebImage-dummy.m */,
771   - 871C0D1C45FD62FE7B82D8E083C00466 /* SDWebImage-prefix.pch */,
772   - E786E1AEE51D914333543AC4DEF9B3FB /* SDWebImage-umbrella.h */,
  824 + 2409C0E750E5175AA19E7BA4DA2A475D /* Frameworks */,
773 825 );
774   - name = "Support Files";
775   - path = "../Target Support Files/SDWebImage";
  826 + name = NIMSDK_LITE;
  827 + path = NIMSDK_LITE;
776 828 sourceTree = "<group>";
777 829 };
778   - 68471EF420D9A2E724167C5491206AFB /* Resources */ = {
  830 + 7DB346D0F39D3F0E887471402A8071AB = {
779 831 isa = PBXGroup;
780 832 children = (
781   - FFEBBEC7D2ED4C631DFB3CBB04E6F926 /* XRPlaceholder.png */,
  833 + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */,
  834 + 626BE02B583652D883A14A0561438CB2 /* Frameworks */,
  835 + A16C9A7A00849A680D2ABE20664F291E /* Pods */,
  836 + 3A24F7BBB5CB0025CF2072B4FB964C24 /* Products */,
  837 + 309ACF9CB8917F8180F0C78892CC4962 /* Targets Support Files */,
782 838 );
783   - name = Resources;
784 839 sourceTree = "<group>";
785 840 };
786   - 705867264671E4C7B187D746502DAB91 /* Support Files */ = {
  841 + 818A0762A9C9D12339F271DBF1F4A0AF /* SDWebImage */ = {
787 842 isa = PBXGroup;
788 843 children = (
789   - C62416D612C6BD82B2867F75585C4C56 /* Info.plist */,
790   - 095F51C7CEE9EF306E13A58319881EFF /* Reachability.modulemap */,
791   - 4357F76011180D7A84AB5281135FBC76 /* Reachability.xcconfig */,
792   - 16CC2B704148D354077756FC0880DBCB /* Reachability-dummy.m */,
793   - 42DB5E77081A2858012F4CBF354A0D27 /* Reachability-prefix.pch */,
794   - 29BC53491C8D6BA4B81045D6FBBA043C /* Reachability-umbrella.h */,
  844 + 43383F8D50059A08F0FE7124DFF675F1 /* Core */,
  845 + 03D7A135F0C051D7B2ADB4B1311D2155 /* Support Files */,
795 846 );
796   - name = "Support Files";
797   - path = "../Target Support Files/Reachability";
  847 + name = SDWebImage;
  848 + path = SDWebImage;
798 849 sourceTree = "<group>";
799 850 };
800   - 7DB346D0F39D3F0E887471402A8071AB = {
  851 + 84B302A59A917E0D9C2EBA206DFA1A3A /* UMCSecurityPlugins */ = {
801 852 isa = PBXGroup;
802 853 children = (
803   - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */,
804   - 20B56609144CE204DFA8221F742B2D76 /* Frameworks */,
805   - D7E9034AEAB92F049FD989A2FAE23CD2 /* Pods */,
806   - 9CE129D1A72CFA1DEF6F85FBF1B37E5B /* Products */,
807   - 309ACF9CB8917F8180F0C78892CC4962 /* Targets Support Files */,
  854 + C02FC18021F6A9D7F71E478E6C6012D5 /* Frameworks */,
808 855 );
  856 + name = UMCSecurityPlugins;
  857 + path = UMCSecurityPlugins;
809 858 sourceTree = "<group>";
810 859 };
811   - 85CC9E6AC38974A790C417FCB9FD89FE /* Resources */ = {
  860 + 87D211D7619F5C69CD22BC5A6BD43F1B /* SVProgressHUD */ = {
812 861 isa = PBXGroup;
813 862 children = (
814   - 65DEF3C169B8F1241E74C3D5C7DA5A6D /* SVProgressHUD.bundle */,
  863 + 5BF833E322898122D95617BD9520476D /* SVIndefiniteAnimatedView.h */,
  864 + 70B842936FA16DF44F4AD4FC84E225A4 /* SVIndefiniteAnimatedView.m */,
  865 + DBA6EC35D53897ED2A96FEDE1BB384BA /* SVProgressAnimatedView.h */,
  866 + A8CB977B7AFFFA509CAA11CD0C03AEB5 /* SVProgressAnimatedView.m */,
  867 + F81C313FED69F64F2F4F403B4C4EC3F6 /* SVProgressHUD.h */,
  868 + 8A591BFD7762D296F2E84EBC08129BFA /* SVProgressHUD.m */,
  869 + 770A612E1A02028636A4D09BDEB87D10 /* SVRadialGradientLayer.h */,
  870 + CBB0446840A0CDD4BB7D69692D07CC21 /* SVRadialGradientLayer.m */,
  871 + 0BD61037A6B393F3F3CECE029889F374 /* Resources */,
  872 + 2021A6AEED487F441EF547B9DCEFF3E6 /* Support Files */,
815 873 );
816   - name = Resources;
  874 + name = SVProgressHUD;
  875 + path = SVProgressHUD;
817 876 sourceTree = "<group>";
818 877 };
819   - 8FC2DD334C1E70C1C4C5C8F0FA196151 /* Frameworks */ = {
  878 + 89D3111CD10CBDFE268BF7ECFA93CE05 /* Reachability */ = {
820 879 isa = PBXGroup;
821 880 children = (
822   - FC9D90B14CC51CAAC698C0623AB16C70 /* SecurityEnvSDK.framework */,
823   - E058896CA0DFFEF3CCEFAD6FEBA0DB11 /* UTDID.framework */,
  881 + EF0B6E4594449A55A06C44CB6D1223F0 /* Reachability.h */,
  882 + F775144A6F17788F065E01BFD8DC2D5C /* Reachability.m */,
  883 + 0310C750335673BB116A6C5FAFEEFE49 /* Support Files */,
824 884 );
825   - name = Frameworks;
  885 + name = Reachability;
  886 + path = Reachability;
826 887 sourceTree = "<group>";
827 888 };
828   - 9CE129D1A72CFA1DEF6F85FBF1B37E5B /* Products */ = {
  889 + 8F140A42D845EC8CE45E44C00A0F75EF /* Toast */ = {
829 890 isa = PBXGroup;
830 891 children = (
831   - E956F54FF76DE5D347505F3AF7694F03 /* Alamofire.framework */,
832   - DD0E89B8C1439B9F5FDB39EA0232B3EA /* DZNEmptyDataSet.framework */,
833   - 1719FF827E35476E2C51408C0A9BD81C /* HandyJSON.framework */,
834   - B88D8470A1A1E4F507B1E9895B074253 /* Pods_ParentAssistant.framework */,
835   - 5C3FCED1EF014BDAA42DACC871E2516A /* Reachability.framework */,
836   - CE1C92985D9321104698E3AFAF68594E /* SDWebImage.framework */,
837   - 33F1F6213579E70C284C8445EBD7DBDD /* SVProgressHUD.framework */,
838   - 41009B988332564AFC9DAF9C3817C7FA /* SwiftHash.framework */,
839   - A59A469B0852E07D2428D72E4C62B1E7 /* Toast.framework */,
840   - 09E993E3E47BE7E80DCFECCEA59937CC /* XRCarouselView.framework */,
  892 + 6BD1FCCAAFC6349CA1E2AC3881DB81FC /* UIView+Toast.h */,
  893 + 29B41A43E5D5CCE97E46706AC4240B68 /* UIView+Toast.m */,
  894 + EB8705EF374C4C0C14218029F0042B9B /* Support Files */,
841 895 );
842   - name = Products;
  896 + name = Toast;
  897 + path = Toast;
843 898 sourceTree = "<group>";
844 899 };
845   - A16014AECD4B7D4544FDD04B423C17A2 /* UMCCommon */ = {
  900 + 8F43C2634E0BE8006FDE8986D81A795E /* Support Files */ = {
846 901 isa = PBXGroup;
847 902 children = (
848   - B6AC7F4D4F23329B98C15767E39B6946 /* Frameworks */,
  903 + 08D048205A3343D5E251F506CBBE23E6 /* HandyJSON.modulemap */,
  904 + C6D4C38A8515FAAD57E78A742F0EB73A /* HandyJSON.xcconfig */,
  905 + 46E35C087C53D197C9D213DF73A74B66 /* HandyJSON-dummy.m */,
  906 + F1CF04B231D1BFC627F83398DFB40BBE /* HandyJSON-prefix.pch */,
  907 + 293A8917426C277C951BE22C661A240A /* HandyJSON-umbrella.h */,
  908 + BE69851A50C89CE0E218AE8504C1188B /* Info.plist */,
849 909 );
850   - name = UMCCommon;
851   - path = UMCCommon;
  910 + name = "Support Files";
  911 + path = "../Target Support Files/HandyJSON";
852 912 sourceTree = "<group>";
853 913 };
854   - A763792383AB084CDE85481D91E26AE3 /* HandyJSON */ = {
  914 + 96AED64B9563F84118E7D6B1CF316040 /* Support Files */ = {
855 915 isa = PBXGroup;
856 916 children = (
857   - 931ED830C3B0B8852F1479DE61BA997E /* AnyExtensions.swift */,
858   - F948022D8D1EFEF734A07E6ED4D6CAF9 /* BuiltInBasicType.swift */,
859   - 6976D41DC0C992EA2F24C3A7358E958F /* BuiltInBridgeType.swift */,
860   - 1914DA670BEE4BC1F461E88ED1BD7C26 /* Configuration.swift */,
861   - 64CF5A867496880A0DAE25ED9EC8E512 /* CustomDateFormatTransform.swift */,
862   - DE92E07FF56795D096246F9059B540CA /* DataTransform.swift */,
863   - B4EC3094994043023CF3002A63DD6DA4 /* DateFormatterTransform.swift */,
864   - B0A49BF64844554AA6BC0B49FD9A9BE8 /* DateTransform.swift */,
865   - 1D374115D56716D6284C03A777CD2BB4 /* Deserializer.swift */,
866   - 31A74FD90C96035085B5A148E9CBA64C /* EnumTransform.swift */,
867   - 5C73B5BC3B66F99610607951FEC5FCB3 /* EnumType.swift */,
868   - C33C9063E8CA60D73EE6050FCF59F433 /* Export.swift */,
869   - 32115C18B0BD53A5791A3FA797AB85AC /* ExtendCustomBasicType.swift */,
870   - 54E529332879B58C942DDF16DF5D39B4 /* ExtendCustomModelType.swift */,
871   - 6B3D43CB0BDA34787F85B2C084FBB09A /* HandyJSON.h */,
872   - 9889E5067E9A54BAEC05298BBA10F671 /* HelpingMapper.swift */,
873   - 2E85535E49256ABCDBBB9EA045CE6268 /* HexColorTransform.swift */,
874   - 7DFB6D55866F4F62D8116993D42B55A8 /* ISO8601DateTransform.swift */,
875   - 26EF7D93FE7442849AC14571996AC8ED /* Logger.swift */,
876   - 7D9407543C44ABED0AC48154C76831BE /* Measuable.swift */,
877   - BC3C517CD17DEB98E878268901D654E8 /* Metadata.swift */,
878   - 7C5CEE4C10F2E83011011BAE5999B4FD /* NominalType.swift */,
879   - 2830040C9AF69744EEB45C092E65CA2A /* NSDecimalNumberTransform.swift */,
880   - E9462CA128209C32EE6E6647C88609D1 /* OtherExtension.swift */,
881   - 3447CC75BA7C93ED3BF68C2F65392471 /* PointerType.swift */,
882   - 05BE4EE179BFA37C2F5F3928F9237A1F /* Properties.swift */,
883   - 81D2AEE4F419083BF22474B240B3D9F6 /* PropertyInfo.swift */,
884   - 31257A57ECE5DD3A052A547DA8090EF9 /* ReflectionHelper.swift */,
885   - 39C3C21D34A34F85D09063C7E1255E9D /* Serializer.swift */,
886   - E4E76CB8696BAB20A617484E4726713B /* Transformable.swift */,
887   - 72ADD4F0113F0555435EA10BA789F8E2 /* TransformOf.swift */,
888   - F33461E2C03CDF90E02052B76ADADB01 /* TransformType.swift */,
889   - 6D24FB404E9541910245BF3E68C5EE73 /* URLTransform.swift */,
890   - 2A1708CE4EC9BA0CA7B5865FF66228B4 /* Support Files */,
  917 + 7A45AEAFC59FC8550866653E018742E3 /* Info.plist */,
  918 + 6E2FF425EC8FB1E33922042D418E2A79 /* XRCarouselView.modulemap */,
  919 + 8EC8A0BF26B3414588BF92C66234FD4B /* XRCarouselView.xcconfig */,
  920 + B63F0AB7376A64C50DA03CACC7D9CC2E /* XRCarouselView-dummy.m */,
  921 + B4595D719B06D3C0D44248E3DD5B1962 /* XRCarouselView-prefix.pch */,
  922 + 49DC3C5FB6A7B1CDAA1410FAABB684E0 /* XRCarouselView-umbrella.h */,
891 923 );
892   - name = HandyJSON;
893   - path = HandyJSON;
  924 + name = "Support Files";
  925 + path = "../Target Support Files/XRCarouselView";
894 926 sourceTree = "<group>";
895 927 };
896   - A87864D22DE2007F4600F7C0E566D95C /* Support Files */ = {
  928 + A16C9A7A00849A680D2ABE20664F291E /* Pods */ = {
897 929 isa = PBXGroup;
898 930 children = (
899   - 2EE1F3AAF4D2513EA3BFF47F019026DC /* Alamofire.modulemap */,
900   - EA6D07581B965169F4C036A600CF86BB /* Alamofire.xcconfig */,
901   - BB2B3251E63EE34530FC8A40E441CB23 /* Alamofire-dummy.m */,
902   - 07E1E2C8AC8B32A86D7C0A576243A070 /* Alamofire-prefix.pch */,
903   - BF496B88C6E68626DC9D0C9FC152BD3C /* Alamofire-umbrella.h */,
904   - 820C0B25502D820076E6945A9666E544 /* Info.plist */,
  931 + A1F9F100FA7BE821D8C1CA349D5C7EAC /* Alamofire */,
  932 + 56CCB4F4B6E9E8D3FDF3A892A90571F4 /* AlamofireImage */,
  933 + F37E800D927B17552826F537A1FC4DE1 /* DZNEmptyDataSet */,
  934 + 0D5414319A3865994CB656BBA34C49BD /* HandyJSON */,
  935 + 7B6FD119C5043EA8D24938E17F689C68 /* NIMSDK_LITE */,
  936 + 89D3111CD10CBDFE268BF7ECFA93CE05 /* Reachability */,
  937 + 818A0762A9C9D12339F271DBF1F4A0AF /* SDWebImage */,
  938 + 87D211D7619F5C69CD22BC5A6BD43F1B /* SVProgressHUD */,
  939 + 3FF4649D5096372902422FFDFDD8E56D /* SwiftHash */,
  940 + 8F140A42D845EC8CE45E44C00A0F75EF /* Toast */,
  941 + D18EBDBE538D676F21A84906A850C7C5 /* UMCAnalytics */,
  942 + 67B27D86547E925A9481C071E5DC217B /* UMCCommon */,
  943 + D19DCA624A50F676CBC86D437D3B30B2 /* UMCErrorCatch */,
  944 + 84B302A59A917E0D9C2EBA206DFA1A3A /* UMCSecurityPlugins */,
  945 + 301A38DCCF06B3AC4AF5322410158E12 /* XRCarouselView */,
905 946 );
906   - name = "Support Files";
907   - path = "../Target Support Files/Alamofire";
  947 + name = Pods;
908 948 sourceTree = "<group>";
909 949 };
910   - B4BCFF35A95B70F9457A79139DBED331 /* Reachability */ = {
  950 + A1F9F100FA7BE821D8C1CA349D5C7EAC /* Alamofire */ = {
911 951 isa = PBXGroup;
912 952 children = (
913   - 2AD254563DCC20283BB5C0C5B4E57B5C /* Reachability.h */,
914   - 0969E5011DCC0C421F637E6859279610 /* Reachability.m */,
915   - 705867264671E4C7B187D746502DAB91 /* Support Files */,
  953 + 7EBA3110EB94A0568FF28796D778675E /* AFError.swift */,
  954 + 30A5A5A7B7C1088D4D4ABDFAAF6E54F3 /* Alamofire.swift */,
  955 + 2245A79B4B989C667CBB26B48B7A1896 /* DispatchQueue+Alamofire.swift */,
  956 + C7C98E50FC5D694C89DBEE8A1486D900 /* MultipartFormData.swift */,
  957 + EFA9DF74078A51C9573DF6952A753D1C /* NetworkReachabilityManager.swift */,
  958 + E215EB7C10CD4B2F724959DB344FE5C0 /* Notifications.swift */,
  959 + 0F3763627E35DE67CD17EE93E640DD39 /* ParameterEncoding.swift */,
  960 + E74F653E7072F40DB006FC90854FC840 /* Request.swift */,
  961 + D82D7054D7F1E7FE0ACBE043A3FA7F50 /* Response.swift */,
  962 + 2BE4F7B39AE70471948017C04083277A /* ResponseSerialization.swift */,
  963 + 7C01563CB8CAFA848353DD90A07F2F47 /* Result.swift */,
  964 + CAE58263CB0A52CDB5D3790DC6D0D74F /* ServerTrustPolicy.swift */,
  965 + 0BD55715F6A333D077B971AD89F07626 /* SessionDelegate.swift */,
  966 + 0F6296C8F6861894C09A46E509B544A6 /* SessionManager.swift */,
  967 + 85DBA7A206E80F9E00E01BEFE74D6D69 /* TaskDelegate.swift */,
  968 + 1A34017AEE736DE7CC86E3201A0B303C /* Timeline.swift */,
  969 + 981D262EBFB4CA168BE569F48CC64843 /* Validation.swift */,
  970 + 75CE8CBE50D56BFC3821ECF0A886130F /* Support Files */,
916 971 );
917   - name = Reachability;
918   - path = Reachability;
  972 + name = Alamofire;
  973 + path = Alamofire;
919 974 sourceTree = "<group>";
920 975 };
921   - B6AC7F4D4F23329B98C15767E39B6946 /* Frameworks */ = {
  976 + B6C77C2D1243C37F15069EBD4B8827B8 /* Support Files */ = {
922 977 isa = PBXGroup;
923 978 children = (
924   - DF826B20D920C607DF652F2F3EA4C2F8 /* UMCommon.framework */,
  979 + 2387EDABD5D4A7ABE66B86C30A524A6C /* Info.plist */,
  980 + 5684F0F90E3FAEFBE15A94EE1C636644 /* SwiftHash.modulemap */,
  981 + 2A58122C4E55BBB959E9F3D985E070AB /* SwiftHash.xcconfig */,
  982 + DF7918BBC8A10388FDE15B624F66A8E9 /* SwiftHash-dummy.m */,
  983 + D8A2F9829AECA7F54C384A6E17AB7124 /* SwiftHash-prefix.pch */,
  984 + 8B25C902A48A887CDEA53D385B48C92E /* SwiftHash-umbrella.h */,
925 985 );
926   - name = Frameworks;
  986 + name = "Support Files";
  987 + path = "../Target Support Files/SwiftHash";
927 988 sourceTree = "<group>";
928 989 };
929 990 BE317C13F71B97F884FEF35459393B25 /* Pods-ParentAssistant */ = {
... ... @@ -944,155 +1005,190 @@
944 1005 path = "Target Support Files/Pods-ParentAssistant";
945 1006 sourceTree = "<group>";
946 1007 };
947   - C78510EC4A1F228614ECFEB07DFC0275 /* Support Files */ = {
  1008 + C02FC18021F6A9D7F71E478E6C6012D5 /* Frameworks */ = {
  1009 + isa = PBXGroup;
  1010 + children = (
  1011 + E2607500177BC99C04478DAB57D80EB7 /* SecurityEnvSDK.framework */,
  1012 + EEE063E46D8691853E8CDB3C33506BF8 /* UTDID.framework */,
  1013 + );
  1014 + name = Frameworks;
  1015 + sourceTree = "<group>";
  1016 + };
  1017 + D18EBDBE538D676F21A84906A850C7C5 /* UMCAnalytics */ = {
  1018 + isa = PBXGroup;
  1019 + children = (
  1020 + DD89B480B22F4C573AB6CF0C122D238C /* Frameworks */,
  1021 + );
  1022 + name = UMCAnalytics;
  1023 + path = UMCAnalytics;
  1024 + sourceTree = "<group>";
  1025 + };
  1026 + D19DCA624A50F676CBC86D437D3B30B2 /* UMCErrorCatch */ = {
  1027 + isa = PBXGroup;
  1028 + children = (
  1029 + 67A94A45D2AA43B64721FE393BF0B924 /* Frameworks */,
  1030 + );
  1031 + name = UMCErrorCatch;
  1032 + path = UMCErrorCatch;
  1033 + sourceTree = "<group>";
  1034 + };
  1035 + D7386CADE4284D284D37C38FDCFCEF63 /* Support Files */ = {
948 1036 isa = PBXGroup;
949 1037 children = (
950   - B507541260F671D342B11E7250120BBF /* Info.plist */,
951   - 481FE62B9A76B9C994CED4CDBF22F059 /* SVProgressHUD.modulemap */,
952   - 43766E6C5ADEB0502C1E3C6049C5D9AC /* SVProgressHUD.xcconfig */,
953   - 0322584439902B09D766EF9B00C87E2A /* SVProgressHUD-dummy.m */,
954   - 52C9D81718FDCE850DDAF365FD190B4F /* SVProgressHUD-prefix.pch */,
955   - 93251EC8BEF89E6A4FA758DA38A1E47A /* SVProgressHUD-umbrella.h */,
  1038 + B9A33258A85F658D3C02E30EC92D43FF /* DZNEmptyDataSet.modulemap */,
  1039 + 1BF83289F3929832EC0ED8E333158C69 /* DZNEmptyDataSet.xcconfig */,
  1040 + EC105ECBFE938402821EF19D7C5DA1DA /* DZNEmptyDataSet-dummy.m */,
  1041 + 661171DD778BD7E26EE68F008228F1C9 /* DZNEmptyDataSet-prefix.pch */,
  1042 + CECDC33DC6A3E686FD21577C5B23C258 /* DZNEmptyDataSet-umbrella.h */,
  1043 + 0241F285DD08F109C7549C2CDA98F2F6 /* Info.plist */,
956 1044 );
957 1045 name = "Support Files";
958   - path = "../Target Support Files/SVProgressHUD";
  1046 + path = "../Target Support Files/DZNEmptyDataSet";
959 1047 sourceTree = "<group>";
960 1048 };
961   - D31A1BD7824CBE1C0596DAB8776011D9 /* XRCarouselView */ = {
  1049 + DD89B480B22F4C573AB6CF0C122D238C /* Frameworks */ = {
962 1050 isa = PBXGroup;
963 1051 children = (
964   - 57342E33349B812F65B6D994EA74E212 /* XRCarouselView.h */,
965   - A91D08749C812CD6EB281780E69AFED6 /* XRCarouselView.m */,
966   - 68471EF420D9A2E724167C5491206AFB /* Resources */,
967   - DEA7E0AFDB9947306F061F7A72D3AE96 /* Support Files */,
  1052 + EADCBFE671FB00B5F5FDBD2B3F6EC3CD /* UMAnalytics.framework */,
968 1053 );
969   - name = XRCarouselView;
970   - path = XRCarouselView;
  1054 + name = Frameworks;
971 1055 sourceTree = "<group>";
972 1056 };
973   - D7E9034AEAB92F049FD989A2FAE23CD2 /* Pods */ = {
  1057 + EB8705EF374C4C0C14218029F0042B9B /* Support Files */ = {
974 1058 isa = PBXGroup;
975 1059 children = (
976   - 035886489A99DD807583400603AB5019 /* Alamofire */,
977   - 37C774715FC3CB332E3DBBFF760D1DA7 /* DZNEmptyDataSet */,
978   - A763792383AB084CDE85481D91E26AE3 /* HandyJSON */,
979   - 3C7A5A0E8FB6FB9142B786013E33F9B1 /* NIMSDK_LITE */,
980   - B4BCFF35A95B70F9457A79139DBED331 /* Reachability */,
981   - 330169F0E739AF701BDEBB5894F8434A /* SDWebImage */,
982   - 5763DABFBEC61EF21CE978F465358A89 /* SVProgressHUD */,
983   - 55375898F80E2F483F6A33CD3B40855D /* SwiftHash */,
984   - 3FF5DEC88DC62971403983A6F02247FE /* Toast */,
985   - 38EFF4314C3C2EB48B86E623B8035A4B /* UMCAnalytics */,
986   - A16014AECD4B7D4544FDD04B423C17A2 /* UMCCommon */,
987   - 59C2933D98416017CC5447DA025532B4 /* UMCErrorCatch */,
988   - 0AFF261FC6409676B5FE2EA67480CAE4 /* UMCSecurityPlugins */,
989   - D31A1BD7824CBE1C0596DAB8776011D9 /* XRCarouselView */,
  1060 + 676078733016383B143B493E79D3CEF5 /* Info.plist */,
  1061 + 874C609455AB27C910DD97EBDD79E965 /* Toast.modulemap */,
  1062 + 9741F11BA31165953D6A9744F073FF08 /* Toast.xcconfig */,
  1063 + 53599A8492E17F111CC5C8D3C50E872A /* Toast-dummy.m */,
  1064 + 84AE5CF00E8941985B8EB7DFC8A475E7 /* Toast-prefix.pch */,
  1065 + 93E637F89EC35850C7250805992BB1C0 /* Toast-umbrella.h */,
990 1066 );
991   - name = Pods;
  1067 + name = "Support Files";
  1068 + path = "../Target Support Files/Toast";
992 1069 sourceTree = "<group>";
993 1070 };
994   - DEA7E0AFDB9947306F061F7A72D3AE96 /* Support Files */ = {
  1071 + ED22116B8F3EBCF03BF952FD1412F8A7 /* Support Files */ = {
995 1072 isa = PBXGroup;
996 1073 children = (
997   - DE3D895CEB8D8D9876BA0F9346FF9D69 /* Info.plist */,
998   - CC9B184B04C60B80BBEF83595DBE8AF4 /* XRCarouselView.modulemap */,
999   - 87D16ABF7E5F8A01191A86657C5C16BA /* XRCarouselView.xcconfig */,
1000   - 7437E1C250CA27898AA8815D1117643B /* XRCarouselView-dummy.m */,
1001   - 60794CE8C2369C4AA061EE9A931DDFED /* XRCarouselView-prefix.pch */,
1002   - 323A41D79693687F0377B9ACACC90D4A /* XRCarouselView-umbrella.h */,
  1074 + 865E120DE5EA698A2789C2686BC45C7A /* AlamofireImage.modulemap */,
  1075 + 187D5302F110245F1D24D217827BFBC1 /* AlamofireImage.xcconfig */,
  1076 + 600ABB9AA8054F7B4E851C17D19FCAA0 /* AlamofireImage-dummy.m */,
  1077 + 770EB1960009D9CCA67CBA11FBC8490A /* AlamofireImage-prefix.pch */,
  1078 + 9AD53A7A5BDC98AFD3CE8CF1BC407F10 /* AlamofireImage-umbrella.h */,
  1079 + 00E5D50454806A1FFA39BF7A572D4A37 /* Info.plist */,
1003 1080 );
1004 1081 name = "Support Files";
1005   - path = "../Target Support Files/XRCarouselView";
  1082 + path = "../Target Support Files/AlamofireImage";
  1083 + sourceTree = "<group>";
  1084 + };
  1085 + F37E800D927B17552826F537A1FC4DE1 /* DZNEmptyDataSet */ = {
  1086 + isa = PBXGroup;
  1087 + children = (
  1088 + DD324E3E21CD21F91211149384F64690 /* UIScrollView+EmptyDataSet.h */,
  1089 + 7AC81C76B41B0ABF4E94921ADBA70C30 /* UIScrollView+EmptyDataSet.m */,
  1090 + D7386CADE4284D284D37C38FDCFCEF63 /* Support Files */,
  1091 + );
  1092 + name = DZNEmptyDataSet;
  1093 + path = DZNEmptyDataSet;
1006 1094 sourceTree = "<group>";
1007 1095 };
1008 1096 /* End PBXGroup section */
1009 1097  
1010 1098 /* Begin PBXHeadersBuildPhase section */
1011   - 0258573883B4A965DF0595F7BF4C1E54 /* Headers */ = {
  1099 + 0C3C3BE76C79B9728E94463FAF23BAF8 /* Headers */ = {
1012 1100 isa = PBXHeadersBuildPhase;
1013 1101 buildActionMask = 2147483647;
1014 1102 files = (
1015   - 604E191C52F306436E51253A4A21589C /* SwiftHash-umbrella.h in Headers */,
  1103 + B0114B93073F87D24BE99FCEE08CDAE2 /* XRCarouselView-umbrella.h in Headers */,
  1104 + 98C28E5A4A7CC37A671D4BBAE25EB3CB /* XRCarouselView.h in Headers */,
1016 1105 );
1017 1106 runOnlyForDeploymentPostprocessing = 0;
1018 1107 };
1019   - 099CB4115CBACF33248BB7711972A81E /* Headers */ = {
  1108 + 16845547CA168475331279C504643647 /* Headers */ = {
1020 1109 isa = PBXHeadersBuildPhase;
1021 1110 buildActionMask = 2147483647;
1022 1111 files = (
1023   - 6A14BBE1A1C5AFF3B9FCFFCC30685E04 /* Toast-umbrella.h in Headers */,
1024   - 9687BE425798E40CBC52870F8009209D /* UIView+Toast.h in Headers */,
  1112 + 5E9D11BEACC080376EA6F57C6167B34A /* HandyJSON-umbrella.h in Headers */,
  1113 + 895952B7EE442E03D667D9565D8C84F4 /* HandyJSON.h in Headers */,
1025 1114 );
1026 1115 runOnlyForDeploymentPostprocessing = 0;
1027 1116 };
1028   - 16845547CA168475331279C504643647 /* Headers */ = {
  1117 + 3A99AD81C47C25583B8F58920EC0C7EC /* Headers */ = {
1029 1118 isa = PBXHeadersBuildPhase;
1030 1119 buildActionMask = 2147483647;
1031 1120 files = (
1032   - 5E9D11BEACC080376EA6F57C6167B34A /* HandyJSON-umbrella.h in Headers */,
1033   - 895952B7EE442E03D667D9565D8C84F4 /* HandyJSON.h in Headers */,
  1121 + 6C5B6525AD8543CD0EA5382D9B9EBF00 /* SVIndefiniteAnimatedView.h in Headers */,
  1122 + 7B8F1E3301B7F3D1AF25FDE0E2618647 /* SVProgressAnimatedView.h in Headers */,
  1123 + E363FB7AFABD373D4D2EB91EEAEAA556 /* SVProgressHUD-umbrella.h in Headers */,
  1124 + A04DAA4579CD1E21D2161AABB36244C4 /* SVProgressHUD.h in Headers */,
  1125 + E34A395CCE4DFEB66FE70DC91B6FA149 /* SVRadialGradientLayer.h in Headers */,
1034 1126 );
1035 1127 runOnlyForDeploymentPostprocessing = 0;
1036 1128 };
1037   - 653FFE72514B935712D0CE1053D47AD6 /* Headers */ = {
  1129 + 46C3F69B64D9B3664866FAB0171594A7 /* Headers */ = {
1038 1130 isa = PBXHeadersBuildPhase;
1039 1131 buildActionMask = 2147483647;
1040 1132 files = (
1041   - 4C144355E41C99902528AAD3CF069680 /* DZNEmptyDataSet-umbrella.h in Headers */,
1042   - 8511E9645F5C2B18746B4B4B29284451 /* UIScrollView+EmptyDataSet.h in Headers */,
  1133 + 1E2754F17B8625E93745EB87C0E58961 /* Pods-ParentAssistant-umbrella.h in Headers */,
  1134 + );
  1135 + runOnlyForDeploymentPostprocessing = 0;
  1136 + };
  1137 + 49214B170416457B16834AFB504DF9B7 /* Headers */ = {
  1138 + isa = PBXHeadersBuildPhase;
  1139 + buildActionMask = 2147483647;
  1140 + files = (
  1141 + 4214C2FD7E877BAD66B5E69E70D52CC2 /* NSData+ImageContentType.h in Headers */,
  1142 + 3F16FEA96023ABF8BB9A47112409421A /* SDImageCache.h in Headers */,
  1143 + B2CC21A9D71EA49F2A55896265CF8E29 /* SDWebImage-umbrella.h in Headers */,
  1144 + 0D6E3F656916E4C6734BAF1DAB7CAEE7 /* SDWebImageCompat.h in Headers */,
  1145 + 3B2224950C9D1CE87BA75653DDDD2A13 /* SDWebImageDecoder.h in Headers */,
  1146 + 930D1C2CE2E4A32830066A7F4240F88F /* SDWebImageDownloader.h in Headers */,
  1147 + CA6644C7C70AC449F8D9968CA529C381 /* SDWebImageDownloaderOperation.h in Headers */,
  1148 + 93258C9412DF54DD088A385C2CCC79D1 /* SDWebImageManager.h in Headers */,
  1149 + 68EF6ACDBEC67DED9ACB63B4CFA05404 /* SDWebImageOperation.h in Headers */,
  1150 + 357EC08486308022D69F865CBFC53798 /* SDWebImagePrefetcher.h in Headers */,
  1151 + 92BC60F896B3049AEF17412EE13B32D5 /* UIButton+WebCache.h in Headers */,
  1152 + 6257B7791953547BB4FD33142C6A4016 /* UIImage+GIF.h in Headers */,
  1153 + 86DCCE5F06E9EDF67344C60D4859F032 /* UIImage+MultiFormat.h in Headers */,
  1154 + E96AB8B40C45FF09A9F396DCFD27D1C0 /* UIImageView+HighlightedWebCache.h in Headers */,
  1155 + 332B3CC48AC35662839D5A89D1FD9C0B /* UIImageView+WebCache.h in Headers */,
  1156 + B06A3FFD3EBF03FF3166F6E1B0D665F9 /* UIView+WebCacheOperation.h in Headers */,
1043 1157 );
1044 1158 runOnlyForDeploymentPostprocessing = 0;
1045 1159 };
1046   - 6AEF8DFADC67B16F108F1855C41820B4 /* Headers */ = {
  1160 + 4A32D4B1A74FEE2326E518DF531B9262 /* Headers */ = {
1047 1161 isa = PBXHeadersBuildPhase;
1048 1162 buildActionMask = 2147483647;
1049 1163 files = (
1050   - 46389823D72FA2DA9F4AD34CE119E9FA /* Reachability-umbrella.h in Headers */,
1051   - 7D23D4A779C42E695BD2EC80114AD9E8 /* Reachability.h in Headers */,
  1164 + F9554493CBDF921FEF278972C7FA3221 /* SwiftHash-umbrella.h in Headers */,
1052 1165 );
1053 1166 runOnlyForDeploymentPostprocessing = 0;
1054 1167 };
1055   - 7192BFF4C933C30A1A5F53991AABE322 /* Headers */ = {
  1168 + 653FFE72514B935712D0CE1053D47AD6 /* Headers */ = {
1056 1169 isa = PBXHeadersBuildPhase;
1057 1170 buildActionMask = 2147483647;
1058 1171 files = (
1059   - 240CD81B9BDAA551B583A82E3618D560 /* XRCarouselView-umbrella.h in Headers */,
1060   - 4A2F8CD414D57920B53208F0F9A39E34 /* XRCarouselView.h in Headers */,
  1172 + 4C144355E41C99902528AAD3CF069680 /* DZNEmptyDataSet-umbrella.h in Headers */,
  1173 + 8511E9645F5C2B18746B4B4B29284451 /* UIScrollView+EmptyDataSet.h in Headers */,
1061 1174 );
1062 1175 runOnlyForDeploymentPostprocessing = 0;
1063 1176 };
1064   - 8FE5C58C0325111F27713A45110DDD2F /* Headers */ = {
  1177 + 716B553DB26B96E823BC570F96E11E54 /* Headers */ = {
1065 1178 isa = PBXHeadersBuildPhase;
1066 1179 buildActionMask = 2147483647;
1067 1180 files = (
1068   - F206FE65A9D924A3F6ED6221E3BBD35E /* SVIndefiniteAnimatedView.h in Headers */,
1069   - A95766E9124B13BABFF00CFBEFEC0501 /* SVProgressAnimatedView.h in Headers */,
1070   - 3C69CE7353282718747615DDA9563510 /* SVProgressHUD-umbrella.h in Headers */,
1071   - 4A1D23F6526F175FCC2B35539E1B6AD6 /* SVProgressHUD.h in Headers */,
1072   - 3D342698F0FA2B9391B7B1733D499623 /* SVRadialGradientLayer.h in Headers */,
  1181 + D4C68ED144E24084583644C877C41229 /* Reachability-umbrella.h in Headers */,
  1182 + 9371A6AC1CEABB24E7275AACD3FDC21A /* Reachability.h in Headers */,
1073 1183 );
1074 1184 runOnlyForDeploymentPostprocessing = 0;
1075 1185 };
1076   - 9842775420762B806F91922E6A2DB1FC /* Headers */ = {
  1186 + 7BF8D8F75CF7B473D8F3BDEA7AB7C2F5 /* Headers */ = {
1077 1187 isa = PBXHeadersBuildPhase;
1078 1188 buildActionMask = 2147483647;
1079 1189 files = (
1080   - BD14752B5379EAA21AF328A8ABE08A6D /* NSData+ImageContentType.h in Headers */,
1081   - B2D8BD6984912C60C7A22BF665987A73 /* SDImageCache.h in Headers */,
1082   - 264463742964367E06060C2E85D3EEF4 /* SDWebImage-umbrella.h in Headers */,
1083   - 63751EA36B3CCD03BF292C19F6B7C5FE /* SDWebImageCompat.h in Headers */,
1084   - 05F1082B0C6E40F76E821D67DFAD9AB5 /* SDWebImageDecoder.h in Headers */,
1085   - 2AB8304BE65678C2043856E0F4AAFC9E /* SDWebImageDownloader.h in Headers */,
1086   - 0A2126372E9629100B22A44A94E73D71 /* SDWebImageDownloaderOperation.h in Headers */,
1087   - 82769877C29A8E71221C9918273D3FFF /* SDWebImageManager.h in Headers */,
1088   - 8C1E8307CFE1A73F290CFCE8818B6123 /* SDWebImageOperation.h in Headers */,
1089   - EB3F85272BEE4C2EB0321741E8FE4B75 /* SDWebImagePrefetcher.h in Headers */,
1090   - A17930AC43F712547C2B4B58C1450B82 /* UIButton+WebCache.h in Headers */,
1091   - E49369FF3BD66698C3B61B8DE9C58DE0 /* UIImage+GIF.h in Headers */,
1092   - E72FACD066C66E010F4C91956E8E29CB /* UIImage+MultiFormat.h in Headers */,
1093   - 46749DE4D7ED1863AFF86DFB519EAAD0 /* UIImageView+HighlightedWebCache.h in Headers */,
1094   - BBF90CAC12DA7C2713DB47B3BE5C898C /* UIImageView+WebCache.h in Headers */,
1095   - BC9AB82CB1C91977B5C1C96A25A9CA22 /* UIView+WebCacheOperation.h in Headers */,
  1190 + 4140A49CB0D5F03DD7565AC94796D856 /* Toast-umbrella.h in Headers */,
  1191 + 06B6D63D2B2E6F2896A15C18097D3730 /* UIView+Toast.h in Headers */,
1096 1192 );
1097 1193 runOnlyForDeploymentPostprocessing = 0;
1098 1194 };
... ... @@ -1104,17 +1200,35 @@
1104 1200 );
1105 1201 runOnlyForDeploymentPostprocessing = 0;
1106 1202 };
1107   - CB17733CFD076ED5E2BE1AACA72ED979 /* Headers */ = {
  1203 + EB21FD03B7703901958C3CE43325DAE9 /* Headers */ = {
1108 1204 isa = PBXHeadersBuildPhase;
1109 1205 buildActionMask = 2147483647;
1110 1206 files = (
1111   - 53926FE56FBF1399E69B9F893ACFBDB1 /* Pods-ParentAssistant-umbrella.h in Headers */,
  1207 + 32EDA9ED83F4442303A46839027E152E /* AlamofireImage-umbrella.h in Headers */,
1112 1208 );
1113 1209 runOnlyForDeploymentPostprocessing = 0;
1114 1210 };
1115 1211 /* End PBXHeadersBuildPhase section */
1116 1212  
1117 1213 /* Begin PBXNativeTarget section */
  1214 + 0A4402E270B0A4B00A031931BD805EF1 /* XRCarouselView */ = {
  1215 + isa = PBXNativeTarget;
  1216 + buildConfigurationList = 4C801EC31238E6F547E7192FDC9AD054 /* Build configuration list for PBXNativeTarget "XRCarouselView" */;
  1217 + buildPhases = (
  1218 + 836E6AC4CFA56F3A9B9AC5333F4EB303 /* Sources */,
  1219 + CC88855CE2CDECCE28DB46B1FDBF88B7 /* Frameworks */,
  1220 + 0C3C3BE76C79B9728E94463FAF23BAF8 /* Headers */,
  1221 + 3902916FBFDC0C6606E9AFDBFBD7F267 /* Resources */,
  1222 + );
  1223 + buildRules = (
  1224 + );
  1225 + dependencies = (
  1226 + );
  1227 + name = XRCarouselView;
  1228 + productName = XRCarouselView;
  1229 + productReference = 444E77BBBDD4B2AB34C6742B6752BBCB /* XRCarouselView.framework */;
  1230 + productType = "com.apple.product-type.framework";
  1231 + };
1118 1232 1465651EBBC44AD3276DDE2476CDA450 /* HandyJSON */ = {
1119 1233 isa = PBXNativeTarget;
1120 1234 buildConfigurationList = 184303B9B5FF90B2017E4D0073BC6423 /* Build configuration list for PBXNativeTarget "HandyJSON" */;
... ... @@ -1129,171 +1243,172 @@
1129 1243 );
1130 1244 name = HandyJSON;
1131 1245 productName = HandyJSON;
1132   - productReference = 1719FF827E35476E2C51408C0A9BD81C /* HandyJSON.framework */;
  1246 + productReference = 110D34637F4EF19C8F46B101A1509ABE /* HandyJSON.framework */;
1133 1247 productType = "com.apple.product-type.framework";
1134 1248 };
1135   - 27189F0EDBCA8831C460D0166F6F37A1 /* XRCarouselView */ = {
  1249 + 37F4E36BECBDD0070D2501E766C0238B /* SDWebImage */ = {
1136 1250 isa = PBXNativeTarget;
1137   - buildConfigurationList = A4FA017D8C4362BABA6CC461A244CB9D /* Build configuration list for PBXNativeTarget "XRCarouselView" */;
  1251 + buildConfigurationList = 70F92D3F8B893481FDA768F4EB8E9118 /* Build configuration list for PBXNativeTarget "SDWebImage" */;
1138 1252 buildPhases = (
1139   - 583C8401A8273215767A6E78D9832675 /* Sources */,
1140   - 158EE653FB0E0E7AF979010BC3A73E13 /* Frameworks */,
1141   - 7192BFF4C933C30A1A5F53991AABE322 /* Headers */,
1142   - F5D5D2A3D9EE0A5E1C3E82E64D42CDD6 /* Resources */,
  1253 + BA7C56D0F2745E59EEA82D7E504CAAB3 /* Sources */,
  1254 + 12D9BD764C2F5E43285530C00A583D52 /* Frameworks */,
  1255 + 49214B170416457B16834AFB504DF9B7 /* Headers */,
1143 1256 );
1144 1257 buildRules = (
1145 1258 );
1146 1259 dependencies = (
1147 1260 );
1148   - name = XRCarouselView;
1149   - productName = XRCarouselView;
1150   - productReference = 09E993E3E47BE7E80DCFECCEA59937CC /* XRCarouselView.framework */;
  1261 + name = SDWebImage;
  1262 + productName = SDWebImage;
  1263 + productReference = 8E2EC639DC31085C2078E4638A61266B /* SDWebImage.framework */;
1151 1264 productType = "com.apple.product-type.framework";
1152 1265 };
1153   - 6376DC419EEA98495631602218A4F31B /* SwiftHash */ = {
  1266 + 3DE44D61FA676CE3B5DFDE6DC058A636 /* Pods-ParentAssistant */ = {
1154 1267 isa = PBXNativeTarget;
1155   - buildConfigurationList = 3EC2F42A94017DE0B0E897EBD57D8A00 /* Build configuration list for PBXNativeTarget "SwiftHash" */;
  1268 + buildConfigurationList = 76E43176855F8CE556CB459D4CF15C83 /* Build configuration list for PBXNativeTarget "Pods-ParentAssistant" */;
1156 1269 buildPhases = (
1157   - 1B8C7048A91070CF34162BF979720918 /* Sources */,
1158   - 2FCA03AB4708FF069C969DAC4ED689A3 /* Frameworks */,
1159   - 0258573883B4A965DF0595F7BF4C1E54 /* Headers */,
  1270 + B0A80FA96AA24569F8AB376B609B0706 /* Sources */,
  1271 + 6FA848EABA8BCB08AFA8A7CBA0F79DA3 /* Frameworks */,
  1272 + 46C3F69B64D9B3664866FAB0171594A7 /* Headers */,
1160 1273 );
1161 1274 buildRules = (
1162 1275 );
1163 1276 dependencies = (
  1277 + AF98B4E6DC1B79AE4FD9FD930B0E2C69 /* PBXTargetDependency */,
  1278 + 400980F7465C7DCC1DF6E89055AD0B96 /* PBXTargetDependency */,
  1279 + 0F0709264E6CBE1FC5B2108AFA9A1EBC /* PBXTargetDependency */,
  1280 + 0B0575AE71362DA3E174564EB6435F59 /* PBXTargetDependency */,
  1281 + 0271B3B581BEDB99AD2D8A82A7A51FE7 /* PBXTargetDependency */,
  1282 + C91D8AEA00A921168C007D309B135C5D /* PBXTargetDependency */,
  1283 + 5088DA9186A8D1DD902822E13A654208 /* PBXTargetDependency */,
  1284 + 03000FBE28A1D37021A99C22E5DC6577 /* PBXTargetDependency */,
  1285 + 48DB56871980177AD76344D30AAA6812 /* PBXTargetDependency */,
  1286 + D7A715C58A0231CE8EF5720E0B2201C5 /* PBXTargetDependency */,
1164 1287 );
1165   - name = SwiftHash;
1166   - productName = SwiftHash;
1167   - productReference = 41009B988332564AFC9DAF9C3817C7FA /* SwiftHash.framework */;
  1288 + name = "Pods-ParentAssistant";
  1289 + productName = "Pods-ParentAssistant";
  1290 + productReference = 72C584102060EC4C983B4B76AB4B8C8F /* Pods_ParentAssistant.framework */;
1168 1291 productType = "com.apple.product-type.framework";
1169 1292 };
1170   - 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */ = {
  1293 + 620180280B57A3DF973662E546D211E4 /* Toast */ = {
1171 1294 isa = PBXNativeTarget;
1172   - buildConfigurationList = 419E5D95491847CD79841B971A8A3277 /* Build configuration list for PBXNativeTarget "Alamofire" */;
  1295 + buildConfigurationList = 1CEF6058AA58F732B5DE35ABEA2BB8C8 /* Build configuration list for PBXNativeTarget "Toast" */;
1173 1296 buildPhases = (
1174   - 47AA244DE0C8B2C0F0A585D845356E59 /* Sources */,
1175   - 99195E4207764744AEC07ECCBCD550EB /* Frameworks */,
1176   - B4002B6E97835FDCCAA5963EFE09A3E0 /* Headers */,
  1297 + 79932E9ED35709FA36DAA32135866D9D /* Sources */,
  1298 + 1EA38DA40C4FF7316B10B0C373342222 /* Frameworks */,
  1299 + 7BF8D8F75CF7B473D8F3BDEA7AB7C2F5 /* Headers */,
1177 1300 );
1178 1301 buildRules = (
1179 1302 );
1180 1303 dependencies = (
1181 1304 );
1182   - name = Alamofire;
1183   - productName = Alamofire;
1184   - productReference = E956F54FF76DE5D347505F3AF7694F03 /* Alamofire.framework */;
  1305 + name = Toast;
  1306 + productName = Toast;
  1307 + productReference = 507695995D3D9F4276EAFC4603ABFF54 /* Toast.framework */;
1185 1308 productType = "com.apple.product-type.framework";
1186 1309 };
1187   - 89B82C8C6E32CEBE5ACCD75CDFBECBB1 /* Pods-ParentAssistant */ = {
  1310 + 637267420040487628765A2667620742 /* SVProgressHUD */ = {
1188 1311 isa = PBXNativeTarget;
1189   - buildConfigurationList = 7700DD54DACF55CC6BABF28FFCAB0179 /* Build configuration list for PBXNativeTarget "Pods-ParentAssistant" */;
  1312 + buildConfigurationList = FA57B4E379EB61FD555A1581DE341347 /* Build configuration list for PBXNativeTarget "SVProgressHUD" */;
1190 1313 buildPhases = (
1191   - 2A36054EE1FDECDCC35954B655C4C237 /* Sources */,
1192   - D871485AC7FB55A15B0AC2046B09D62B /* Frameworks */,
1193   - CB17733CFD076ED5E2BE1AACA72ED979 /* Headers */,
  1314 + 7C58861F3C1AEC0E4A32341701B2D521 /* Sources */,
  1315 + 223B4FF7CBCA930946A68B4E3FF7DEB6 /* Frameworks */,
  1316 + 3A99AD81C47C25583B8F58920EC0C7EC /* Headers */,
  1317 + B50F0C15B731FE36879301E18C3056E3 /* Resources */,
1194 1318 );
1195 1319 buildRules = (
1196 1320 );
1197 1321 dependencies = (
1198   - 954A722A2C8F32AE6348DAD3CFC2DFE4 /* PBXTargetDependency */,
1199   - 02C0DEC84BDA70532ADA225A5A2A3304 /* PBXTargetDependency */,
1200   - 9D4E5F870098A82524B3E139E921E49C /* PBXTargetDependency */,
1201   - 65D67D71AAC210DB47EAC622F7FA69B9 /* PBXTargetDependency */,
1202   - 91447221DA6C2FBBF7167A4B974044D2 /* PBXTargetDependency */,
1203   - BBA7098DD5EA0680F81007C50C09B686 /* PBXTargetDependency */,
1204   - 59040B7DE59B45C468C5A827B43DF38A /* PBXTargetDependency */,
1205   - F54C3AB44B6273AFC143292EBABDE7C4 /* PBXTargetDependency */,
1206   - E82DBF544557B801D7515E53ABBE9C31 /* PBXTargetDependency */,
1207 1322 );
1208   - name = "Pods-ParentAssistant";
1209   - productName = "Pods-ParentAssistant";
1210   - productReference = B88D8470A1A1E4F507B1E9895B074253 /* Pods_ParentAssistant.framework */;
  1323 + name = SVProgressHUD;
  1324 + productName = SVProgressHUD;
  1325 + productReference = 344E5051853CBAE87166BAA69476DDB1 /* SVProgressHUD.framework */;
1211 1326 productType = "com.apple.product-type.framework";
1212 1327 };
1213   - 8FA4EA707F3B6CFDACB1C85C722D2E73 /* SDWebImage */ = {
  1328 + 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */ = {
1214 1329 isa = PBXNativeTarget;
1215   - buildConfigurationList = 4B18822C8ECAB5D855CCE64E74C621EB /* Build configuration list for PBXNativeTarget "SDWebImage" */;
  1330 + buildConfigurationList = 419E5D95491847CD79841B971A8A3277 /* Build configuration list for PBXNativeTarget "Alamofire" */;
1216 1331 buildPhases = (
1217   - 6A550F80A385350F20B576B15B31547E /* Sources */,
1218   - E44680339038F2F0730AF783DAEFFCB6 /* Frameworks */,
1219   - 9842775420762B806F91922E6A2DB1FC /* Headers */,
  1332 + 47AA244DE0C8B2C0F0A585D845356E59 /* Sources */,
  1333 + 99195E4207764744AEC07ECCBCD550EB /* Frameworks */,
  1334 + B4002B6E97835FDCCAA5963EFE09A3E0 /* Headers */,
1220 1335 );
1221 1336 buildRules = (
1222 1337 );
1223 1338 dependencies = (
1224 1339 );
1225   - name = SDWebImage;
1226   - productName = SDWebImage;
1227   - productReference = CE1C92985D9321104698E3AFAF68594E /* SDWebImage.framework */;
  1340 + name = Alamofire;
  1341 + productName = Alamofire;
  1342 + productReference = 937EE30FD85AB8EED4F8467502DD290F /* Alamofire.framework */;
1228 1343 productType = "com.apple.product-type.framework";
1229 1344 };
1230   - 9A9DDC64623B3F5E6DC7009C16752B95 /* Toast */ = {
  1345 + 9EFE4C70245EE2857D336B8B9FA4E825 /* AlamofireImage */ = {
1231 1346 isa = PBXNativeTarget;
1232   - buildConfigurationList = F11A26D3E7766CBBD820DCD66B6FC321 /* Build configuration list for PBXNativeTarget "Toast" */;
  1347 + buildConfigurationList = 01F2198AF9DCCF3700AE9DD21E64D480 /* Build configuration list for PBXNativeTarget "AlamofireImage" */;
1233 1348 buildPhases = (
1234   - F437D84355ADAD46DE352A42EFA6A50A /* Sources */,
1235   - 46A2C828E74BB80E0DE22F9A57D702B2 /* Frameworks */,
1236   - 099CB4115CBACF33248BB7711972A81E /* Headers */,
  1349 + 89780FCE56CA2BB731B3A99F5FC88440 /* Sources */,
  1350 + BF98FBBDC964E0CC738F6B323B4C1BB8 /* Frameworks */,
  1351 + EB21FD03B7703901958C3CE43325DAE9 /* Headers */,
1237 1352 );
1238 1353 buildRules = (
1239 1354 );
1240 1355 dependencies = (
  1356 + 8937A2057A0DAADF003B7C65E7CE115D /* PBXTargetDependency */,
1241 1357 );
1242   - name = Toast;
1243   - productName = Toast;
1244   - productReference = A59A469B0852E07D2428D72E4C62B1E7 /* Toast.framework */;
  1358 + name = AlamofireImage;
  1359 + productName = AlamofireImage;
  1360 + productReference = B9806961B1DB01F087677787DFCC6CE0 /* AlamofireImage.framework */;
1245 1361 productType = "com.apple.product-type.framework";
1246 1362 };
1247   - AAC4087A5A57F5566AB9B54FEBADBC36 /* Reachability */ = {
  1363 + A0A5E57D4BB5AA2602B591D713407086 /* SwiftHash */ = {
1248 1364 isa = PBXNativeTarget;
1249   - buildConfigurationList = 5AD50E3B4812FC9FAE4961CBCA56B874 /* Build configuration list for PBXNativeTarget "Reachability" */;
  1365 + buildConfigurationList = 58F24DE1FC95F96D43F56B9CC6D0B926 /* Build configuration list for PBXNativeTarget "SwiftHash" */;
1250 1366 buildPhases = (
1251   - FA661C521ABA5EDB2937799E80C70EC2 /* Sources */,
1252   - EBA80D6B1394A46D45B033AB75657E91 /* Frameworks */,
1253   - 6AEF8DFADC67B16F108F1855C41820B4 /* Headers */,
  1367 + 7376B1A2F80BE300C4F12BD1B8DB3418 /* Sources */,
  1368 + 62158AC2B12F4A1FA191B1DD22989FE1 /* Frameworks */,
  1369 + 4A32D4B1A74FEE2326E518DF531B9262 /* Headers */,
1254 1370 );
1255 1371 buildRules = (
1256 1372 );
1257 1373 dependencies = (
1258 1374 );
1259   - name = Reachability;
1260   - productName = Reachability;
1261   - productReference = 5C3FCED1EF014BDAA42DACC871E2516A /* Reachability.framework */;
  1375 + name = SwiftHash;
  1376 + productName = SwiftHash;
  1377 + productReference = 52303324A62AD0B74F2DD46E74D232EB /* SwiftHash.framework */;
1262 1378 productType = "com.apple.product-type.framework";
1263 1379 };
1264   - D386C75EFD4F03725E4EFB866B600B9A /* DZNEmptyDataSet */ = {
  1380 + CE1092398200ECC7DE7468626D1D0B98 /* Reachability */ = {
1265 1381 isa = PBXNativeTarget;
1266   - buildConfigurationList = AC2CBCE24382919CB3DBFC8BB3CC6503 /* Build configuration list for PBXNativeTarget "DZNEmptyDataSet" */;
  1382 + buildConfigurationList = C3C11F185D4F7CF61CB8BBE64492631D /* Build configuration list for PBXNativeTarget "Reachability" */;
1267 1383 buildPhases = (
1268   - 82133C5570CF5246210CB90DB6D6558B /* Sources */,
1269   - 59E0885EF9D269547F22DB9E026FB793 /* Frameworks */,
1270   - 653FFE72514B935712D0CE1053D47AD6 /* Headers */,
  1384 + C3136CF9BAFDECBEB2E6A9CCD8BECDAE /* Sources */,
  1385 + 56B1A45788A7E3C5C89C92256F33AE24 /* Frameworks */,
  1386 + 716B553DB26B96E823BC570F96E11E54 /* Headers */,
1271 1387 );
1272 1388 buildRules = (
1273 1389 );
1274 1390 dependencies = (
1275 1391 );
1276   - name = DZNEmptyDataSet;
1277   - productName = DZNEmptyDataSet;
1278   - productReference = DD0E89B8C1439B9F5FDB39EA0232B3EA /* DZNEmptyDataSet.framework */;
  1392 + name = Reachability;
  1393 + productName = Reachability;
  1394 + productReference = 95CAD531E474553E7D52B95131219D1A /* Reachability.framework */;
1279 1395 productType = "com.apple.product-type.framework";
1280 1396 };
1281   - E55BDEBC8F73D6B7936791D0822F70D6 /* SVProgressHUD */ = {
  1397 + D386C75EFD4F03725E4EFB866B600B9A /* DZNEmptyDataSet */ = {
1282 1398 isa = PBXNativeTarget;
1283   - buildConfigurationList = EAC632F2AAB82F696A1E5C88D53A883E /* Build configuration list for PBXNativeTarget "SVProgressHUD" */;
  1399 + buildConfigurationList = AC2CBCE24382919CB3DBFC8BB3CC6503 /* Build configuration list for PBXNativeTarget "DZNEmptyDataSet" */;
1284 1400 buildPhases = (
1285   - 1965A36474F1989545B82D09EC945BE8 /* Sources */,
1286   - A115DC87278A31F6B371DA2C1AF9CD02 /* Frameworks */,
1287   - 8FE5C58C0325111F27713A45110DDD2F /* Headers */,
1288   - B5487BE37E5D2B17C0D915B89665B3F5 /* Resources */,
  1401 + 82133C5570CF5246210CB90DB6D6558B /* Sources */,
  1402 + 59E0885EF9D269547F22DB9E026FB793 /* Frameworks */,
  1403 + 653FFE72514B935712D0CE1053D47AD6 /* Headers */,
1289 1404 );
1290 1405 buildRules = (
1291 1406 );
1292 1407 dependencies = (
1293 1408 );
1294   - name = SVProgressHUD;
1295   - productName = SVProgressHUD;
1296   - productReference = 33F1F6213579E70C284C8445EBD7DBDD /* SVProgressHUD.framework */;
  1409 + name = DZNEmptyDataSet;
  1410 + productName = DZNEmptyDataSet;
  1411 + productReference = 7C9D89FB057D8F2ECBB232C7A81EF4B5 /* DZNEmptyDataSet.framework */;
1297 1412 productType = "com.apple.product-type.framework";
1298 1413 };
1299 1414 /* End PBXNativeTarget section */
... ... @@ -1313,74 +1428,45 @@
1313 1428 en,
1314 1429 );
1315 1430 mainGroup = 7DB346D0F39D3F0E887471402A8071AB;
1316   - productRefGroup = 9CE129D1A72CFA1DEF6F85FBF1B37E5B /* Products */;
  1431 + productRefGroup = 3A24F7BBB5CB0025CF2072B4FB964C24 /* Products */;
1317 1432 projectDirPath = "";
1318 1433 projectRoot = "";
1319 1434 targets = (
1320 1435 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */,
  1436 + 9EFE4C70245EE2857D336B8B9FA4E825 /* AlamofireImage */,
1321 1437 D386C75EFD4F03725E4EFB866B600B9A /* DZNEmptyDataSet */,
1322 1438 1465651EBBC44AD3276DDE2476CDA450 /* HandyJSON */,
1323   - 89B82C8C6E32CEBE5ACCD75CDFBECBB1 /* Pods-ParentAssistant */,
1324   - AAC4087A5A57F5566AB9B54FEBADBC36 /* Reachability */,
1325   - 8FA4EA707F3B6CFDACB1C85C722D2E73 /* SDWebImage */,
1326   - E55BDEBC8F73D6B7936791D0822F70D6 /* SVProgressHUD */,
1327   - 6376DC419EEA98495631602218A4F31B /* SwiftHash */,
1328   - 9A9DDC64623B3F5E6DC7009C16752B95 /* Toast */,
1329   - 27189F0EDBCA8831C460D0166F6F37A1 /* XRCarouselView */,
  1439 + 3DE44D61FA676CE3B5DFDE6DC058A636 /* Pods-ParentAssistant */,
  1440 + CE1092398200ECC7DE7468626D1D0B98 /* Reachability */,
  1441 + 37F4E36BECBDD0070D2501E766C0238B /* SDWebImage */,
  1442 + 637267420040487628765A2667620742 /* SVProgressHUD */,
  1443 + A0A5E57D4BB5AA2602B591D713407086 /* SwiftHash */,
  1444 + 620180280B57A3DF973662E546D211E4 /* Toast */,
  1445 + 0A4402E270B0A4B00A031931BD805EF1 /* XRCarouselView */,
1330 1446 );
1331 1447 };
1332 1448 /* End PBXProject section */
1333 1449  
1334 1450 /* Begin PBXResourcesBuildPhase section */
1335   - B5487BE37E5D2B17C0D915B89665B3F5 /* Resources */ = {
  1451 + 3902916FBFDC0C6606E9AFDBFBD7F267 /* Resources */ = {
1336 1452 isa = PBXResourcesBuildPhase;
1337 1453 buildActionMask = 2147483647;
1338 1454 files = (
1339   - B575E905525EDD3311A9872A0C4307AD /* SVProgressHUD.bundle in Resources */,
  1455 + ECE9CADAD4EB77DEC8B08FD74D6DD3BE /* XRPlaceholder.png in Resources */,
1340 1456 );
1341 1457 runOnlyForDeploymentPostprocessing = 0;
1342 1458 };
1343   - F5D5D2A3D9EE0A5E1C3E82E64D42CDD6 /* Resources */ = {
  1459 + B50F0C15B731FE36879301E18C3056E3 /* Resources */ = {
1344 1460 isa = PBXResourcesBuildPhase;
1345 1461 buildActionMask = 2147483647;
1346 1462 files = (
1347   - 603F9D0686CE005205D389C1E4C6072A /* XRPlaceholder.png in Resources */,
  1463 + 945146A0826BB693F1B9496A0620A97F /* SVProgressHUD.bundle in Resources */,
1348 1464 );
1349 1465 runOnlyForDeploymentPostprocessing = 0;
1350 1466 };
1351 1467 /* End PBXResourcesBuildPhase section */
1352 1468  
1353 1469 /* Begin PBXSourcesBuildPhase section */
1354   - 1965A36474F1989545B82D09EC945BE8 /* Sources */ = {
1355   - isa = PBXSourcesBuildPhase;
1356   - buildActionMask = 2147483647;
1357   - files = (
1358   - E990A247D80417D4555735E8A8DBD76C /* SVIndefiniteAnimatedView.m in Sources */,
1359   - 0C4EA35F79172E81D6BF56A2FC856ED8 /* SVProgressAnimatedView.m in Sources */,
1360   - AB6A5752C4586385EE13F1E6E2E9F40E /* SVProgressHUD-dummy.m in Sources */,
1361   - F79EC3C3CF96DFC885E8DD247FEF08EB /* SVProgressHUD.m in Sources */,
1362   - 86930F980FA87FB0CA5E197FEAA7A90C /* SVRadialGradientLayer.m in Sources */,
1363   - );
1364   - runOnlyForDeploymentPostprocessing = 0;
1365   - };
1366   - 1B8C7048A91070CF34162BF979720918 /* Sources */ = {
1367   - isa = PBXSourcesBuildPhase;
1368   - buildActionMask = 2147483647;
1369   - files = (
1370   - 794B16FD139EB13BA49AE711C49135BB /* MD5.swift in Sources */,
1371   - 90B1C77BB42755C3E9AC821A09526E53 /* SHA1.swift in Sources */,
1372   - D603EC0AAE41B1733F0A4A2FA4381910 /* SwiftHash-dummy.m in Sources */,
1373   - );
1374   - runOnlyForDeploymentPostprocessing = 0;
1375   - };
1376   - 2A36054EE1FDECDCC35954B655C4C237 /* Sources */ = {
1377   - isa = PBXSourcesBuildPhase;
1378   - buildActionMask = 2147483647;
1379   - files = (
1380   - 6694F9A05D6A58C5C27935913BF8AE56 /* Pods-ParentAssistant-dummy.m in Sources */,
1381   - );
1382   - runOnlyForDeploymentPostprocessing = 0;
1383   - };
1384 1470 47AA244DE0C8B2C0F0A585D845356E59 /* Sources */ = {
1385 1471 isa = PBXSourcesBuildPhase;
1386 1472 buildActionMask = 2147483647;
... ... @@ -1406,34 +1492,34 @@
1406 1492 );
1407 1493 runOnlyForDeploymentPostprocessing = 0;
1408 1494 };
1409   - 583C8401A8273215767A6E78D9832675 /* Sources */ = {
  1495 + 7376B1A2F80BE300C4F12BD1B8DB3418 /* Sources */ = {
  1496 + isa = PBXSourcesBuildPhase;
  1497 + buildActionMask = 2147483647;
  1498 + files = (
  1499 + C4DC2D005B7A1313DF98AFF23E15D1B3 /* MD5.swift in Sources */,
  1500 + B58BEA72F3BC139D3784844F73AA791F /* SHA1.swift in Sources */,
  1501 + CB5529FBDB9ED31E939EFD0EF7D8EBE3 /* SwiftHash-dummy.m in Sources */,
  1502 + );
  1503 + runOnlyForDeploymentPostprocessing = 0;
  1504 + };
  1505 + 79932E9ED35709FA36DAA32135866D9D /* Sources */ = {
1410 1506 isa = PBXSourcesBuildPhase;
1411 1507 buildActionMask = 2147483647;
1412 1508 files = (
1413   - A8D327620CE1909AD98F6B239AA60018 /* XRCarouselView-dummy.m in Sources */,
1414   - 3DD10D4C59666719E941A5D0EB5D9582 /* XRCarouselView.m in Sources */,
  1509 + DC9317C7F961BB389FA7ECC2260B08F0 /* Toast-dummy.m in Sources */,
  1510 + 5D287B058202AFDA4DED5D49B6ED0A1E /* UIView+Toast.m in Sources */,
1415 1511 );
1416 1512 runOnlyForDeploymentPostprocessing = 0;
1417 1513 };
1418   - 6A550F80A385350F20B576B15B31547E /* Sources */ = {
  1514 + 7C58861F3C1AEC0E4A32341701B2D521 /* Sources */ = {
1419 1515 isa = PBXSourcesBuildPhase;
1420 1516 buildActionMask = 2147483647;
1421 1517 files = (
1422   - 17F8D48B0736FD13AC59D9311C074E9D /* NSData+ImageContentType.m in Sources */,
1423   - BF901FE99C862B2093FF8E2F71B80F93 /* SDImageCache.m in Sources */,
1424   - 27813DC0914AD972436022C87454185F /* SDWebImage-dummy.m in Sources */,
1425   - 7AC13BF7B3C538D94DE7B9D836786514 /* SDWebImageCompat.m in Sources */,
1426   - D1D5D64268DDC619511D3942F434D7DD /* SDWebImageDecoder.m in Sources */,
1427   - 1C39565C535B7D534368C5DFB46659B5 /* SDWebImageDownloader.m in Sources */,
1428   - F1A921225B642E15ED24FB4734240F8F /* SDWebImageDownloaderOperation.m in Sources */,
1429   - 38BC499B109AEBC02AD6C88AB2ED057D /* SDWebImageManager.m in Sources */,
1430   - 6C3C226E0B46AFC4FD756BA6C5D9414E /* SDWebImagePrefetcher.m in Sources */,
1431   - 170AB456D9F3C346DCF407E42D84B5D5 /* UIButton+WebCache.m in Sources */,
1432   - C633AE7C1F16ADA3AFEE968396B73A4B /* UIImage+GIF.m in Sources */,
1433   - BD2E6B5D9C3C38D8C1BDCFE0CD6E489D /* UIImage+MultiFormat.m in Sources */,
1434   - C8D2BE872D244EB549F2EC97069CC4D0 /* UIImageView+HighlightedWebCache.m in Sources */,
1435   - A7B5C0EE248855B3357C98A489F835D9 /* UIImageView+WebCache.m in Sources */,
1436   - BA3AB9E7766B254534C357EB523687B6 /* UIView+WebCacheOperation.m in Sources */,
  1518 + 56815D1138F9669E37F2004119169267 /* SVIndefiniteAnimatedView.m in Sources */,
  1519 + A24D31929B67BB4D0EED65AA74C0E3F9 /* SVProgressAnimatedView.m in Sources */,
  1520 + 33FCBEF6884A33B921FEC6A9511B8E20 /* SVProgressHUD-dummy.m in Sources */,
  1521 + BBC827F8711B46CA8FC3854C99DF703A /* SVProgressHUD.m in Sources */,
  1522 + 1F4FA4B67BA7582CA193404E3510B095 /* SVRadialGradientLayer.m in Sources */,
1437 1523 );
1438 1524 runOnlyForDeploymentPostprocessing = 0;
1439 1525 };
... ... @@ -1446,6 +1532,71 @@
1446 1532 );
1447 1533 runOnlyForDeploymentPostprocessing = 0;
1448 1534 };
  1535 + 836E6AC4CFA56F3A9B9AC5333F4EB303 /* Sources */ = {
  1536 + isa = PBXSourcesBuildPhase;
  1537 + buildActionMask = 2147483647;
  1538 + files = (
  1539 + 4FAADAA79CF5A8371B74578A2EC10761 /* XRCarouselView-dummy.m in Sources */,
  1540 + 980154A8EB800AAF627251C8AAD7EAA9 /* XRCarouselView.m in Sources */,
  1541 + );
  1542 + runOnlyForDeploymentPostprocessing = 0;
  1543 + };
  1544 + 89780FCE56CA2BB731B3A99F5FC88440 /* Sources */ = {
  1545 + isa = PBXSourcesBuildPhase;
  1546 + buildActionMask = 2147483647;
  1547 + files = (
  1548 + FF0007F0502C85600F98BC8E62F739D2 /* AFIError.swift in Sources */,
  1549 + 18FE70ED14474EE6A49E85DE9C5E4C17 /* AlamofireImage-dummy.m in Sources */,
  1550 + 60E47009DC055C6C140154BC96B5C58C /* Image.swift in Sources */,
  1551 + F254CF02931202CD44537EAD61D27BE8 /* ImageCache.swift in Sources */,
  1552 + 9D9717AC018F075F378E52B078CDBFB5 /* ImageDownloader.swift in Sources */,
  1553 + 9E686D93A33DD9756B0C21B68BD7D758 /* ImageFilter.swift in Sources */,
  1554 + 9DBB6831E79F70D2E8C4DFD169E228E2 /* Request+AlamofireImage.swift in Sources */,
  1555 + A133EAE3F50C55B4E1A03A5F9D6B3A4B /* UIButton+AlamofireImage.swift in Sources */,
  1556 + 85B4114292AEC3C6DCD2F9500A064F9B /* UIImage+AlamofireImage.swift in Sources */,
  1557 + 36840E12F93D5E0D201B1D998B96EEB9 /* UIImageView+AlamofireImage.swift in Sources */,
  1558 + );
  1559 + runOnlyForDeploymentPostprocessing = 0;
  1560 + };
  1561 + B0A80FA96AA24569F8AB376B609B0706 /* Sources */ = {
  1562 + isa = PBXSourcesBuildPhase;
  1563 + buildActionMask = 2147483647;
  1564 + files = (
  1565 + CBFDD17FED69C5F001648B331CE5FDDE /* Pods-ParentAssistant-dummy.m in Sources */,
  1566 + );
  1567 + runOnlyForDeploymentPostprocessing = 0;
  1568 + };
  1569 + BA7C56D0F2745E59EEA82D7E504CAAB3 /* Sources */ = {
  1570 + isa = PBXSourcesBuildPhase;
  1571 + buildActionMask = 2147483647;
  1572 + files = (
  1573 + 189863C7E2504923687D78D7B081F8CA /* NSData+ImageContentType.m in Sources */,
  1574 + 5D8FA1EAFFDA438C0D3E909D54D6E657 /* SDImageCache.m in Sources */,
  1575 + 80AF024EF162F4FB88CCAAA2FA6FAAD5 /* SDWebImage-dummy.m in Sources */,
  1576 + 2EA01E4E252B14F7953C56C100482236 /* SDWebImageCompat.m in Sources */,
  1577 + 1A34F151BC19E9D0725C689FC1038209 /* SDWebImageDecoder.m in Sources */,
  1578 + 29B1FA33CD27E5CAEC884DA6D0072CFC /* SDWebImageDownloader.m in Sources */,
  1579 + 3D34EECD1D7C0DC13F3E19C4C74F212E /* SDWebImageDownloaderOperation.m in Sources */,
  1580 + 53591DA77C42B53EB9AB3060008F41B6 /* SDWebImageManager.m in Sources */,
  1581 + 9FC9BC048B02CFF720B9CFBE4DC80264 /* SDWebImagePrefetcher.m in Sources */,
  1582 + 638A8C8931AA82B35E4165A32BDEF8CA /* UIButton+WebCache.m in Sources */,
  1583 + 59145DFC87F4E74844E76619E8C4114D /* UIImage+GIF.m in Sources */,
  1584 + 3D0142A71F210A641528761123C4F1C2 /* UIImage+MultiFormat.m in Sources */,
  1585 + E90F4E9FD8EA1D01B118497ACBB199D8 /* UIImageView+HighlightedWebCache.m in Sources */,
  1586 + 3A9E64415250045D18CD329DE4776D9A /* UIImageView+WebCache.m in Sources */,
  1587 + 5D0701D0FA9726E83C52A53F4BEAD02B /* UIView+WebCacheOperation.m in Sources */,
  1588 + );
  1589 + runOnlyForDeploymentPostprocessing = 0;
  1590 + };
  1591 + C3136CF9BAFDECBEB2E6A9CCD8BECDAE /* Sources */ = {
  1592 + isa = PBXSourcesBuildPhase;
  1593 + buildActionMask = 2147483647;
  1594 + files = (
  1595 + D22AD2613455598A94BFCCA33AA9B2CE /* Reachability-dummy.m in Sources */,
  1596 + 666A863EA9B0A00CA5EDDB4C96EA014B /* Reachability.m in Sources */,
  1597 + );
  1598 + runOnlyForDeploymentPostprocessing = 0;
  1599 + };
1449 1600 EE0067F8658DBC2B557D26C46C0796CA /* Sources */ = {
1450 1601 isa = PBXSourcesBuildPhase;
1451 1602 buildActionMask = 2147483647;
... ... @@ -1486,87 +1637,81 @@
1486 1637 );
1487 1638 runOnlyForDeploymentPostprocessing = 0;
1488 1639 };
1489   - F437D84355ADAD46DE352A42EFA6A50A /* Sources */ = {
1490   - isa = PBXSourcesBuildPhase;
1491   - buildActionMask = 2147483647;
1492   - files = (
1493   - CAD7174B4833082EAE9507FB4CDCB07B /* Toast-dummy.m in Sources */,
1494   - 44E9442A5B676A7E4941C47EB6C49C9F /* UIView+Toast.m in Sources */,
1495   - );
1496   - runOnlyForDeploymentPostprocessing = 0;
1497   - };
1498   - FA661C521ABA5EDB2937799E80C70EC2 /* Sources */ = {
1499   - isa = PBXSourcesBuildPhase;
1500   - buildActionMask = 2147483647;
1501   - files = (
1502   - 8B937C355B5CAAEC40B80F24AFA26569 /* Reachability-dummy.m in Sources */,
1503   - 0203C16E98AD37E5A0C596D1B39C5119 /* Reachability.m in Sources */,
1504   - );
1505   - runOnlyForDeploymentPostprocessing = 0;
1506   - };
1507 1640 /* End PBXSourcesBuildPhase section */
1508 1641  
1509 1642 /* Begin PBXTargetDependency section */
1510   - 02C0DEC84BDA70532ADA225A5A2A3304 /* PBXTargetDependency */ = {
  1643 + 0271B3B581BEDB99AD2D8A82A7A51FE7 /* PBXTargetDependency */ = {
  1644 + isa = PBXTargetDependency;
  1645 + name = Reachability;
  1646 + target = CE1092398200ECC7DE7468626D1D0B98 /* Reachability */;
  1647 + targetProxy = C3177531DBE096BDE468C9291366B775 /* PBXContainerItemProxy */;
  1648 + };
  1649 + 03000FBE28A1D37021A99C22E5DC6577 /* PBXTargetDependency */ = {
  1650 + isa = PBXTargetDependency;
  1651 + name = SwiftHash;
  1652 + target = A0A5E57D4BB5AA2602B591D713407086 /* SwiftHash */;
  1653 + targetProxy = 4B6C29399AB72BDC0DC80584EC3BD333 /* PBXContainerItemProxy */;
  1654 + };
  1655 + 0B0575AE71362DA3E174564EB6435F59 /* PBXTargetDependency */ = {
  1656 + isa = PBXTargetDependency;
  1657 + name = HandyJSON;
  1658 + target = 1465651EBBC44AD3276DDE2476CDA450 /* HandyJSON */;
  1659 + targetProxy = 189D44E9EA4F94C8EC2EBCD3B9A94437 /* PBXContainerItemProxy */;
  1660 + };
  1661 + 0F0709264E6CBE1FC5B2108AFA9A1EBC /* PBXTargetDependency */ = {
1511 1662 isa = PBXTargetDependency;
1512 1663 name = DZNEmptyDataSet;
1513 1664 target = D386C75EFD4F03725E4EFB866B600B9A /* DZNEmptyDataSet */;
1514   - targetProxy = 40A6BB26078AD6CC3BFED24490AA679C /* PBXContainerItemProxy */;
  1665 + targetProxy = 1DC0B6708B1B4007743DC8E966822305 /* PBXContainerItemProxy */;
1515 1666 };
1516   - 59040B7DE59B45C468C5A827B43DF38A /* PBXTargetDependency */ = {
  1667 + 400980F7465C7DCC1DF6E89055AD0B96 /* PBXTargetDependency */ = {
1517 1668 isa = PBXTargetDependency;
1518   - name = SwiftHash;
1519   - target = 6376DC419EEA98495631602218A4F31B /* SwiftHash */;
1520   - targetProxy = 14508FFAEE6EBD1C2386229671393CCD /* PBXContainerItemProxy */;
  1669 + name = AlamofireImage;
  1670 + target = 9EFE4C70245EE2857D336B8B9FA4E825 /* AlamofireImage */;
  1671 + targetProxy = 4AE51A1942CC8930F7A20592BF7BC9CB /* PBXContainerItemProxy */;
1521 1672 };
1522   - 65D67D71AAC210DB47EAC622F7FA69B9 /* PBXTargetDependency */ = {
  1673 + 48DB56871980177AD76344D30AAA6812 /* PBXTargetDependency */ = {
1523 1674 isa = PBXTargetDependency;
1524   - name = Reachability;
1525   - target = AAC4087A5A57F5566AB9B54FEBADBC36 /* Reachability */;
1526   - targetProxy = 82A515E1EF9A2DA9422FDE7D829F0650 /* PBXContainerItemProxy */;
  1675 + name = Toast;
  1676 + target = 620180280B57A3DF973662E546D211E4 /* Toast */;
  1677 + targetProxy = 9554361F88EB7FDE40F109D073B49910 /* PBXContainerItemProxy */;
1527 1678 };
1528   - 91447221DA6C2FBBF7167A4B974044D2 /* PBXTargetDependency */ = {
  1679 + 5088DA9186A8D1DD902822E13A654208 /* PBXTargetDependency */ = {
1529 1680 isa = PBXTargetDependency;
1530   - name = SDWebImage;
1531   - target = 8FA4EA707F3B6CFDACB1C85C722D2E73 /* SDWebImage */;
1532   - targetProxy = 1F4310C891A7C6531B2EC2F44755F5D2 /* PBXContainerItemProxy */;
  1681 + name = SVProgressHUD;
  1682 + target = 637267420040487628765A2667620742 /* SVProgressHUD */;
  1683 + targetProxy = CA2DE504A4CA7EA9E0FBEE6863FE1B71 /* PBXContainerItemProxy */;
1533 1684 };
1534   - 954A722A2C8F32AE6348DAD3CFC2DFE4 /* PBXTargetDependency */ = {
  1685 + 8937A2057A0DAADF003B7C65E7CE115D /* PBXTargetDependency */ = {
1535 1686 isa = PBXTargetDependency;
1536 1687 name = Alamofire;
1537 1688 target = 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */;
1538   - targetProxy = A81D9D0AD4D99710674892A4C13CE7C4 /* PBXContainerItemProxy */;
  1689 + targetProxy = A1758AA696D56310AA192B587162169A /* PBXContainerItemProxy */;
1539 1690 };
1540   - 9D4E5F870098A82524B3E139E921E49C /* PBXTargetDependency */ = {
  1691 + AF98B4E6DC1B79AE4FD9FD930B0E2C69 /* PBXTargetDependency */ = {
1541 1692 isa = PBXTargetDependency;
1542   - name = HandyJSON;
1543   - target = 1465651EBBC44AD3276DDE2476CDA450 /* HandyJSON */;
1544   - targetProxy = EE8B3E8B9AA89EC765C0E539B4E7EDC7 /* PBXContainerItemProxy */;
  1693 + name = Alamofire;
  1694 + target = 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */;
  1695 + targetProxy = B52B9C3E170467E0CA53E1CF539F3C3C /* PBXContainerItemProxy */;
1545 1696 };
1546   - BBA7098DD5EA0680F81007C50C09B686 /* PBXTargetDependency */ = {
  1697 + C91D8AEA00A921168C007D309B135C5D /* PBXTargetDependency */ = {
1547 1698 isa = PBXTargetDependency;
1548   - name = SVProgressHUD;
1549   - target = E55BDEBC8F73D6B7936791D0822F70D6 /* SVProgressHUD */;
1550   - targetProxy = 8EE514F180AE8F72FA2CB958642AC2D2 /* PBXContainerItemProxy */;
  1699 + name = SDWebImage;
  1700 + target = 37F4E36BECBDD0070D2501E766C0238B /* SDWebImage */;
  1701 + targetProxy = 38E587F9ED2E7A43122E76199C12388D /* PBXContainerItemProxy */;
1551 1702 };
1552   - E82DBF544557B801D7515E53ABBE9C31 /* PBXTargetDependency */ = {
  1703 + D7A715C58A0231CE8EF5720E0B2201C5 /* PBXTargetDependency */ = {
1553 1704 isa = PBXTargetDependency;
1554 1705 name = XRCarouselView;
1555   - target = 27189F0EDBCA8831C460D0166F6F37A1 /* XRCarouselView */;
1556   - targetProxy = 594A8718DA74EC137A691ED506FE6CCB /* PBXContainerItemProxy */;
1557   - };
1558   - F54C3AB44B6273AFC143292EBABDE7C4 /* PBXTargetDependency */ = {
1559   - isa = PBXTargetDependency;
1560   - name = Toast;
1561   - target = 9A9DDC64623B3F5E6DC7009C16752B95 /* Toast */;
1562   - targetProxy = 8E7E6D806A10070D238FC81F6BAB4860 /* PBXContainerItemProxy */;
  1706 + target = 0A4402E270B0A4B00A031931BD805EF1 /* XRCarouselView */;
  1707 + targetProxy = 4EDB1BF0F4A9280D81BBE57A53DD7917 /* PBXContainerItemProxy */;
1563 1708 };
1564 1709 /* End PBXTargetDependency section */
1565 1710  
1566 1711 /* Begin XCBuildConfiguration section */
1567   - 1456973998A5F20B4501A680D3794F6A /* Release */ = {
  1712 + 0C3F011A578A68CF86694EAD254E6E23 /* Debug */ = {
1568 1713 isa = XCBuildConfiguration;
1569   - baseConfigurationReference = 328C2C3F0CBE7948196AEE1B0FA7B3F4 /* DZNEmptyDataSet.xcconfig */;
  1714 + baseConfigurationReference = 2A58122C4E55BBB959E9F3D985E070AB /* SwiftHash.xcconfig */;
1570 1715 buildSettings = {
1571 1716 CODE_SIGN_IDENTITY = "";
1572 1717 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -1577,27 +1722,27 @@
1577 1722 DYLIB_COMPATIBILITY_VERSION = 1;
1578 1723 DYLIB_CURRENT_VERSION = 1;
1579 1724 DYLIB_INSTALL_NAME_BASE = "@rpath";
1580   - GCC_PREFIX_HEADER = "Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-prefix.pch";
1581   - INFOPLIST_FILE = "Target Support Files/DZNEmptyDataSet/Info.plist";
  1725 + GCC_PREFIX_HEADER = "Target Support Files/SwiftHash/SwiftHash-prefix.pch";
  1726 + INFOPLIST_FILE = "Target Support Files/SwiftHash/Info.plist";
1582 1727 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1583 1728 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1584 1729 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1585   - MODULEMAP_FILE = "Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet.modulemap";
1586   - PRODUCT_NAME = DZNEmptyDataSet;
  1730 + MODULEMAP_FILE = "Target Support Files/SwiftHash/SwiftHash.modulemap";
  1731 + PRODUCT_NAME = SwiftHash;
1587 1732 SDKROOT = iphoneos;
1588 1733 SKIP_INSTALL = YES;
1589 1734 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  1735 + SWIFT_OPTIMIZATION_LEVEL = "-Onone";
1590 1736 SWIFT_VERSION = 4.0;
1591 1737 TARGETED_DEVICE_FAMILY = "1,2";
1592   - VALIDATE_PRODUCT = YES;
1593 1738 VERSIONING_SYSTEM = "apple-generic";
1594 1739 VERSION_INFO_PREFIX = "";
1595 1740 };
1596   - name = Release;
  1741 + name = Debug;
1597 1742 };
1598   - 205040859FD37102CD356142F35D96D4 /* Debug */ = {
  1743 + 11480927D0D767066580AF486506DDA6 /* Release */ = {
1599 1744 isa = XCBuildConfiguration;
1600   - baseConfigurationReference = 6EB59F100C77215BCBB4FAD12F0FF358 /* Pods-ParentAssistant.debug.xcconfig */;
  1745 + baseConfigurationReference = 2A58122C4E55BBB959E9F3D985E070AB /* SwiftHash.xcconfig */;
1601 1746 buildSettings = {
1602 1747 CODE_SIGN_IDENTITY = "";
1603 1748 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -1608,30 +1753,28 @@
1608 1753 DYLIB_COMPATIBILITY_VERSION = 1;
1609 1754 DYLIB_CURRENT_VERSION = 1;
1610 1755 DYLIB_INSTALL_NAME_BASE = "@rpath";
1611   - INFOPLIST_FILE = "Target Support Files/Pods-ParentAssistant/Info.plist";
  1756 + GCC_PREFIX_HEADER = "Target Support Files/SwiftHash/SwiftHash-prefix.pch";
  1757 + INFOPLIST_FILE = "Target Support Files/SwiftHash/Info.plist";
1612 1758 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1613   - IPHONEOS_DEPLOYMENT_TARGET = 9.0;
  1759 + IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1614 1760 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1615   - MACH_O_TYPE = staticlib;
1616   - MODULEMAP_FILE = "Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.modulemap";
1617   - OTHER_LDFLAGS = "";
1618   - OTHER_LIBTOOLFLAGS = "";
1619   - PODS_ROOT = "$(SRCROOT)";
1620   - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
1621   - PRODUCT_NAME = Pods_ParentAssistant;
  1761 + MODULEMAP_FILE = "Target Support Files/SwiftHash/SwiftHash.modulemap";
  1762 + PRODUCT_NAME = SwiftHash;
1622 1763 SDKROOT = iphoneos;
1623 1764 SKIP_INSTALL = YES;
1624   - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
1625   - SWIFT_OPTIMIZATION_LEVEL = "-Onone";
  1765 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  1766 + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
  1767 + SWIFT_VERSION = 4.0;
1626 1768 TARGETED_DEVICE_FAMILY = "1,2";
  1769 + VALIDATE_PRODUCT = YES;
1627 1770 VERSIONING_SYSTEM = "apple-generic";
1628 1771 VERSION_INFO_PREFIX = "";
1629 1772 };
1630   - name = Debug;
  1773 + name = Release;
1631 1774 };
1632   - 20A33051E49990EF2F5D75016374151E /* Release */ = {
  1775 + 1456973998A5F20B4501A680D3794F6A /* Release */ = {
1633 1776 isa = XCBuildConfiguration;
1634   - baseConfigurationReference = 4357F76011180D7A84AB5281135FBC76 /* Reachability.xcconfig */;
  1777 + baseConfigurationReference = 1BF83289F3929832EC0ED8E333158C69 /* DZNEmptyDataSet.xcconfig */;
1635 1778 buildSettings = {
1636 1779 CODE_SIGN_IDENTITY = "";
1637 1780 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -1642,13 +1785,13 @@
1642 1785 DYLIB_COMPATIBILITY_VERSION = 1;
1643 1786 DYLIB_CURRENT_VERSION = 1;
1644 1787 DYLIB_INSTALL_NAME_BASE = "@rpath";
1645   - GCC_PREFIX_HEADER = "Target Support Files/Reachability/Reachability-prefix.pch";
1646   - INFOPLIST_FILE = "Target Support Files/Reachability/Info.plist";
  1788 + GCC_PREFIX_HEADER = "Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-prefix.pch";
  1789 + INFOPLIST_FILE = "Target Support Files/DZNEmptyDataSet/Info.plist";
1647 1790 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1648 1791 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1649 1792 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1650   - MODULEMAP_FILE = "Target Support Files/Reachability/Reachability.modulemap";
1651   - PRODUCT_NAME = Reachability;
  1793 + MODULEMAP_FILE = "Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet.modulemap";
  1794 + PRODUCT_NAME = DZNEmptyDataSet;
1652 1795 SDKROOT = iphoneos;
1653 1796 SKIP_INSTALL = YES;
1654 1797 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
... ... @@ -1660,9 +1803,9 @@
1660 1803 };
1661 1804 name = Release;
1662 1805 };
1663   - 215A480FCE0C128FA2F4C2A2882BBE23 /* Debug */ = {
  1806 + 1C5DAB39976688A93021E071A70593C0 /* Release */ = {
1664 1807 isa = XCBuildConfiguration;
1665   - baseConfigurationReference = 3813A00560E8E809CF107BA098D6A666 /* Toast.xcconfig */;
  1808 + baseConfigurationReference = 187D5302F110245F1D24D217827BFBC1 /* AlamofireImage.xcconfig */;
1666 1809 buildSettings = {
1667 1810 CODE_SIGN_IDENTITY = "";
1668 1811 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -1673,26 +1816,28 @@
1673 1816 DYLIB_COMPATIBILITY_VERSION = 1;
1674 1817 DYLIB_CURRENT_VERSION = 1;
1675 1818 DYLIB_INSTALL_NAME_BASE = "@rpath";
1676   - GCC_PREFIX_HEADER = "Target Support Files/Toast/Toast-prefix.pch";
1677   - INFOPLIST_FILE = "Target Support Files/Toast/Info.plist";
  1819 + GCC_PREFIX_HEADER = "Target Support Files/AlamofireImage/AlamofireImage-prefix.pch";
  1820 + INFOPLIST_FILE = "Target Support Files/AlamofireImage/Info.plist";
1678 1821 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1679 1822 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1680 1823 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1681   - MODULEMAP_FILE = "Target Support Files/Toast/Toast.modulemap";
1682   - PRODUCT_NAME = Toast;
  1824 + MODULEMAP_FILE = "Target Support Files/AlamofireImage/AlamofireImage.modulemap";
  1825 + PRODUCT_NAME = AlamofireImage;
1683 1826 SDKROOT = iphoneos;
1684 1827 SKIP_INSTALL = YES;
1685 1828 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  1829 + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
1686 1830 SWIFT_VERSION = 4.0;
1687 1831 TARGETED_DEVICE_FAMILY = "1,2";
  1832 + VALIDATE_PRODUCT = YES;
1688 1833 VERSIONING_SYSTEM = "apple-generic";
1689 1834 VERSION_INFO_PREFIX = "";
1690 1835 };
1691   - name = Debug;
  1836 + name = Release;
1692 1837 };
1693   - 2386F65ABDB52652A92CBEE14C73BA07 /* Debug */ = {
  1838 + 1F40ECCA7544B21AE3F93FCA732FF525 /* Release */ = {
1694 1839 isa = XCBuildConfiguration;
1695   - baseConfigurationReference = 87D16ABF7E5F8A01191A86657C5C16BA /* XRCarouselView.xcconfig */;
  1840 + baseConfigurationReference = 77EFE064376F26AEED2B1971235A88EF /* Pods-ParentAssistant.release.xcconfig */;
1696 1841 buildSettings = {
1697 1842 CODE_SIGN_IDENTITY = "";
1698 1843 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -1703,26 +1848,30 @@
1703 1848 DYLIB_COMPATIBILITY_VERSION = 1;
1704 1849 DYLIB_CURRENT_VERSION = 1;
1705 1850 DYLIB_INSTALL_NAME_BASE = "@rpath";
1706   - GCC_PREFIX_HEADER = "Target Support Files/XRCarouselView/XRCarouselView-prefix.pch";
1707   - INFOPLIST_FILE = "Target Support Files/XRCarouselView/Info.plist";
  1851 + INFOPLIST_FILE = "Target Support Files/Pods-ParentAssistant/Info.plist";
1708 1852 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1709   - IPHONEOS_DEPLOYMENT_TARGET = 8.0;
  1853 + IPHONEOS_DEPLOYMENT_TARGET = 9.0;
1710 1854 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1711   - MODULEMAP_FILE = "Target Support Files/XRCarouselView/XRCarouselView.modulemap";
1712   - PRODUCT_NAME = XRCarouselView;
  1855 + MACH_O_TYPE = staticlib;
  1856 + MODULEMAP_FILE = "Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.modulemap";
  1857 + OTHER_LDFLAGS = "";
  1858 + OTHER_LIBTOOLFLAGS = "";
  1859 + PODS_ROOT = "$(SRCROOT)";
  1860 + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
  1861 + PRODUCT_NAME = Pods_ParentAssistant;
1713 1862 SDKROOT = iphoneos;
1714 1863 SKIP_INSTALL = YES;
1715   - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
1716   - SWIFT_VERSION = 4.0;
  1864 + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
1717 1865 TARGETED_DEVICE_FAMILY = "1,2";
  1866 + VALIDATE_PRODUCT = YES;
1718 1867 VERSIONING_SYSTEM = "apple-generic";
1719 1868 VERSION_INFO_PREFIX = "";
1720 1869 };
1721   - name = Debug;
  1870 + name = Release;
1722 1871 };
1723   - 2399E3FF594AB08E0DAC9484992C0F91 /* Release */ = {
  1872 + 1F859CD6F320ED91E304126AE9B41213 /* Debug */ = {
1724 1873 isa = XCBuildConfiguration;
1725   - baseConfigurationReference = BF1709B1277BE62B09381A0534563DE2 /* SwiftHash.xcconfig */;
  1874 + baseConfigurationReference = D9320E1CCD06A69A623CACF8D469F5FD /* SDWebImage.xcconfig */;
1726 1875 buildSettings = {
1727 1876 CODE_SIGN_IDENTITY = "";
1728 1877 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -1733,24 +1882,22 @@
1733 1882 DYLIB_COMPATIBILITY_VERSION = 1;
1734 1883 DYLIB_CURRENT_VERSION = 1;
1735 1884 DYLIB_INSTALL_NAME_BASE = "@rpath";
1736   - GCC_PREFIX_HEADER = "Target Support Files/SwiftHash/SwiftHash-prefix.pch";
1737   - INFOPLIST_FILE = "Target Support Files/SwiftHash/Info.plist";
  1885 + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch";
  1886 + INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist";
1738 1887 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1739 1888 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1740 1889 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1741   - MODULEMAP_FILE = "Target Support Files/SwiftHash/SwiftHash.modulemap";
1742   - PRODUCT_NAME = SwiftHash;
  1890 + MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap";
  1891 + PRODUCT_NAME = SDWebImage;
1743 1892 SDKROOT = iphoneos;
1744 1893 SKIP_INSTALL = YES;
1745 1894 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
1746   - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
1747 1895 SWIFT_VERSION = 4.0;
1748 1896 TARGETED_DEVICE_FAMILY = "1,2";
1749   - VALIDATE_PRODUCT = YES;
1750 1897 VERSIONING_SYSTEM = "apple-generic";
1751 1898 VERSION_INFO_PREFIX = "";
1752 1899 };
1753   - name = Release;
  1900 + name = Debug;
1754 1901 };
1755 1902 26F954BA177A9A46FFFD4E23ED11D67A /* Release */ = {
1756 1903 isa = XCBuildConfiguration;
... ... @@ -1810,9 +1957,9 @@
1810 1957 };
1811 1958 name = Release;
1812 1959 };
1813   - 3D9BEB881A70984931EB7B52EB42D89C /* Debug */ = {
  1960 + 2DA5E368920A110F6198A53CE954D348 /* Release */ = {
1814 1961 isa = XCBuildConfiguration;
1815   - baseConfigurationReference = 43766E6C5ADEB0502C1E3C6049C5D9AC /* SVProgressHUD.xcconfig */;
  1962 + baseConfigurationReference = D9320E1CCD06A69A623CACF8D469F5FD /* SDWebImage.xcconfig */;
1816 1963 buildSettings = {
1817 1964 CODE_SIGN_IDENTITY = "";
1818 1965 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -1823,26 +1970,27 @@
1823 1970 DYLIB_COMPATIBILITY_VERSION = 1;
1824 1971 DYLIB_CURRENT_VERSION = 1;
1825 1972 DYLIB_INSTALL_NAME_BASE = "@rpath";
1826   - GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch";
1827   - INFOPLIST_FILE = "Target Support Files/SVProgressHUD/Info.plist";
  1973 + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch";
  1974 + INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist";
1828 1975 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1829 1976 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1830 1977 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1831   - MODULEMAP_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD.modulemap";
1832   - PRODUCT_NAME = SVProgressHUD;
  1978 + MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap";
  1979 + PRODUCT_NAME = SDWebImage;
1833 1980 SDKROOT = iphoneos;
1834 1981 SKIP_INSTALL = YES;
1835 1982 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
1836 1983 SWIFT_VERSION = 4.0;
1837 1984 TARGETED_DEVICE_FAMILY = "1,2";
  1985 + VALIDATE_PRODUCT = YES;
1838 1986 VERSIONING_SYSTEM = "apple-generic";
1839 1987 VERSION_INFO_PREFIX = "";
1840 1988 };
1841   - name = Debug;
  1989 + name = Release;
1842 1990 };
1843   - 51211605D5BBC568B59C86BC410917A5 /* Release */ = {
  1991 + 48B91C10F0EB0CF2F5206AB95226AC0E /* Debug */ = {
1844 1992 isa = XCBuildConfiguration;
1845   - baseConfigurationReference = 43766E6C5ADEB0502C1E3C6049C5D9AC /* SVProgressHUD.xcconfig */;
  1993 + baseConfigurationReference = 9741F11BA31165953D6A9744F073FF08 /* Toast.xcconfig */;
1846 1994 buildSettings = {
1847 1995 CODE_SIGN_IDENTITY = "";
1848 1996 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -1853,27 +2001,26 @@
1853 2001 DYLIB_COMPATIBILITY_VERSION = 1;
1854 2002 DYLIB_CURRENT_VERSION = 1;
1855 2003 DYLIB_INSTALL_NAME_BASE = "@rpath";
1856   - GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch";
1857   - INFOPLIST_FILE = "Target Support Files/SVProgressHUD/Info.plist";
  2004 + GCC_PREFIX_HEADER = "Target Support Files/Toast/Toast-prefix.pch";
  2005 + INFOPLIST_FILE = "Target Support Files/Toast/Info.plist";
1858 2006 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1859 2007 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1860 2008 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1861   - MODULEMAP_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD.modulemap";
1862   - PRODUCT_NAME = SVProgressHUD;
  2009 + MODULEMAP_FILE = "Target Support Files/Toast/Toast.modulemap";
  2010 + PRODUCT_NAME = Toast;
1863 2011 SDKROOT = iphoneos;
1864 2012 SKIP_INSTALL = YES;
1865 2013 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
1866 2014 SWIFT_VERSION = 4.0;
1867 2015 TARGETED_DEVICE_FAMILY = "1,2";
1868   - VALIDATE_PRODUCT = YES;
1869 2016 VERSIONING_SYSTEM = "apple-generic";
1870 2017 VERSION_INFO_PREFIX = "";
1871 2018 };
1872   - name = Release;
  2019 + name = Debug;
1873 2020 };
1874   - 601BFB40515FF6C016B5850C2D905027 /* Release */ = {
  2021 + 5D34B066ADCE4D5A36DAF77492279C57 /* Debug */ = {
1875 2022 isa = XCBuildConfiguration;
1876   - baseConfigurationReference = 77EFE064376F26AEED2B1971235A88EF /* Pods-ParentAssistant.release.xcconfig */;
  2023 + baseConfigurationReference = C746EF0B8C90559C66A538F15D8EBAAF /* SVProgressHUD.xcconfig */;
1877 2024 buildSettings = {
1878 2025 CODE_SIGN_IDENTITY = "";
1879 2026 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -1884,30 +2031,26 @@
1884 2031 DYLIB_COMPATIBILITY_VERSION = 1;
1885 2032 DYLIB_CURRENT_VERSION = 1;
1886 2033 DYLIB_INSTALL_NAME_BASE = "@rpath";
1887   - INFOPLIST_FILE = "Target Support Files/Pods-ParentAssistant/Info.plist";
  2034 + GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch";
  2035 + INFOPLIST_FILE = "Target Support Files/SVProgressHUD/Info.plist";
1888 2036 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1889   - IPHONEOS_DEPLOYMENT_TARGET = 9.0;
  2037 + IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1890 2038 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1891   - MACH_O_TYPE = staticlib;
1892   - MODULEMAP_FILE = "Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.modulemap";
1893   - OTHER_LDFLAGS = "";
1894   - OTHER_LIBTOOLFLAGS = "";
1895   - PODS_ROOT = "$(SRCROOT)";
1896   - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
1897   - PRODUCT_NAME = Pods_ParentAssistant;
  2039 + MODULEMAP_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD.modulemap";
  2040 + PRODUCT_NAME = SVProgressHUD;
1898 2041 SDKROOT = iphoneos;
1899 2042 SKIP_INSTALL = YES;
1900   - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
  2043 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  2044 + SWIFT_VERSION = 4.0;
1901 2045 TARGETED_DEVICE_FAMILY = "1,2";
1902   - VALIDATE_PRODUCT = YES;
1903 2046 VERSIONING_SYSTEM = "apple-generic";
1904 2047 VERSION_INFO_PREFIX = "";
1905 2048 };
1906   - name = Release;
  2049 + name = Debug;
1907 2050 };
1908   - 68EC31FD5ED5128B6144732DB7C7AEAA /* Release */ = {
  2051 + 751B90BBDF8E0306B9FEBD3AFC3D32D5 /* Debug */ = {
1909 2052 isa = XCBuildConfiguration;
1910   - baseConfigurationReference = EA6D07581B965169F4C036A600CF86BB /* Alamofire.xcconfig */;
  2053 + baseConfigurationReference = 187D5302F110245F1D24D217827BFBC1 /* AlamofireImage.xcconfig */;
1911 2054 buildSettings = {
1912 2055 CODE_SIGN_IDENTITY = "";
1913 2056 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -1918,28 +2061,27 @@
1918 2061 DYLIB_COMPATIBILITY_VERSION = 1;
1919 2062 DYLIB_CURRENT_VERSION = 1;
1920 2063 DYLIB_INSTALL_NAME_BASE = "@rpath";
1921   - GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch";
1922   - INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist";
  2064 + GCC_PREFIX_HEADER = "Target Support Files/AlamofireImage/AlamofireImage-prefix.pch";
  2065 + INFOPLIST_FILE = "Target Support Files/AlamofireImage/Info.plist";
1923 2066 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1924   - IPHONEOS_DEPLOYMENT_TARGET = 9.0;
  2067 + IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1925 2068 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1926   - MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap";
1927   - PRODUCT_NAME = Alamofire;
  2069 + MODULEMAP_FILE = "Target Support Files/AlamofireImage/AlamofireImage.modulemap";
  2070 + PRODUCT_NAME = AlamofireImage;
1928 2071 SDKROOT = iphoneos;
1929 2072 SKIP_INSTALL = YES;
1930 2073 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
1931   - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
  2074 + SWIFT_OPTIMIZATION_LEVEL = "-Onone";
1932 2075 SWIFT_VERSION = 4.0;
1933 2076 TARGETED_DEVICE_FAMILY = "1,2";
1934   - VALIDATE_PRODUCT = YES;
1935 2077 VERSIONING_SYSTEM = "apple-generic";
1936 2078 VERSION_INFO_PREFIX = "";
1937 2079 };
1938   - name = Release;
  2080 + name = Debug;
1939 2081 };
1940 2082 793948A7CE88FCA234DA7EFD60D4178E /* Debug */ = {
1941 2083 isa = XCBuildConfiguration;
1942   - baseConfigurationReference = 328C2C3F0CBE7948196AEE1B0FA7B3F4 /* DZNEmptyDataSet.xcconfig */;
  2084 + baseConfigurationReference = 1BF83289F3929832EC0ED8E333158C69 /* DZNEmptyDataSet.xcconfig */;
1943 2085 buildSettings = {
1944 2086 CODE_SIGN_IDENTITY = "";
1945 2087 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -1967,9 +2109,9 @@
1967 2109 };
1968 2110 name = Debug;
1969 2111 };
1970   - 8056BF0CAA9260FAFEF0C71AA27ED129 /* Debug */ = {
  2112 + 8F127F4A0150651E07D4FA5346BC4AAC /* Release */ = {
1971 2113 isa = XCBuildConfiguration;
1972   - baseConfigurationReference = EA6D07581B965169F4C036A600CF86BB /* Alamofire.xcconfig */;
  2114 + baseConfigurationReference = C746EF0B8C90559C66A538F15D8EBAAF /* SVProgressHUD.xcconfig */;
1973 2115 buildSettings = {
1974 2116 CODE_SIGN_IDENTITY = "";
1975 2117 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -1980,27 +2122,27 @@
1980 2122 DYLIB_COMPATIBILITY_VERSION = 1;
1981 2123 DYLIB_CURRENT_VERSION = 1;
1982 2124 DYLIB_INSTALL_NAME_BASE = "@rpath";
1983   - GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch";
1984   - INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist";
  2125 + GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch";
  2126 + INFOPLIST_FILE = "Target Support Files/SVProgressHUD/Info.plist";
1985 2127 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1986   - IPHONEOS_DEPLOYMENT_TARGET = 9.0;
  2128 + IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1987 2129 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1988   - MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap";
1989   - PRODUCT_NAME = Alamofire;
  2130 + MODULEMAP_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD.modulemap";
  2131 + PRODUCT_NAME = SVProgressHUD;
1990 2132 SDKROOT = iphoneos;
1991 2133 SKIP_INSTALL = YES;
1992 2134 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
1993   - SWIFT_OPTIMIZATION_LEVEL = "-Onone";
1994 2135 SWIFT_VERSION = 4.0;
1995 2136 TARGETED_DEVICE_FAMILY = "1,2";
  2137 + VALIDATE_PRODUCT = YES;
1996 2138 VERSIONING_SYSTEM = "apple-generic";
1997 2139 VERSION_INFO_PREFIX = "";
1998 2140 };
1999   - name = Debug;
  2141 + name = Release;
2000 2142 };
2001   - 83018C328C9420EE22D60BC4FC7C261D /* Debug */ = {
  2143 + AF7FFDF24A1E00A55FA53123567E434F /* Debug */ = {
2002 2144 isa = XCBuildConfiguration;
2003   - baseConfigurationReference = 4357F76011180D7A84AB5281135FBC76 /* Reachability.xcconfig */;
  2145 + baseConfigurationReference = 7ED5CEE60A46EFCFCE43D1A6C52D3869 /* Reachability.xcconfig */;
2004 2146 buildSettings = {
2005 2147 CODE_SIGN_IDENTITY = "";
2006 2148 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -2028,9 +2170,9 @@
2028 2170 };
2029 2171 name = Debug;
2030 2172 };
2031   - 8C67AFC68147451E22867E04C2F78264 /* Debug */ = {
  2173 + B0F5F1530D3F4E518BE2B1A52F98487A /* Debug */ = {
2032 2174 isa = XCBuildConfiguration;
2033   - baseConfigurationReference = AC7C53CF4231A641CE59A3CD5991C5C1 /* SDWebImage.xcconfig */;
  2175 + baseConfigurationReference = 950B05ADF5C9C81AF940E6DFFABE4DB9 /* Alamofire.xcconfig */;
2034 2176 buildSettings = {
2035 2177 CODE_SIGN_IDENTITY = "";
2036 2178 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -2041,16 +2183,17 @@
2041 2183 DYLIB_COMPATIBILITY_VERSION = 1;
2042 2184 DYLIB_CURRENT_VERSION = 1;
2043 2185 DYLIB_INSTALL_NAME_BASE = "@rpath";
2044   - GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch";
2045   - INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist";
  2186 + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch";
  2187 + INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist";
2046 2188 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2047 2189 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
2048 2190 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2049   - MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap";
2050   - PRODUCT_NAME = SDWebImage;
  2191 + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap";
  2192 + PRODUCT_NAME = Alamofire;
2051 2193 SDKROOT = iphoneos;
2052 2194 SKIP_INSTALL = YES;
2053 2195 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  2196 + SWIFT_OPTIMIZATION_LEVEL = "-Onone";
2054 2197 SWIFT_VERSION = 4.0;
2055 2198 TARGETED_DEVICE_FAMILY = "1,2";
2056 2199 VERSIONING_SYSTEM = "apple-generic";
... ... @@ -2058,9 +2201,9 @@
2058 2201 };
2059 2202 name = Debug;
2060 2203 };
2061   - A8F73C58AFDC02718271B7541ABA62EF /* Release */ = {
  2204 + B8CA02655A4B738D82484691EE8CA58F /* Release */ = {
2062 2205 isa = XCBuildConfiguration;
2063   - baseConfigurationReference = 3813A00560E8E809CF107BA098D6A666 /* Toast.xcconfig */;
  2206 + baseConfigurationReference = 950B05ADF5C9C81AF940E6DFFABE4DB9 /* Alamofire.xcconfig */;
2064 2207 buildSettings = {
2065 2208 CODE_SIGN_IDENTITY = "";
2066 2209 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -2071,16 +2214,17 @@
2071 2214 DYLIB_COMPATIBILITY_VERSION = 1;
2072 2215 DYLIB_CURRENT_VERSION = 1;
2073 2216 DYLIB_INSTALL_NAME_BASE = "@rpath";
2074   - GCC_PREFIX_HEADER = "Target Support Files/Toast/Toast-prefix.pch";
2075   - INFOPLIST_FILE = "Target Support Files/Toast/Info.plist";
  2217 + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch";
  2218 + INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist";
2076 2219 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2077 2220 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
2078 2221 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2079   - MODULEMAP_FILE = "Target Support Files/Toast/Toast.modulemap";
2080   - PRODUCT_NAME = Toast;
  2222 + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap";
  2223 + PRODUCT_NAME = Alamofire;
2081 2224 SDKROOT = iphoneos;
2082 2225 SKIP_INSTALL = YES;
2083 2226 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  2227 + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
2084 2228 SWIFT_VERSION = 4.0;
2085 2229 TARGETED_DEVICE_FAMILY = "1,2";
2086 2230 VALIDATE_PRODUCT = YES;
... ... @@ -2089,9 +2233,9 @@
2089 2233 };
2090 2234 name = Release;
2091 2235 };
2092   - C86EB4C0D42E7F340560C1573F6E52EF /* Release */ = {
  2236 + BC0919D3961516E30D282E56DF28529F /* Release */ = {
2093 2237 isa = XCBuildConfiguration;
2094   - baseConfigurationReference = AC7C53CF4231A641CE59A3CD5991C5C1 /* SDWebImage.xcconfig */;
  2238 + baseConfigurationReference = 8EC8A0BF26B3414588BF92C66234FD4B /* XRCarouselView.xcconfig */;
2095 2239 buildSettings = {
2096 2240 CODE_SIGN_IDENTITY = "";
2097 2241 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -2102,13 +2246,74 @@
2102 2246 DYLIB_COMPATIBILITY_VERSION = 1;
2103 2247 DYLIB_CURRENT_VERSION = 1;
2104 2248 DYLIB_INSTALL_NAME_BASE = "@rpath";
2105   - GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch";
2106   - INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist";
  2249 + GCC_PREFIX_HEADER = "Target Support Files/XRCarouselView/XRCarouselView-prefix.pch";
  2250 + INFOPLIST_FILE = "Target Support Files/XRCarouselView/Info.plist";
2107 2251 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2108 2252 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
2109 2253 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2110   - MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap";
2111   - PRODUCT_NAME = SDWebImage;
  2254 + MODULEMAP_FILE = "Target Support Files/XRCarouselView/XRCarouselView.modulemap";
  2255 + PRODUCT_NAME = XRCarouselView;
  2256 + SDKROOT = iphoneos;
  2257 + SKIP_INSTALL = YES;
  2258 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  2259 + SWIFT_VERSION = 4.0;
  2260 + TARGETED_DEVICE_FAMILY = "1,2";
  2261 + VALIDATE_PRODUCT = YES;
  2262 + VERSIONING_SYSTEM = "apple-generic";
  2263 + VERSION_INFO_PREFIX = "";
  2264 + };
  2265 + name = Release;
  2266 + };
  2267 + BD00D4A34DF117B5E5F247BF620396C1 /* Debug */ = {
  2268 + isa = XCBuildConfiguration;
  2269 + baseConfigurationReference = 8EC8A0BF26B3414588BF92C66234FD4B /* XRCarouselView.xcconfig */;
  2270 + buildSettings = {
  2271 + CODE_SIGN_IDENTITY = "";
  2272 + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
  2273 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
  2274 + "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
  2275 + CURRENT_PROJECT_VERSION = 1;
  2276 + DEFINES_MODULE = YES;
  2277 + DYLIB_COMPATIBILITY_VERSION = 1;
  2278 + DYLIB_CURRENT_VERSION = 1;
  2279 + DYLIB_INSTALL_NAME_BASE = "@rpath";
  2280 + GCC_PREFIX_HEADER = "Target Support Files/XRCarouselView/XRCarouselView-prefix.pch";
  2281 + INFOPLIST_FILE = "Target Support Files/XRCarouselView/Info.plist";
  2282 + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
  2283 + IPHONEOS_DEPLOYMENT_TARGET = 8.0;
  2284 + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
  2285 + MODULEMAP_FILE = "Target Support Files/XRCarouselView/XRCarouselView.modulemap";
  2286 + PRODUCT_NAME = XRCarouselView;
  2287 + SDKROOT = iphoneos;
  2288 + SKIP_INSTALL = YES;
  2289 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  2290 + SWIFT_VERSION = 4.0;
  2291 + TARGETED_DEVICE_FAMILY = "1,2";
  2292 + VERSIONING_SYSTEM = "apple-generic";
  2293 + VERSION_INFO_PREFIX = "";
  2294 + };
  2295 + name = Debug;
  2296 + };
  2297 + DAB4CB471D45F527FCD1AE1F7006EE78 /* Release */ = {
  2298 + isa = XCBuildConfiguration;
  2299 + baseConfigurationReference = 9741F11BA31165953D6A9744F073FF08 /* Toast.xcconfig */;
  2300 + buildSettings = {
  2301 + CODE_SIGN_IDENTITY = "";
  2302 + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
  2303 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
  2304 + "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
  2305 + CURRENT_PROJECT_VERSION = 1;
  2306 + DEFINES_MODULE = YES;
  2307 + DYLIB_COMPATIBILITY_VERSION = 1;
  2308 + DYLIB_CURRENT_VERSION = 1;
  2309 + DYLIB_INSTALL_NAME_BASE = "@rpath";
  2310 + GCC_PREFIX_HEADER = "Target Support Files/Toast/Toast-prefix.pch";
  2311 + INFOPLIST_FILE = "Target Support Files/Toast/Info.plist";
  2312 + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
  2313 + IPHONEOS_DEPLOYMENT_TARGET = 8.0;
  2314 + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
  2315 + MODULEMAP_FILE = "Target Support Files/Toast/Toast.modulemap";
  2316 + PRODUCT_NAME = Toast;
2112 2317 SDKROOT = iphoneos;
2113 2318 SKIP_INSTALL = YES;
2114 2319 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
... ... @@ -2122,7 +2327,7 @@
2122 2327 };
2123 2328 DAE72FF2FFE8166FA938EB388ABBC2B5 /* Debug */ = {
2124 2329 isa = XCBuildConfiguration;
2125   - baseConfigurationReference = 6F37849A9F05E24161217B664F776F12 /* HandyJSON.xcconfig */;
  2330 + baseConfigurationReference = C6D4C38A8515FAAD57E78A742F0EB73A /* HandyJSON.xcconfig */;
2126 2331 buildSettings = {
2127 2332 CODE_SIGN_IDENTITY = "";
2128 2333 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -2151,6 +2356,37 @@
2151 2356 };
2152 2357 name = Debug;
2153 2358 };
  2359 + E03AFDCBB7483B6A565534D24BB1484D /* Release */ = {
  2360 + isa = XCBuildConfiguration;
  2361 + baseConfigurationReference = 7ED5CEE60A46EFCFCE43D1A6C52D3869 /* Reachability.xcconfig */;
  2362 + buildSettings = {
  2363 + CODE_SIGN_IDENTITY = "";
  2364 + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
  2365 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
  2366 + "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
  2367 + CURRENT_PROJECT_VERSION = 1;
  2368 + DEFINES_MODULE = YES;
  2369 + DYLIB_COMPATIBILITY_VERSION = 1;
  2370 + DYLIB_CURRENT_VERSION = 1;
  2371 + DYLIB_INSTALL_NAME_BASE = "@rpath";
  2372 + GCC_PREFIX_HEADER = "Target Support Files/Reachability/Reachability-prefix.pch";
  2373 + INFOPLIST_FILE = "Target Support Files/Reachability/Info.plist";
  2374 + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
  2375 + IPHONEOS_DEPLOYMENT_TARGET = 8.0;
  2376 + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
  2377 + MODULEMAP_FILE = "Target Support Files/Reachability/Reachability.modulemap";
  2378 + PRODUCT_NAME = Reachability;
  2379 + SDKROOT = iphoneos;
  2380 + SKIP_INSTALL = YES;
  2381 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  2382 + SWIFT_VERSION = 4.0;
  2383 + TARGETED_DEVICE_FAMILY = "1,2";
  2384 + VALIDATE_PRODUCT = YES;
  2385 + VERSIONING_SYSTEM = "apple-generic";
  2386 + VERSION_INFO_PREFIX = "";
  2387 + };
  2388 + name = Release;
  2389 + };
2154 2390 E2BF6D6731C31DE69900B7B24E6F0445 /* Debug */ = {
2155 2391 isa = XCBuildConfiguration;
2156 2392 buildSettings = {
... ... @@ -2214,41 +2450,9 @@
2214 2450 };
2215 2451 name = Debug;
2216 2452 };
2217   - ECB5142D4DABB45B92371C51B3EB61F8 /* Release */ = {
2218   - isa = XCBuildConfiguration;
2219   - baseConfigurationReference = 6F37849A9F05E24161217B664F776F12 /* HandyJSON.xcconfig */;
2220   - buildSettings = {
2221   - CODE_SIGN_IDENTITY = "";
2222   - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
2223   - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
2224   - "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
2225   - CURRENT_PROJECT_VERSION = 1;
2226   - DEFINES_MODULE = YES;
2227   - DYLIB_COMPATIBILITY_VERSION = 1;
2228   - DYLIB_CURRENT_VERSION = 1;
2229   - DYLIB_INSTALL_NAME_BASE = "@rpath";
2230   - GCC_PREFIX_HEADER = "Target Support Files/HandyJSON/HandyJSON-prefix.pch";
2231   - INFOPLIST_FILE = "Target Support Files/HandyJSON/Info.plist";
2232   - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2233   - IPHONEOS_DEPLOYMENT_TARGET = 8.0;
2234   - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2235   - MODULEMAP_FILE = "Target Support Files/HandyJSON/HandyJSON.modulemap";
2236   - PRODUCT_NAME = HandyJSON;
2237   - SDKROOT = iphoneos;
2238   - SKIP_INSTALL = YES;
2239   - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
2240   - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
2241   - SWIFT_VERSION = 4.0;
2242   - TARGETED_DEVICE_FAMILY = "1,2";
2243   - VALIDATE_PRODUCT = YES;
2244   - VERSIONING_SYSTEM = "apple-generic";
2245   - VERSION_INFO_PREFIX = "";
2246   - };
2247   - name = Release;
2248   - };
2249   - EF0EA84D551F1A4F1232F2684FE87AD0 /* Debug */ = {
  2453 + E658282DB2599CAD5F6CC833DE3425F9 /* Debug */ = {
2250 2454 isa = XCBuildConfiguration;
2251   - baseConfigurationReference = BF1709B1277BE62B09381A0534563DE2 /* SwiftHash.xcconfig */;
  2455 + baseConfigurationReference = 6EB59F100C77215BCBB4FAD12F0FF358 /* Pods-ParentAssistant.debug.xcconfig */;
2252 2456 buildSettings = {
2253 2457 CODE_SIGN_IDENTITY = "";
2254 2458 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -2259,27 +2463,30 @@
2259 2463 DYLIB_COMPATIBILITY_VERSION = 1;
2260 2464 DYLIB_CURRENT_VERSION = 1;
2261 2465 DYLIB_INSTALL_NAME_BASE = "@rpath";
2262   - GCC_PREFIX_HEADER = "Target Support Files/SwiftHash/SwiftHash-prefix.pch";
2263   - INFOPLIST_FILE = "Target Support Files/SwiftHash/Info.plist";
  2466 + INFOPLIST_FILE = "Target Support Files/Pods-ParentAssistant/Info.plist";
2264 2467 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2265   - IPHONEOS_DEPLOYMENT_TARGET = 8.0;
  2468 + IPHONEOS_DEPLOYMENT_TARGET = 9.0;
2266 2469 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2267   - MODULEMAP_FILE = "Target Support Files/SwiftHash/SwiftHash.modulemap";
2268   - PRODUCT_NAME = SwiftHash;
  2470 + MACH_O_TYPE = staticlib;
  2471 + MODULEMAP_FILE = "Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.modulemap";
  2472 + OTHER_LDFLAGS = "";
  2473 + OTHER_LIBTOOLFLAGS = "";
  2474 + PODS_ROOT = "$(SRCROOT)";
  2475 + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
  2476 + PRODUCT_NAME = Pods_ParentAssistant;
2269 2477 SDKROOT = iphoneos;
2270 2478 SKIP_INSTALL = YES;
2271   - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  2479 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
2272 2480 SWIFT_OPTIMIZATION_LEVEL = "-Onone";
2273   - SWIFT_VERSION = 4.0;
2274 2481 TARGETED_DEVICE_FAMILY = "1,2";
2275 2482 VERSIONING_SYSTEM = "apple-generic";
2276 2483 VERSION_INFO_PREFIX = "";
2277 2484 };
2278 2485 name = Debug;
2279 2486 };
2280   - F9A4D3888E109251ADAC60180BC1B773 /* Release */ = {
  2487 + ECB5142D4DABB45B92371C51B3EB61F8 /* Release */ = {
2281 2488 isa = XCBuildConfiguration;
2282   - baseConfigurationReference = 87D16ABF7E5F8A01191A86657C5C16BA /* XRCarouselView.xcconfig */;
  2489 + baseConfigurationReference = C6D4C38A8515FAAD57E78A742F0EB73A /* HandyJSON.xcconfig */;
2283 2490 buildSettings = {
2284 2491 CODE_SIGN_IDENTITY = "";
2285 2492 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -2290,16 +2497,17 @@
2290 2497 DYLIB_COMPATIBILITY_VERSION = 1;
2291 2498 DYLIB_CURRENT_VERSION = 1;
2292 2499 DYLIB_INSTALL_NAME_BASE = "@rpath";
2293   - GCC_PREFIX_HEADER = "Target Support Files/XRCarouselView/XRCarouselView-prefix.pch";
2294   - INFOPLIST_FILE = "Target Support Files/XRCarouselView/Info.plist";
  2500 + GCC_PREFIX_HEADER = "Target Support Files/HandyJSON/HandyJSON-prefix.pch";
  2501 + INFOPLIST_FILE = "Target Support Files/HandyJSON/Info.plist";
2295 2502 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2296 2503 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
2297 2504 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2298   - MODULEMAP_FILE = "Target Support Files/XRCarouselView/XRCarouselView.modulemap";
2299   - PRODUCT_NAME = XRCarouselView;
  2505 + MODULEMAP_FILE = "Target Support Files/HandyJSON/HandyJSON.modulemap";
  2506 + PRODUCT_NAME = HandyJSON;
2300 2507 SDKROOT = iphoneos;
2301 2508 SKIP_INSTALL = YES;
2302 2509 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  2510 + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
2303 2511 SWIFT_VERSION = 4.0;
2304 2512 TARGETED_DEVICE_FAMILY = "1,2";
2305 2513 VALIDATE_PRODUCT = YES;
... ... @@ -2311,6 +2519,15 @@
2311 2519 /* End XCBuildConfiguration section */
2312 2520  
2313 2521 /* Begin XCConfigurationList section */
  2522 + 01F2198AF9DCCF3700AE9DD21E64D480 /* Build configuration list for PBXNativeTarget "AlamofireImage" */ = {
  2523 + isa = XCConfigurationList;
  2524 + buildConfigurations = (
  2525 + 751B90BBDF8E0306B9FEBD3AFC3D32D5 /* Debug */,
  2526 + 1C5DAB39976688A93021E071A70593C0 /* Release */,
  2527 + );
  2528 + defaultConfigurationIsVisible = 0;
  2529 + defaultConfigurationName = Release;
  2530 + };
2314 2531 184303B9B5FF90B2017E4D0073BC6423 /* Build configuration list for PBXNativeTarget "HandyJSON" */ = {
2315 2532 isa = XCConfigurationList;
2316 2533 buildConfigurations = (
... ... @@ -2320,20 +2537,20 @@
2320 2537 defaultConfigurationIsVisible = 0;
2321 2538 defaultConfigurationName = Release;
2322 2539 };
2323   - 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = {
  2540 + 1CEF6058AA58F732B5DE35ABEA2BB8C8 /* Build configuration list for PBXNativeTarget "Toast" */ = {
2324 2541 isa = XCConfigurationList;
2325 2542 buildConfigurations = (
2326   - E2BF6D6731C31DE69900B7B24E6F0445 /* Debug */,
2327   - 26F954BA177A9A46FFFD4E23ED11D67A /* Release */,
  2543 + 48B91C10F0EB0CF2F5206AB95226AC0E /* Debug */,
  2544 + DAB4CB471D45F527FCD1AE1F7006EE78 /* Release */,
2328 2545 );
2329 2546 defaultConfigurationIsVisible = 0;
2330 2547 defaultConfigurationName = Release;
2331 2548 };
2332   - 3EC2F42A94017DE0B0E897EBD57D8A00 /* Build configuration list for PBXNativeTarget "SwiftHash" */ = {
  2549 + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = {
2333 2550 isa = XCConfigurationList;
2334 2551 buildConfigurations = (
2335   - EF0EA84D551F1A4F1232F2684FE87AD0 /* Debug */,
2336   - 2399E3FF594AB08E0DAC9484992C0F91 /* Release */,
  2552 + E2BF6D6731C31DE69900B7B24E6F0445 /* Debug */,
  2553 + 26F954BA177A9A46FFFD4E23ED11D67A /* Release */,
2337 2554 );
2338 2555 defaultConfigurationIsVisible = 0;
2339 2556 defaultConfigurationName = Release;
... ... @@ -2341,44 +2558,44 @@
2341 2558 419E5D95491847CD79841B971A8A3277 /* Build configuration list for PBXNativeTarget "Alamofire" */ = {
2342 2559 isa = XCConfigurationList;
2343 2560 buildConfigurations = (
2344   - 8056BF0CAA9260FAFEF0C71AA27ED129 /* Debug */,
2345   - 68EC31FD5ED5128B6144732DB7C7AEAA /* Release */,
  2561 + B0F5F1530D3F4E518BE2B1A52F98487A /* Debug */,
  2562 + B8CA02655A4B738D82484691EE8CA58F /* Release */,
2346 2563 );
2347 2564 defaultConfigurationIsVisible = 0;
2348 2565 defaultConfigurationName = Release;
2349 2566 };
2350   - 4B18822C8ECAB5D855CCE64E74C621EB /* Build configuration list for PBXNativeTarget "SDWebImage" */ = {
  2567 + 4C801EC31238E6F547E7192FDC9AD054 /* Build configuration list for PBXNativeTarget "XRCarouselView" */ = {
2351 2568 isa = XCConfigurationList;
2352 2569 buildConfigurations = (
2353   - 8C67AFC68147451E22867E04C2F78264 /* Debug */,
2354   - C86EB4C0D42E7F340560C1573F6E52EF /* Release */,
  2570 + BD00D4A34DF117B5E5F247BF620396C1 /* Debug */,
  2571 + BC0919D3961516E30D282E56DF28529F /* Release */,
2355 2572 );
2356 2573 defaultConfigurationIsVisible = 0;
2357 2574 defaultConfigurationName = Release;
2358 2575 };
2359   - 5AD50E3B4812FC9FAE4961CBCA56B874 /* Build configuration list for PBXNativeTarget "Reachability" */ = {
  2576 + 58F24DE1FC95F96D43F56B9CC6D0B926 /* Build configuration list for PBXNativeTarget "SwiftHash" */ = {
2360 2577 isa = XCConfigurationList;
2361 2578 buildConfigurations = (
2362   - 83018C328C9420EE22D60BC4FC7C261D /* Debug */,
2363   - 20A33051E49990EF2F5D75016374151E /* Release */,
  2579 + 0C3F011A578A68CF86694EAD254E6E23 /* Debug */,
  2580 + 11480927D0D767066580AF486506DDA6 /* Release */,
2364 2581 );
2365 2582 defaultConfigurationIsVisible = 0;
2366 2583 defaultConfigurationName = Release;
2367 2584 };
2368   - 7700DD54DACF55CC6BABF28FFCAB0179 /* Build configuration list for PBXNativeTarget "Pods-ParentAssistant" */ = {
  2585 + 70F92D3F8B893481FDA768F4EB8E9118 /* Build configuration list for PBXNativeTarget "SDWebImage" */ = {
2369 2586 isa = XCConfigurationList;
2370 2587 buildConfigurations = (
2371   - 205040859FD37102CD356142F35D96D4 /* Debug */,
2372   - 601BFB40515FF6C016B5850C2D905027 /* Release */,
  2588 + 1F859CD6F320ED91E304126AE9B41213 /* Debug */,
  2589 + 2DA5E368920A110F6198A53CE954D348 /* Release */,
2373 2590 );
2374 2591 defaultConfigurationIsVisible = 0;
2375 2592 defaultConfigurationName = Release;
2376 2593 };
2377   - A4FA017D8C4362BABA6CC461A244CB9D /* Build configuration list for PBXNativeTarget "XRCarouselView" */ = {
  2594 + 76E43176855F8CE556CB459D4CF15C83 /* Build configuration list for PBXNativeTarget "Pods-ParentAssistant" */ = {
2378 2595 isa = XCConfigurationList;
2379 2596 buildConfigurations = (
2380   - 2386F65ABDB52652A92CBEE14C73BA07 /* Debug */,
2381   - F9A4D3888E109251ADAC60180BC1B773 /* Release */,
  2597 + E658282DB2599CAD5F6CC833DE3425F9 /* Debug */,
  2598 + 1F40ECCA7544B21AE3F93FCA732FF525 /* Release */,
2382 2599 );
2383 2600 defaultConfigurationIsVisible = 0;
2384 2601 defaultConfigurationName = Release;
... ... @@ -2392,20 +2609,20 @@
2392 2609 defaultConfigurationIsVisible = 0;
2393 2610 defaultConfigurationName = Release;
2394 2611 };
2395   - EAC632F2AAB82F696A1E5C88D53A883E /* Build configuration list for PBXNativeTarget "SVProgressHUD" */ = {
  2612 + C3C11F185D4F7CF61CB8BBE64492631D /* Build configuration list for PBXNativeTarget "Reachability" */ = {
2396 2613 isa = XCConfigurationList;
2397 2614 buildConfigurations = (
2398   - 3D9BEB881A70984931EB7B52EB42D89C /* Debug */,
2399   - 51211605D5BBC568B59C86BC410917A5 /* Release */,
  2615 + AF7FFDF24A1E00A55FA53123567E434F /* Debug */,
  2616 + E03AFDCBB7483B6A565534D24BB1484D /* Release */,
2400 2617 );
2401 2618 defaultConfigurationIsVisible = 0;
2402 2619 defaultConfigurationName = Release;
2403 2620 };
2404   - F11A26D3E7766CBBD820DCD66B6FC321 /* Build configuration list for PBXNativeTarget "Toast" */ = {
  2621 + FA57B4E379EB61FD555A1581DE341347 /* Build configuration list for PBXNativeTarget "SVProgressHUD" */ = {
2405 2622 isa = XCConfigurationList;
2406 2623 buildConfigurations = (
2407   - 215A480FCE0C128FA2F4C2A2882BBE23 /* Debug */,
2408   - A8F73C58AFDC02718271B7541ABA62EF /* Release */,
  2624 + 5D34B066ADCE4D5A36DAF77492279C57 /* Debug */,
  2625 + 8F127F4A0150651E07D4FA5346BC4AAC /* Release */,
2409 2626 );
2410 2627 defaultConfigurationIsVisible = 0;
2411 2628 defaultConfigurationName = Release;
... ...
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/AlamofireImage.xcscheme 0 → 100644
... ... @@ -0,0 +1,60 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<Scheme
  3 + LastUpgradeVersion = "0930"
  4 + version = "1.3">
  5 + <BuildAction
  6 + parallelizeBuildables = "YES"
  7 + buildImplicitDependencies = "YES">
  8 + <BuildActionEntries>
  9 + <BuildActionEntry
  10 + buildForAnalyzing = "YES"
  11 + buildForTesting = "YES"
  12 + buildForRunning = "YES"
  13 + buildForProfiling = "YES"
  14 + buildForArchiving = "YES">
  15 + <BuildableReference
  16 + BuildableIdentifier = "primary"
  17 + BlueprintIdentifier = "9EFE4C70245EE2857D336B8B9FA4E825"
  18 + BlueprintName = "AlamofireImage"
  19 + ReferencedContainer = "container:Pods.xcodeproj"
  20 + BuildableName = "AlamofireImage.framework">
  21 + </BuildableReference>
  22 + </BuildActionEntry>
  23 + </BuildActionEntries>
  24 + </BuildAction>
  25 + <TestAction
  26 + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
  27 + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
  28 + shouldUseLaunchSchemeArgsEnv = "YES"
  29 + buildConfiguration = "Debug">
  30 + <AdditionalOptions>
  31 + </AdditionalOptions>
  32 + </TestAction>
  33 + <LaunchAction
  34 + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
  35 + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
  36 + launchStyle = "0"
  37 + useCustomWorkingDirectory = "NO"
  38 + ignoresPersistentStateOnLaunch = "NO"
  39 + debugDocumentVersioning = "YES"
  40 + debugServiceExtension = "internal"
  41 + buildConfiguration = "Debug"
  42 + allowLocationSimulation = "YES">
  43 + <AdditionalOptions>
  44 + </AdditionalOptions>
  45 + </LaunchAction>
  46 + <ProfileAction
  47 + savedToolIdentifier = ""
  48 + useCustomWorkingDirectory = "NO"
  49 + debugDocumentVersioning = "YES"
  50 + buildConfiguration = "Release"
  51 + shouldUseLaunchSchemeArgsEnv = "YES">
  52 + </ProfileAction>
  53 + <AnalyzeAction
  54 + buildConfiguration = "Debug">
  55 + </AnalyzeAction>
  56 + <ArchiveAction
  57 + buildConfiguration = "Release"
  58 + revealArchiveInOrganizer = "YES">
  59 + </ArchiveAction>
  60 +</Scheme>
... ...
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Pods-ParentAssistant.xcscheme
... ... @@ -14,7 +14,7 @@
14 14 buildForAnalyzing = "YES">
15 15 <BuildableReference
16 16 BuildableIdentifier = "primary"
17   - BlueprintIdentifier = "89B82C8C6E32CEBE5ACCD75CDFBECBB1"
  17 + BlueprintIdentifier = "3DE44D61FA676CE3B5DFDE6DC058A636"
18 18 BuildableName = "Pods_ParentAssistant.framework"
19 19 BlueprintName = "Pods-ParentAssistant"
20 20 ReferencedContainer = "container:Pods.xcodeproj">
... ... @@ -45,7 +45,7 @@
45 45 <MacroExpansion>
46 46 <BuildableReference
47 47 BuildableIdentifier = "primary"
48   - BlueprintIdentifier = "89B82C8C6E32CEBE5ACCD75CDFBECBB1"
  48 + BlueprintIdentifier = "3DE44D61FA676CE3B5DFDE6DC058A636"
49 49 BuildableName = "Pods_ParentAssistant.framework"
50 50 BlueprintName = "Pods-ParentAssistant"
51 51 ReferencedContainer = "container:Pods.xcodeproj">
... ...
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Reachability.xcscheme
... ... @@ -14,7 +14,7 @@
14 14 buildForArchiving = "YES">
15 15 <BuildableReference
16 16 BuildableIdentifier = "primary"
17   - BlueprintIdentifier = "AAC4087A5A57F5566AB9B54FEBADBC36"
  17 + BlueprintIdentifier = "CE1092398200ECC7DE7468626D1D0B98"
18 18 BlueprintName = "Reachability"
19 19 ReferencedContainer = "container:Pods.xcodeproj"
20 20 BuildableName = "Reachability.framework">
... ...
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SDWebImage.xcscheme
... ... @@ -14,7 +14,7 @@
14 14 buildForArchiving = "YES">
15 15 <BuildableReference
16 16 BuildableIdentifier = "primary"
17   - BlueprintIdentifier = "8FA4EA707F3B6CFDACB1C85C722D2E73"
  17 + BlueprintIdentifier = "37F4E36BECBDD0070D2501E766C0238B"
18 18 BlueprintName = "SDWebImage"
19 19 ReferencedContainer = "container:Pods.xcodeproj"
20 20 BuildableName = "SDWebImage.framework">
... ...
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SVProgressHUD.xcscheme
... ... @@ -14,7 +14,7 @@
14 14 buildForArchiving = "YES">
15 15 <BuildableReference
16 16 BuildableIdentifier = "primary"
17   - BlueprintIdentifier = "E55BDEBC8F73D6B7936791D0822F70D6"
  17 + BlueprintIdentifier = "637267420040487628765A2667620742"
18 18 BlueprintName = "SVProgressHUD"
19 19 ReferencedContainer = "container:Pods.xcodeproj"
20 20 BuildableName = "SVProgressHUD.framework">
... ...
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SwiftHash.xcscheme
... ... @@ -14,7 +14,7 @@
14 14 buildForArchiving = "YES">
15 15 <BuildableReference
16 16 BuildableIdentifier = "primary"
17   - BlueprintIdentifier = "6376DC419EEA98495631602218A4F31B"
  17 + BlueprintIdentifier = "A0A5E57D4BB5AA2602B591D713407086"
18 18 BlueprintName = "SwiftHash"
19 19 ReferencedContainer = "container:Pods.xcodeproj"
20 20 BuildableName = "SwiftHash.framework">
... ...
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Toast.xcscheme
... ... @@ -14,7 +14,7 @@
14 14 buildForArchiving = "YES">
15 15 <BuildableReference
16 16 BuildableIdentifier = "primary"
17   - BlueprintIdentifier = "9A9DDC64623B3F5E6DC7009C16752B95"
  17 + BlueprintIdentifier = "620180280B57A3DF973662E546D211E4"
18 18 BlueprintName = "Toast"
19 19 ReferencedContainer = "container:Pods.xcodeproj"
20 20 BuildableName = "Toast.framework">
... ...
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/XRCarouselView.xcscheme
... ... @@ -14,7 +14,7 @@
14 14 buildForArchiving = "YES">
15 15 <BuildableReference
16 16 BuildableIdentifier = "primary"
17   - BlueprintIdentifier = "27189F0EDBCA8831C460D0166F6F37A1"
  17 + BlueprintIdentifier = "0A4402E270B0A4B00A031931BD805EF1"
18 18 BlueprintName = "XRCarouselView"
19 19 ReferencedContainer = "container:Pods.xcodeproj"
20 20 BuildableName = "XRCarouselView.framework">
... ...
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/xcschememanagement.plist
... ... @@ -11,69 +11,76 @@
11 11 <key>orderHint</key>
12 12 <integer>0</integer>
13 13 </dict>
14   - <key>DZNEmptyDataSet.xcscheme</key>
  14 + <key>AlamofireImage.xcscheme</key>
15 15 <dict>
16 16 <key>isShown</key>
17 17 <false/>
18 18 <key>orderHint</key>
19 19 <integer>1</integer>
20 20 </dict>
21   - <key>HandyJSON.xcscheme</key>
  21 + <key>DZNEmptyDataSet.xcscheme</key>
22 22 <dict>
23 23 <key>isShown</key>
24 24 <false/>
25 25 <key>orderHint</key>
26 26 <integer>2</integer>
27 27 </dict>
28   - <key>Pods-ParentAssistant.xcscheme</key>
  28 + <key>HandyJSON.xcscheme</key>
29 29 <dict>
30 30 <key>isShown</key>
31 31 <false/>
32 32 <key>orderHint</key>
33 33 <integer>3</integer>
34 34 </dict>
35   - <key>Reachability.xcscheme</key>
  35 + <key>Pods-ParentAssistant.xcscheme</key>
36 36 <dict>
37 37 <key>isShown</key>
38 38 <false/>
39 39 <key>orderHint</key>
40 40 <integer>4</integer>
41 41 </dict>
42   - <key>SDWebImage.xcscheme</key>
  42 + <key>Reachability.xcscheme</key>
43 43 <dict>
44 44 <key>isShown</key>
45 45 <false/>
46 46 <key>orderHint</key>
47 47 <integer>5</integer>
48 48 </dict>
49   - <key>SVProgressHUD.xcscheme</key>
  49 + <key>SDWebImage.xcscheme</key>
50 50 <dict>
51 51 <key>isShown</key>
52 52 <false/>
53 53 <key>orderHint</key>
54 54 <integer>6</integer>
55 55 </dict>
56   - <key>SwiftHash.xcscheme</key>
  56 + <key>SVProgressHUD.xcscheme</key>
57 57 <dict>
58 58 <key>isShown</key>
59 59 <false/>
60 60 <key>orderHint</key>
61 61 <integer>7</integer>
62 62 </dict>
63   - <key>Toast.xcscheme</key>
  63 + <key>SwiftHash.xcscheme</key>
64 64 <dict>
65 65 <key>isShown</key>
66 66 <false/>
67 67 <key>orderHint</key>
68 68 <integer>8</integer>
69 69 </dict>
70   - <key>XRCarouselView.xcscheme</key>
  70 + <key>Toast.xcscheme</key>
71 71 <dict>
72 72 <key>isShown</key>
73 73 <false/>
74 74 <key>orderHint</key>
75 75 <integer>9</integer>
76 76 </dict>
  77 + <key>XRCarouselView.xcscheme</key>
  78 + <dict>
  79 + <key>isShown</key>
  80 + <false/>
  81 + <key>orderHint</key>
  82 + <integer>10</integer>
  83 + </dict>
77 84 </dict>
78 85 <key>SuppressBuildableAutocreation</key>
79 86 <dict/>
... ...
ParentAssistant/Pods/Target Support Files/Alamofire/Info.plist
... ... @@ -15,7 +15,7 @@
15 15 <key>CFBundlePackageType</key>
16 16 <string>FMWK</string>
17 17 <key>CFBundleShortVersionString</key>
18   - <string>4.0.1</string>
  18 + <string>4.7.2</string>
19 19 <key>CFBundleSignature</key>
20 20 <string>????</string>
21 21 <key>CFBundleVersion</key>
... ...
ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage-dummy.m 0 → 100644
... ... @@ -0,0 +1,5 @@
  1 +#import <Foundation/Foundation.h>
  2 +@interface PodsDummy_AlamofireImage : NSObject
  3 +@end
  4 +@implementation PodsDummy_AlamofireImage
  5 +@end
... ...
ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage-prefix.pch 0 → 100644
... ... @@ -0,0 +1,12 @@
  1 +#ifdef __OBJC__
  2 +#import <UIKit/UIKit.h>
  3 +#else
  4 +#ifndef FOUNDATION_EXPORT
  5 +#if defined(__cplusplus)
  6 +#define FOUNDATION_EXPORT extern "C"
  7 +#else
  8 +#define FOUNDATION_EXPORT extern
  9 +#endif
  10 +#endif
  11 +#endif
  12 +
... ...
ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage-umbrella.h 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +#ifdef __OBJC__
  2 +#import <UIKit/UIKit.h>
  3 +#else
  4 +#ifndef FOUNDATION_EXPORT
  5 +#if defined(__cplusplus)
  6 +#define FOUNDATION_EXPORT extern "C"
  7 +#else
  8 +#define FOUNDATION_EXPORT extern
  9 +#endif
  10 +#endif
  11 +#endif
  12 +
  13 +
  14 +FOUNDATION_EXPORT double AlamofireImageVersionNumber;
  15 +FOUNDATION_EXPORT const unsigned char AlamofireImageVersionString[];
  16 +
... ...
ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage.modulemap 0 → 100644
... ... @@ -0,0 +1,6 @@
  1 +framework module AlamofireImage {
  2 + umbrella header "AlamofireImage-umbrella.h"
  3 +
  4 + export *
  5 + module * { export * }
  6 +}
... ...
ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage.xcconfig 0 → 100644
... ... @@ -0,0 +1,11 @@
  1 +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AlamofireImage
  2 +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire"
  3 +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
  4 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/NIMSDK_LITE" "${PODS_ROOT}/Headers/Public/UMCAnalytics" "${PODS_ROOT}/Headers/Public/UMCCommon" "${PODS_ROOT}/Headers/Public/UMCErrorCatch" "${PODS_ROOT}/Headers/Public/UMCSecurityPlugins"
  5 +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" "-suppress-warnings"
  6 +PODS_BUILD_DIR = ${BUILD_DIR}
  7 +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
  8 +PODS_ROOT = ${SRCROOT}
  9 +PODS_TARGET_SRCROOT = ${PODS_ROOT}/AlamofireImage
  10 +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
  11 +SKIP_INSTALL = YES
... ...
ParentAssistant/Pods/Target Support Files/AlamofireImage/Info.plist 0 → 100644
... ... @@ -0,0 +1,26 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>CFBundleDevelopmentRegion</key>
  6 + <string>en</string>
  7 + <key>CFBundleExecutable</key>
  8 + <string>${EXECUTABLE_NAME}</string>
  9 + <key>CFBundleIdentifier</key>
  10 + <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
  11 + <key>CFBundleInfoDictionaryVersion</key>
  12 + <string>6.0</string>
  13 + <key>CFBundleName</key>
  14 + <string>${PRODUCT_NAME}</string>
  15 + <key>CFBundlePackageType</key>
  16 + <string>FMWK</string>
  17 + <key>CFBundleShortVersionString</key>
  18 + <string>3.3.1</string>
  19 + <key>CFBundleSignature</key>
  20 + <string>????</string>
  21 + <key>CFBundleVersion</key>
  22 + <string>${CURRENT_PROJECT_VERSION}</string>
  23 + <key>NSPrincipalClass</key>
  24 + <string></string>
  25 +</dict>
  26 +</plist>
... ...
ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-acknowledgements.markdown
... ... @@ -3,7 +3,30 @@ This application makes use of the following third party libraries:
3 3  
4 4 ## Alamofire
5 5  
6   -Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  6 +Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
  7 +
  8 +Permission is hereby granted, free of charge, to any person obtaining a copy
  9 +of this software and associated documentation files (the "Software"), to deal
  10 +in the Software without restriction, including without limitation the rights
  11 +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  12 +copies of the Software, and to permit persons to whom the Software is
  13 +furnished to do so, subject to the following conditions:
  14 +
  15 +The above copyright notice and this permission notice shall be included in
  16 +all copies or substantial portions of the Software.
  17 +
  18 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  19 +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20 +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  21 +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  22 +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  23 +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  24 +THE SOFTWARE.
  25 +
  26 +
  27 +## AlamofireImage
  28 +
  29 +Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
7 30  
8 31 Permission is hereby granted, free of charge, to any person obtaining a copy
9 32 of this software and associated documentation files (the "Software"), to deal
... ...
ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-acknowledgements.plist
... ... @@ -14,7 +14,7 @@
14 14 </dict>
15 15 <dict>
16 16 <key>FooterText</key>
17   - <string>Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  17 + <string>Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
18 18  
19 19 Permission is hereby granted, free of charge, to any person obtaining a copy
20 20 of this software and associated documentation files (the "Software"), to deal
... ... @@ -43,6 +43,35 @@ THE SOFTWARE.
43 43 </dict>
44 44 <dict>
45 45 <key>FooterText</key>
  46 + <string>Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  47 +
  48 +Permission is hereby granted, free of charge, to any person obtaining a copy
  49 +of this software and associated documentation files (the "Software"), to deal
  50 +in the Software without restriction, including without limitation the rights
  51 +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  52 +copies of the Software, and to permit persons to whom the Software is
  53 +furnished to do so, subject to the following conditions:
  54 +
  55 +The above copyright notice and this permission notice shall be included in
  56 +all copies or substantial portions of the Software.
  57 +
  58 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  59 +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  60 +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  61 +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  62 +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  63 +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  64 +THE SOFTWARE.
  65 +</string>
  66 + <key>License</key>
  67 + <string>MIT</string>
  68 + <key>Title</key>
  69 + <string>AlamofireImage</string>
  70 + <key>Type</key>
  71 + <string>PSGroupSpecifier</string>
  72 + </dict>
  73 + <dict>
  74 + <key>FooterText</key>
46 75 <string>The MIT License (MIT)
47 76  
48 77 Copyright (c) 2016 Ignacio Romero Zurbuchen iromero@dzen.cl
... ...
ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-frameworks.sh
... ... @@ -135,6 +135,7 @@ strip_invalid_archs() {
135 135  
136 136 if [[ "$CONFIGURATION" == "Debug" ]]; then
137 137 install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework"
  138 + install_framework "${BUILT_PRODUCTS_DIR}/AlamofireImage/AlamofireImage.framework"
138 139 install_framework "${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework"
139 140 install_framework "${BUILT_PRODUCTS_DIR}/HandyJSON/HandyJSON.framework"
140 141 install_framework "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework"
... ... @@ -146,6 +147,7 @@ if [[ &quot;$CONFIGURATION&quot; == &quot;Debug&quot; ]]; then
146 147 fi
147 148 if [[ "$CONFIGURATION" == "Release" ]]; then
148 149 install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework"
  150 + install_framework "${BUILT_PRODUCTS_DIR}/AlamofireImage/AlamofireImage.framework"
149 151 install_framework "${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework"
150 152 install_framework "${BUILT_PRODUCTS_DIR}/HandyJSON/HandyJSON.framework"
151 153 install_framework "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework"
... ...
ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.debug.xcconfig
1 1 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
2   -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet" "${PODS_CONFIGURATION_BUILD_DIR}/HandyJSON" "${PODS_CONFIGURATION_BUILD_DIR}/Reachability" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftHash" "${PODS_CONFIGURATION_BUILD_DIR}/Toast" "${PODS_CONFIGURATION_BUILD_DIR}/XRCarouselView" "${PODS_ROOT}/NIMSDK_LITE/NIMSDK" "${PODS_ROOT}/UMCAnalytics" "${PODS_ROOT}/UMCCommon" "${PODS_ROOT}/UMCErrorCatch" "${PODS_ROOT}/UMCSecurityPlugins/thirdparties"
  2 +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/AlamofireImage" "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet" "${PODS_CONFIGURATION_BUILD_DIR}/HandyJSON" "${PODS_CONFIGURATION_BUILD_DIR}/Reachability" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftHash" "${PODS_CONFIGURATION_BUILD_DIR}/Toast" "${PODS_CONFIGURATION_BUILD_DIR}/XRCarouselView" "${PODS_ROOT}/NIMSDK_LITE/NIMSDK" "${PODS_ROOT}/UMCAnalytics" "${PODS_ROOT}/UMCCommon" "${PODS_ROOT}/UMCErrorCatch" "${PODS_ROOT}/UMCSecurityPlugins/thirdparties"
3 3 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 4 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/NIMSDK_LITE" "${PODS_ROOT}/Headers/Public/UMCAnalytics" "${PODS_ROOT}/Headers/Public/UMCCommon" "${PODS_ROOT}/Headers/Public/UMCErrorCatch" "${PODS_ROOT}/Headers/Public/UMCSecurityPlugins"
5 5 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
6 6 LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/NIMSDK_LITE/NIMSDK/Libs"
7   -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/HandyJSON/HandyJSON.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Reachability/Reachability.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SwiftHash/SwiftHash.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Toast/Toast.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/XRCarouselView/XRCarouselView.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/NIMSDK_LITE" -isystem "${PODS_ROOT}/Headers/Public/UMCAnalytics" -isystem "${PODS_ROOT}/Headers/Public/UMCCommon" -isystem "${PODS_ROOT}/Headers/Public/UMCErrorCatch" -isystem "${PODS_ROOT}/Headers/Public/UMCSecurityPlugins"
8   -OTHER_LDFLAGS = $(inherited) -ObjC -l"aacplus" -l"c++" -l"crypto" -l"event" -l"sqlite3" -l"sqlite3.0" -l"ssl" -l"z" -framework "AVFoundation" -framework "Alamofire" -framework "AudioToolbox" -framework "CoreMedia" -framework "CoreTelephony" -framework "DZNEmptyDataSet" -framework "HandyJSON" -framework "NIMSDK" -framework "Reachability" -framework "SDWebImage" -framework "SVProgressHUD" -framework "SecurityEnvSDK" -framework "SwiftHash" -framework "SystemConfiguration" -framework "Toast" -framework "UMAnalytics" -framework "UMCommon" -framework "UMErrorCatch" -framework "UTDID" -framework "VideoToolbox" -framework "XRCarouselView"
  7 +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/AlamofireImage/AlamofireImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/HandyJSON/HandyJSON.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Reachability/Reachability.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SwiftHash/SwiftHash.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Toast/Toast.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/XRCarouselView/XRCarouselView.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/NIMSDK_LITE" -isystem "${PODS_ROOT}/Headers/Public/UMCAnalytics" -isystem "${PODS_ROOT}/Headers/Public/UMCCommon" -isystem "${PODS_ROOT}/Headers/Public/UMCErrorCatch" -isystem "${PODS_ROOT}/Headers/Public/UMCSecurityPlugins"
  8 +OTHER_LDFLAGS = $(inherited) -ObjC -l"aacplus" -l"c++" -l"crypto" -l"event" -l"sqlite3" -l"sqlite3.0" -l"ssl" -l"z" -framework "AVFoundation" -framework "Alamofire" -framework "AlamofireImage" -framework "AudioToolbox" -framework "CoreMedia" -framework "CoreTelephony" -framework "DZNEmptyDataSet" -framework "HandyJSON" -framework "NIMSDK" -framework "Reachability" -framework "SDWebImage" -framework "SVProgressHUD" -framework "SecurityEnvSDK" -framework "SwiftHash" -framework "SystemConfiguration" -framework "Toast" -framework "UMAnalytics" -framework "UMCommon" -framework "UMErrorCatch" -framework "UTDID" -framework "VideoToolbox" -framework "XRCarouselView"
9 9 OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS"
10 10 PODS_BUILD_DIR = ${BUILD_DIR}
11 11 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
... ...
ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.release.xcconfig
1 1 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
2   -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet" "${PODS_CONFIGURATION_BUILD_DIR}/HandyJSON" "${PODS_CONFIGURATION_BUILD_DIR}/Reachability" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftHash" "${PODS_CONFIGURATION_BUILD_DIR}/Toast" "${PODS_CONFIGURATION_BUILD_DIR}/XRCarouselView" "${PODS_ROOT}/NIMSDK_LITE/NIMSDK" "${PODS_ROOT}/UMCAnalytics" "${PODS_ROOT}/UMCCommon" "${PODS_ROOT}/UMCErrorCatch" "${PODS_ROOT}/UMCSecurityPlugins/thirdparties"
  2 +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/AlamofireImage" "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet" "${PODS_CONFIGURATION_BUILD_DIR}/HandyJSON" "${PODS_CONFIGURATION_BUILD_DIR}/Reachability" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftHash" "${PODS_CONFIGURATION_BUILD_DIR}/Toast" "${PODS_CONFIGURATION_BUILD_DIR}/XRCarouselView" "${PODS_ROOT}/NIMSDK_LITE/NIMSDK" "${PODS_ROOT}/UMCAnalytics" "${PODS_ROOT}/UMCCommon" "${PODS_ROOT}/UMCErrorCatch" "${PODS_ROOT}/UMCSecurityPlugins/thirdparties"
3 3 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 4 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/NIMSDK_LITE" "${PODS_ROOT}/Headers/Public/UMCAnalytics" "${PODS_ROOT}/Headers/Public/UMCCommon" "${PODS_ROOT}/Headers/Public/UMCErrorCatch" "${PODS_ROOT}/Headers/Public/UMCSecurityPlugins"
5 5 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
6 6 LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/NIMSDK_LITE/NIMSDK/Libs"
7   -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/HandyJSON/HandyJSON.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Reachability/Reachability.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SwiftHash/SwiftHash.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Toast/Toast.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/XRCarouselView/XRCarouselView.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/NIMSDK_LITE" -isystem "${PODS_ROOT}/Headers/Public/UMCAnalytics" -isystem "${PODS_ROOT}/Headers/Public/UMCCommon" -isystem "${PODS_ROOT}/Headers/Public/UMCErrorCatch" -isystem "${PODS_ROOT}/Headers/Public/UMCSecurityPlugins"
8   -OTHER_LDFLAGS = $(inherited) -ObjC -l"aacplus" -l"c++" -l"crypto" -l"event" -l"sqlite3" -l"sqlite3.0" -l"ssl" -l"z" -framework "AVFoundation" -framework "Alamofire" -framework "AudioToolbox" -framework "CoreMedia" -framework "CoreTelephony" -framework "DZNEmptyDataSet" -framework "HandyJSON" -framework "NIMSDK" -framework "Reachability" -framework "SDWebImage" -framework "SVProgressHUD" -framework "SecurityEnvSDK" -framework "SwiftHash" -framework "SystemConfiguration" -framework "Toast" -framework "UMAnalytics" -framework "UMCommon" -framework "UMErrorCatch" -framework "UTDID" -framework "VideoToolbox" -framework "XRCarouselView"
  7 +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/AlamofireImage/AlamofireImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/HandyJSON/HandyJSON.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Reachability/Reachability.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SwiftHash/SwiftHash.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Toast/Toast.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/XRCarouselView/XRCarouselView.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/NIMSDK_LITE" -isystem "${PODS_ROOT}/Headers/Public/UMCAnalytics" -isystem "${PODS_ROOT}/Headers/Public/UMCCommon" -isystem "${PODS_ROOT}/Headers/Public/UMCErrorCatch" -isystem "${PODS_ROOT}/Headers/Public/UMCSecurityPlugins"
  8 +OTHER_LDFLAGS = $(inherited) -ObjC -l"aacplus" -l"c++" -l"crypto" -l"event" -l"sqlite3" -l"sqlite3.0" -l"ssl" -l"z" -framework "AVFoundation" -framework "Alamofire" -framework "AlamofireImage" -framework "AudioToolbox" -framework "CoreMedia" -framework "CoreTelephony" -framework "DZNEmptyDataSet" -framework "HandyJSON" -framework "NIMSDK" -framework "Reachability" -framework "SDWebImage" -framework "SVProgressHUD" -framework "SecurityEnvSDK" -framework "SwiftHash" -framework "SystemConfiguration" -framework "Toast" -framework "UMAnalytics" -framework "UMCommon" -framework "UMErrorCatch" -framework "UTDID" -framework "VideoToolbox" -framework "XRCarouselView"
9 9 OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS"
10 10 PODS_BUILD_DIR = ${BUILD_DIR}
11 11 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
... ...