Full Code of EasyIOS/EasyIOS-Swift for AI

master b269aff08a07 cached
154 files
935.2 KB
265.0k tokens
443 symbols
1 requests
Download .txt
Showing preview only (991K chars total). Download the full file or copy to clipboard to get everything.
Repository: EasyIOS/EasyIOS-Swift
Branch: master
Commit: b269aff08a07
Files: 154
Total size: 935.2 KB

Directory structure:
gitextract_b4h_akqo/

├── .gitignore
├── .travis.yml
├── Demo/
│   ├── Demo/
│   │   ├── AppDelegate.swift
│   │   ├── Base.lproj/
│   │   │   └── LaunchScreen.xib
│   │   ├── CollectionCellViewModel.swift
│   │   ├── CollectionScene.swift
│   │   ├── CollectionSceneModel.swift
│   │   ├── EncodeLoginScene.swift
│   │   ├── FeedRequest.swift
│   │   ├── FlexScene.swift
│   │   ├── FlexXmlScene.swift
│   │   ├── Images.xcassets/
│   │   │   └── AppIcon.appiconset/
│   │   │       └── Contents.json
│   │   ├── Info.plist
│   │   ├── LabelScene.swift
│   │   ├── LoginScene.swift
│   │   ├── MainLabelDeleage.swift
│   │   ├── MainScene.swift
│   │   ├── MainSceneModel.swift
│   │   ├── url.plist
│   │   └── xml.bundle/
│   │       ├── CollectionScene.xml
│   │       ├── EncodeLoginScene.crypto
│   │       ├── FlexXmlScene.xml
│   │       ├── LabelHtml.xml
│   │       ├── LabelScene.xml
│   │       ├── LoginScene.xml
│   │       └── MainScene.xml
│   ├── Demo.xcodeproj/
│   │   ├── project.pbxproj
│   │   └── project.xcworkspace/
│   │       └── contents.xcworkspacedata
│   ├── Demo.xcworkspace/
│   │   └── contents.xcworkspacedata
│   ├── DemoTests/
│   │   ├── DemoTests.swift
│   │   └── Info.plist
│   └── Podfile
├── EasyIOS-Swift.podspec
├── LICENSE
├── Pod/
│   ├── Assets/
│   │   └── .gitkeep
│   └── Classes/
│       ├── .gitkeep
│       ├── Easy/
│       │   ├── Core/
│       │   │   ├── EZAction.swift
│       │   │   ├── EZCollectionView.swift
│       │   │   ├── EZNavigationController.swift
│       │   │   ├── EZRequest.swift
│       │   │   ├── EZScene.swift
│       │   │   ├── EZSceneModel.swift
│       │   │   ├── EZTableView.swift
│       │   │   └── EZViewModel.swift
│       │   └── Lib/
│       │       ├── EZCoreDataManager.swift
│       │       ├── EZExtend+Array.swift
│       │       ├── EZExtend+Bond.swift
│       │       ├── EZExtend+Dictionary.swift
│       │       ├── EZExtend+NSDate.swift
│       │       ├── EZExtend+String.swift
│       │       ├── EZExtend+UIAlertController.swift
│       │       ├── EZExtend+UIButton.swift
│       │       ├── EZExtend+UIFont.swift
│       │       ├── EZExtend+UIImage.swift
│       │       ├── EZExtend+UILabel.swift
│       │       ├── EZExtend+UIView.swift
│       │       ├── EZExtend+UIViewController.swift
│       │       ├── EZKit.swift
│       │       ├── EZPrintln.swift
│       │       ├── EZSystemInfo.swift
│       │       ├── EZWatch.swift
│       │       ├── EasyORM.swift
│       │       ├── NSData+EasyExtend.h
│       │       ├── NSData+EasyExtend.m
│       │       └── PullRefresh/
│       │           ├── EZInfiniteScrolling.swift
│       │           ├── EZPullToRefresh.swift
│       │           ├── PullFooter.swift
│       │           └── PullHeader.swift
│       ├── Extend/
│       │   ├── EUI/
│       │   │   ├── Defines.h
│       │   │   ├── DesEncrypt.h
│       │   │   ├── DesEncrypt.m
│       │   │   ├── ENSObject.swift
│       │   │   ├── EUI+ButtonProperty.swift
│       │   │   ├── EUI+CollectionViewProperty.swift
│       │   │   ├── EUI+ImageProperty.swift
│       │   │   ├── EUI+LabelProperty.swift
│       │   │   ├── EUI+ScrollViewProperty.swift
│       │   │   ├── EUI+TableViewProperty.swift
│       │   │   ├── EUI+TextFieldProperty.swift
│       │   │   ├── EUI+ViewProperty.swift
│       │   │   ├── EUI.swift
│       │   │   ├── EUIExtend+UIView.swift
│       │   │   ├── EUIKit.swift
│       │   │   ├── EUIParse.swift
│       │   │   ├── EUIProperty.swift
│       │   │   ├── EUScene.swift
│       │   │   ├── EZJSCore.swift
│       │   │   ├── NSAttributedString+HTMLStyle.h
│       │   │   ├── NSAttributedString+HTMLStyle.m
│       │   │   ├── StringFormat.swift
│       │   │   ├── SwiftTryCatch.h
│       │   │   ├── SwiftTryCatch.m
│       │   │   ├── UIColor+HTMLColors.h
│       │   │   └── UIColor+HTMLColors.m
│       │   ├── FlexboxKit/
│       │   │   ├── FLEXBOXContainerView.h
│       │   │   ├── FLEXBOXContainerView.m
│       │   │   ├── FLEXBOXNode.h
│       │   │   ├── FLEXBOXNode.m
│       │   │   ├── FlexboxKit.h
│       │   │   ├── Layout.c
│       │   │   ├── Layout.h
│       │   │   ├── UIView+FLEXBOX.h
│       │   │   └── UIView+FLEXBOX.m
│       │   ├── Pinyin/
│       │   │   ├── pinyin.h
│       │   │   └── pinyin.m
│       │   ├── SwiftRegex/
│       │   │   ├── Match.swift
│       │   │   └── Regex.swift
│       │   └── URLManager/
│       │       ├── UIViewController+URLManage.h
│       │       ├── UIViewController+URLManage.m
│       │       ├── URLManager.h
│       │       ├── URLManager.m
│       │       ├── URLNavigation.h
│       │       └── URLNavigation.m
│       └── Private/
│           ├── Gumbo/
│           │   ├── attribute.c
│           │   ├── attribute.h
│           │   ├── char_ref.c
│           │   ├── char_ref.h
│           │   ├── error.c
│           │   ├── error.h
│           │   ├── gumbo.h
│           │   ├── insertion_mode.h
│           │   ├── parser.c
│           │   ├── parser.h
│           │   ├── string_buffer.c
│           │   ├── string_buffer.h
│           │   ├── string_piece.c
│           │   ├── string_piece.h
│           │   ├── tag.c
│           │   ├── token_type.h
│           │   ├── tokenizer.c
│           │   ├── tokenizer.h
│           │   ├── tokenizer_states.h
│           │   ├── utf8.c
│           │   ├── utf8.h
│           │   ├── util.c
│           │   ├── util.h
│           │   ├── vector.c
│           │   └── vector.h
│           └── ObjectiveGumbo/
│               ├── NSString+OGString.h
│               ├── NSString+OGString.m
│               ├── OGDocument.h
│               ├── OGDocument.m
│               ├── OGElement.h
│               ├── OGElement.m
│               ├── OGNode.h
│               ├── OGNode.m
│               ├── OGText.h
│               ├── OGText.m
│               ├── OGUtility.h
│               ├── OGUtility.m
│               ├── ObjectiveGumbo.h
│               └── ObjectiveGumbo.m
├── README/
│   └── Chinese.md
└── README.md

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# OS X
.DS_Store

# Xcode
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
profile
*.moved-aside
DerivedData
*.hmap
*.ipa

# Bundler
.bundle
Demo/Pods/
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
# 
# Note: if you ignore the Pods directory, make sure to uncomment
# `pod install` in .travis.yml
#
Demo/Pods/


================================================
FILE: .travis.yml
================================================
# references:
# * http://www.objc.io/issue-6/travis-ci.html
# * https://github.com/supermarin/xcpretty#usage
osx_image: xcode7
language: objective-c
cache: cocoapods
podfile: Demo/Podfile
before_install:
- gem install cocoapods # Since Travis is not always on latest version
- pod install --project-directory=Demo
install:
- gem install xcpretty --no-rdoc --no-ri --no-document --quiet
script:
- set -o pipefail && xcodebuild test -workspace Demo/Demo.xcworkspace -scheme EasyIOS-Swift -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO | xcpretty -c
- pod lib lint --quick
notifications:
  webhooks: https://hooks.pubu.im/services/21x4lqp4vepnfbn


================================================
FILE: Demo/Demo/AppDelegate.swift
================================================
//
//  AppDelegate.swift
//  Demo
//
//  Created by zhuchao on 15/5/13.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
import EasyIOS

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
        
        CODE_KEY = "code"//错误码
        MSG_KEY = "msg" //网络请求的msg信息
    
        
        LIVE_LOAD_PATH = NSURL(fileURLWithPath: __FILE__).URLByDeletingLastPathComponent!.path!+"/xml.bundle"   //xml文件的路径(项目路径)
        CRTPTO_KEY = "easyios"  //这是自定义的密钥
        
        URLManager.loadConfigFromPlist(NSBundle.mainBundle().pathForResource("url", ofType: "plist"))  // 初始化URLManager
        
        let firstVc = MainScene()
        let nav = EZNavigationController(rootViewController: firstVc)
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window!.rootViewController = nav
        self.window!.backgroundColor = UIColor.whiteColor()
        self.window!.makeKeyAndVisible()
        
        // Override point for customization after application launch.
        return true
    }

    func applicationWillResignActive(application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
    }

    func applicationDidEnterBackground(application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }

    func applicationWillEnterForeground(application: UIApplication) {
        // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
    }

    func applicationDidBecomeActive(application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }

    func applicationWillTerminate(application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }


}



================================================
FILE: Demo/Demo/Base.lproj/LaunchScreen.xib
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6214" systemVersion="14A314h" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
    <dependencies>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6207"/>
        <capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view contentMode="scaleToFill" id="iN0-l3-epB">
            <rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="  Copyright (c) 2015年 zhuchao. All rights reserved." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
                    <rect key="frame" x="20" y="439" width="441" height="21"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Demo" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
                    <rect key="frame" x="20" y="140" width="441" height="43"/>
                    <fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
                    <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
                    <nil key="highlightedColor"/>
                </label>
            </subviews>
            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
            <constraints>
                <constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/>
                <constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>
                <constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l"/>
                <constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0"/>
                <constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9"/>
                <constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/>
            </constraints>
            <nil key="simulatedStatusBarMetrics"/>
            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
            <point key="canvasLocation" x="548" y="455"/>
        </view>
    </objects>
</document>


================================================
FILE: Demo/Demo/CollectionCellViewModel.swift
================================================
//
//  CollectionCellViewModel.swift
//  Demo
//
//  Created by zhuchao on 15/5/13.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
import EasyIOS

class CollectionCellViewModel: EZViewModel {

    var url:EZString?
    var name:EZString?
    init(url:String?,name:String?){
        if url != nil {
            self.url = EZString(url!)
        }
        if name != nil {
            self.name = EZString(name!)
        }
    }
}


================================================
FILE: Demo/Demo/CollectionScene.swift
================================================
//
//  CollectionScene.swift
//  Demo
//
//  Created by zhuchao on 15/5/13.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
import EasyIOS
import Bond
import SVProgressHUD

class CollectionScene: EUScene,UICollectionViewDelegate {

    var sceneModel = CollectionSceneModel()
    var collectionView:UICollectionView?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.showBarButton(.LEFT, title: "返回", fontColor: UIColor.greenColor())
        self.sceneModel.req.requestNeedActive.value = true
        
        self.sceneModel.req.state.observe{
            switch $0 {
            case .Sending :
                SVProgressHUD.show()
            case .Success,.SuccessFromCache :
                SVProgressHUD.dismiss()
                self.collectionView?.pullToRefreshView?.stopAnimating()
            case .Error :
                SVProgressHUD.showErrorWithStatus("数据加载失败")
            default :
                return
            }
        }
        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    
    override func eu_collectionViewDidLoad(collectionView: UICollectionView?) {
        self.collectionView = collectionView
        collectionView?.delegate = self
        
        
        define("handlePullRefresh"){
            self.sceneModel.req.requestNeedActive.value = true
        }
        
        define("handleInfinite"){
            let delayTime = dispatch_time(DISPATCH_TIME_NOW,
                Int64(3.0 * Double(NSEC_PER_SEC)))
            dispatch_after(delayTime, dispatch_get_main_queue()) {
                self.collectionView?.infiniteScrollingView?.stopAnimating()
                self.collectionView?.infiniteScrollingView?.setEnded()
            }
        }
        
        self.sceneModel.viewModelList.lift().bindTo(collectionView!) { (indexPath, dataArray, collectionView) -> UICollectionViewCell in
            collectionView.dequeueReusableCell("cell",
                forIndexPath: indexPath,
                target: self,
                bind: dataArray[indexPath.section][indexPath.row])
        }
    }

    override func leftButtonTouch() {
        URLNavigation.dismissCurrentAnimated(true)
    }
}


================================================
FILE: Demo/Demo/CollectionSceneModel.swift
================================================
//
//  CollectionCellViewModel.swift
//  Demo
//
//  Created by zhuchao on 15/5/13.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
import EasyIOS
import Bond
import ObjectMapper

class FeedModel :Mappable{
    var url:String?
    var name:String?
    
    required init?(_ map: Map){
        
    }

    func mapping(map: Map) {
        url    <- map["url"]
        name   <- map["name"]
    }
}

class FeedList:Mappable {
    var list:[FeedModel]?
    
    required init?(_ map: Map){
        
    }

    func mapping(map: Map) {
        list <- map["list"]
    }
}

class CollectionSceneModel: EZSceneModel {
    var req = FeedRequest()
    var modelList:FeedList?
    
    var viewModelList =  ObservableArray<CollectionCellViewModel>([CollectionCellViewModel]())
    override init (){
        super.init()
    
        self.req.requestBlock = {
            EZAction.SEND_IQ_CACHE(self.req)
        }
        self.req.state.observe{[unowned self] value in
            switch value {
            case .Success,.SuccessFromCache :
                if let theData: AnyObject = self.req.output["data"] {
                    
                    self.modelList = Mapper<FeedList>().map(theData)
                    if let array = self.modelList?.list?.map({
                        (model) -> CollectionCellViewModel in
                        return CollectionCellViewModel(url: model.url, name: model.name)
                    }) {
                        self.viewModelList.removeAll()
                        self.viewModelList.extend(array)
                    }
                }
            default :
                return
            }
        }
    }
}


================================================
FILE: Demo/Demo/EncodeLoginScene.swift
================================================
//
//  EncodeLoginScene.swift
//  Demo
//
//  Created by zhuchao on 15/5/26.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import Foundation
import EasyIOS

class EncodeLoginScene: EUScene {
    
    override func loadView() {
        self.SUFFIX = "crypto"  //修改后缀为加密版本的
        super.loadView()
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.showBarButton(.LEFT, title: "返回", fontColor: UIColor.greenColor())
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    override func leftButtonTouch() {
        URLNavigation.dismissCurrentAnimated(true)
    }
    
}



================================================
FILE: Demo/Demo/FeedRequest.swift
================================================
//
//  FeedRequest.swift
//  Demo
//
//  Created by zhuchao on 15/5/14.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
import EasyIOS

class FeedRequest: EZRequest {
    
    //如果不使用staticPath,可以设置如下参数,同OC版本的使用方法
    
//    var feedId:String?
//    var type:String?
    
    override init() {
        super.init()
        self.staticPath = "http://7tsz2s.com1.z0.glb.clouddn.com/feedlists.txt"
        
    }
}


================================================
FILE: Demo/Demo/FlexScene.swift
================================================
//
//  FlexScene.swift
//  Demo
//
//  Created by zhuchao on 15/10/14.
//  Copyright © 2015年 zhuchao. All rights reserved.
//

import UIKit
import EasyIOS

class FlexScene: EZScene {
    var container:FLEXBOXContainerView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        container  = FLEXBOXContainerView(frame: self.view.bounds)
        container.flexJustifyContent = FLEXBOXJustification.Center
        container.flexAlignItems = FLEXBOXAlignment.Center
        container.flexDirection = FLEXBOXFlexDirection.Column
        container.backgroundColor = UIColor.grayColor()
        
        let v1 = UILabel()
        v1.text = "123123"
        v1.backgroundColor = UIColor.blueColor()
        v1.textAlignment = NSTextAlignment.Center
        v1.flexMargin = UIEdgeInsetsMake(8, 8, 8, 8)
        v1.flexPadding = UIEdgeInsetsMake(10, 10, 10, 10)
        v1.flex = 0
        container.addSubview(v1)
        
        let v2 = UILabel()
        v2.text = "321"
        v2.backgroundColor = UIColor.blueColor()
        v2.textAlignment = NSTextAlignment.Center
        v2.flexMargin = UIEdgeInsetsMake(8, 8, 8, 8)
        v2.flexPadding = UIEdgeInsetsMake(10, 10, 10, 10)
        v2.flex = 0
        container.addSubview(v2)
        self.view.addSubview(container)
    }
}


================================================
FILE: Demo/Demo/FlexXmlScene.swift
================================================
//
//  FlexXmlScene.swift
//  Demo
//
//  Created by zhuchao on 15/10/14.
//  Copyright © 2015年 zhuchao. All rights reserved.
//

import UIKit
import EasyIOS

class FlexXmlScene: EUScene {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "FLEX BOX"
        // Do any additional setup after loading the view, typically from a nib.
    }
    
}


================================================
FILE: Demo/Demo/Images.xcassets/AppIcon.appiconset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "iphone",
      "size" : "29x29",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "29x29",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "40x40",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "40x40",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "60x60",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "60x60",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: Demo/Demo/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>en</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleVersion</key>
	<string>1</string>
	<key>LSRequiresIPhoneOS</key>
	<true/>
	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSAllowsArbitraryLoads</key>
		<true/>
	</dict>
	<key>UILaunchStoryboardName</key>
	<string>LaunchScreen</string>
	<key>UIRequiredDeviceCapabilities</key>
	<array>
		<string>armv7</string>
	</array>
	<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
</dict>
</plist>


================================================
FILE: Demo/Demo/LabelScene.swift
================================================
//
//  LabelScene.swift
//  Demo
//
//  Created by zhuchao on 15/5/18.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import Foundation
import EasyIOS
import TTTAttributedLabel

class LabelScene: EUScene {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.showBarButton(.LEFT, title: "返回", fontColor: UIColor.greenColor())
        self.title = "界面里只有1个Label"
        
        
        if let label = getElementById("labelId") as? TTTAttributedLabel {
            //do someting
        }
       
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    override func eu_viewWillLoad() {
        self.attributedLabelDelegate = MainLabelDeleage()
    }
    
    override func leftButtonTouch() {
        URLNavigation.dismissCurrentAnimated(true)
    }
}



================================================
FILE: Demo/Demo/LoginScene.swift
================================================
//
//  ViewController.swift
//  Demo
//
//  Created by zhuchao on 15/5/13.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
import EasyIOS

class LoginScene: EUScene {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.showBarButton(.LEFT, title: "返回", fontColor: UIColor.greenColor())
        
//        define("login"){
//            println("登陆回调")
//        }
        
        //在模拟器中调用下面这个方法可以生成一个加密文件
//        EUI.encode("LoginScene", suffix: "xml", toPath: "/Users/zhuchao/Desktop/EncodeLoginScene.crypto")
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    override func leftButtonTouch() {
        URLNavigation.dismissCurrentAnimated(true)
    }
}



================================================
FILE: Demo/Demo/MainLabelDeleage.swift
================================================
//
//  MainLabelDeleage.swift
//  Demo
//
//  Created by zhuchao on 15/5/17.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import Foundation
import EasyIOS
import TTTAttributedLabel

class MainLabelDeleage: TTTAttributedLabelDelegateHandle {
    func attributedLabel(label: TTTAttributedLabel!, didSelectLinkWithURL url: NSURL!) {
        URLManager.pushURL(url, animated: true)
    }
}

================================================
FILE: Demo/Demo/MainScene.swift
================================================
//
//  MainScene.swift
//  Demo
//
//  Created by zhuchao on 15/5/13.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import Foundation

import Bond
import EasyIOS


class MainScene: EUScene,UITableViewDelegate{
    var sceneModel = MainSceneModel()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "EasyIOS"

//        let label = UILabel()
//        label.flexAlignItems = FLEXBOXAlignment.Center
        
        // Do any additional setup after loading the view.
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    //do someThing init before loadTheView
    override func eu_viewWillLoad() {
        self.attributedLabelDelegate = MainLabelDeleage()
    }
    
    override func eu_tableViewDidLoad(tableView:UITableView?){
        
        tableView?.delegate = self
        
        //定义一个可以给JS调用的下拉刷新回调方法handlePullRefresh()
        define("handlePullRefresh"){
            let delayTime = dispatch_time(DISPATCH_TIME_NOW,
                Int64(3.0 * Double(NSEC_PER_SEC)))
            dispatch_after(delayTime, dispatch_get_main_queue()) {
                tableView?.pullToRefreshView?.stopAnimating()
            }
        }
        
        ObservableArray([
            self.sceneModel.dataArray,
            self.sceneModel.dataArray,
            self.sceneModel.dataArray])
            .bindTo(tableView!) { (indexPath, dataArray, tableView) -> UITableViewCell in
                let data = dataArray[indexPath.section][indexPath.row]
                let cell = tableView.dequeueReusableCell("cell", forIndexPath: indexPath, target: self, bind: data)
                cell.selectionStyle = .None
                return cell
        }

    }

    //xml里已经有了tap点击事件,这里就不调用了
//    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
//        var model = self.sceneModel.dataArray[indexPath.row]
//        if let link = model.link {
//            URLManager.pushURLString(link, animated: true)
//        }
//    }
    

    func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 23.0
    }
    
    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        tableView
        return tableView.getSectionViewByTagId("bgView", target: self,bind:sceneModel.sectionArray[section])
    }
    
    
}


================================================
FILE: Demo/Demo/MainSceneModel.swift
================================================
//
//  MainSsceneModel.swift
//  Demo
//
//  Created by zhuchao on 15/5/13.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import Foundation
import Bond
import EasyIOS

class MainCellViewModel: EZViewModel {
    var title:String?
    var subTitle:NSData?
    var srcUrl:NSURL?
    var link:String?
    init(title:String,subTitle:String = "",srcUrl:String = "",link:String = ""){
        self.title = title
        if let data = subTitle.toData() {
            self.subTitle = data
        }
        self.srcUrl = NSURL(string: srcUrl)
        self.link = link
    }
}


class MainSectionViewModel: EZViewModel {
    var title:String?
    init(title:String){
        self.title = title
    }
}

class MainSceneModel: EZSceneModel {
    
    var dataArray =  ObservableArray<MainCellViewModel>(Array<MainCellViewModel>())
    var sectionArray = ObservableArray<MainSectionViewModel>(Array<MainSectionViewModel>())
    override init (){
        super.init()
        
        self.dataArray.append(MainCellViewModel(
                title: "一个简单的登陆页面",
                subTitle: "UIScrollView的使用Demo",
                srcUrl: "http://d.hiphotos.baidu.com/zhidao/pic/item/562c11dfa9ec8a13e028c4c0f603918fa0ecc0e4.jpg",
                link:"demo://login"))
        self.dataArray.append(MainCellViewModel(
            title: "还是登陆界面不过是加密版本",
            subTitle: "UIScrollView的使用Demo",
            srcUrl: "http://d.hiphotos.baidu.com/zhidao/pic/item/562c11dfa9ec8a13e028c4c0f603918fa0ecc0e4.jpg",
            link:"demo://encodelogin"))
        
        self.dataArray.append(MainCellViewModel(
                title: "Collection+网络请求+下拉控件",
                subTitle: "UICollectionView的使用Demo,包含了网络请求",
                srcUrl: "http://d.hiphotos.baidu.com/zhidao/pic/item/562c11dfa9ec8a13e028c4c0f603918fa0ecc0e4.jpg",
                link:"demo://collection"))
        self.dataArray.append(MainCellViewModel(
            title: "HTML版的Label,采用TTTAttributeLabel",
            subTitle: "<p>Hello <a href='demo://login'>World!</a></p>",
            srcUrl: "http://d.hiphotos.baidu.com/zhidao/pic/item/562c11dfa9ec8a13e028c4c0f603918fa0ecc0e4.jpg",
            link:"demo://LabelScene"))
        self.dataArray.append(MainCellViewModel(
            title: "native版本的flex模型演示",
            subTitle: "native版本的flex模型演示",
            srcUrl: "http://d.hiphotos.baidu.com/zhidao/pic/item/562c11dfa9ec8a13e028c4c0f603918fa0ecc0e4.jpg",
            link:"demo://flex"))
        self.dataArray.append(MainCellViewModel(
            title: "xml版本的flex模型演示",
            subTitle: "xml版本的flex模型演示",
            srcUrl: "http://d.hiphotos.baidu.com/zhidao/pic/item/562c11dfa9ec8a13e028c4c0f603918fa0ecc0e4.jpg",
            link:"demo://flexml"))
    
        
        self.sectionArray.append(MainSectionViewModel(
            title: "section 1"))
        self.sectionArray.append(MainSectionViewModel(
            title: "section 2"))
        self.sectionArray.append(MainSectionViewModel(
            title: "section 3"))
    }
    
}

================================================
FILE: Demo/Demo/url.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>demo</key>
	<dict>
		<key>demo://flexml</key>
		<string>FlexXmlScene</string>
		<key>demo://flex</key>
		<string>FlexScene</string>
		<key>demo://encodelogin</key>
		<string>EncodeLoginScene</string>
		<key>demo://collection</key>
		<string>CollectionScene</string>
		<key>demo://login</key>
		<string>LoginScene</string>
	</dict>
</dict>
</plist>


================================================
FILE: Demo/Demo/xml.bundle/CollectionScene.xml
================================================
<body>
    <div id="collectionView" align="0 0 0 0" type="UICollectionView" flow-layout="scroll-direction:Vertical;item-size:{300,50};section-inset:{3,3,0,3};minimum-interitem-spacing:3;minimum-line-spacing:3" content-inset="{64,0,0,0}" background-color="white" pull-to-refresh="handlePullRefresh()" infinite-scrolling="handleInfinite()">
        <div align="0 0 0 0" type="cell"  id="cell"  background-color="red">
            <span align="10 10 -10 -10" font="10 system">{{name}}</span>
        </div>
    </div>
</body>

================================================
FILE: Demo/Demo/xml.bundle/EncodeLoginScene.crypto
================================================
VTWWEpHde9NHKxqWASruTqqmlAB2w6yrgF3k4/6aH5xLCWW09IBo0wCd/XDQTXFG
H/fTwKRPrtiF85H9augC+XEcQ2BavK7sIbi99qwL0TaJOnmMoEt8n65i/BpOuCXe
U/uYXAQTOc8L43XQMRQ5o6bd0928uEK8tm/khgYB7ho2nc/LnSyk387N+7fVWasI
7ygbDY1yzWsbLYXdBju9fKvku6rqyRFUTLR3Y0LyyhNaqcK3QWkPGf0C1SpEvZN5
f/XX8+YL0sf/bMngbrOaNKQtZVQJfxJUSP4BUOHXql9Bca7o1hGERQ2JJRhBtfis
o/YWFO58QO16gHRrkqmXzHndkOknrBB0lalewwMathppGCUztFS3+D4c4Bxb8kzD
eBHwU/e5V/NWTKbje0EpX2aTLl1jHarGLqsybsEb2xACBoumJrdcATPdnXl/Ouou
NiKoS2h8muGLO46oFyusalX+/1o7wIQDG3rwhwsMKpZvTatpaAhRJlvY5/yHUDUN
iLTu0JO73PctuRI8nTpx6D9+nlw2zo/OmsuvvxldLmv9FhAs5XvcJnrnMr4z6S8o
4ohBH79i9UJfDaYxAaofMrI5szIYu3DG4qCM8NyNFQc7YoeKN1wQjat41Wenxx5B
RrtMke5dKlE0ATstakRmdNa4zqzPFkhxtVPuK4gVn7n5EPUDaz/flC3VA4zxxD7k
uo0FfD4uEREvM9UcKIXuaV+8Riu26ly2khMbPznGkKxTVeu2SWecu/HHQRPANz5S
ueyPZvELpAbiR7usH4IY37IUWz2vteVOYmwHPV+09E74YfRsoHtOEO8r4YAi+OyO
ZsXa2wn5+TSUFODny6k7y7XWpp4XIcQBDW+08lg+eLuXfoEUttw/JzqSgxxcs/F+
R9tbVIW0MAVXThjVcaD3IHnvRYeZsdj3JUDpeGOv9WbIqcYz0Fgwkg7Lav4QOy+U
SNPXnuCDw7OhsCfbifmxTCTuDPZ6HjGtFauiGEN83EpJzQGAYEktvyyEXhhS8LKk
eL/JRag25fR0VLQPCNk/5e2SP/dOI7ReR5y4l9NR5oFteKDuQytUrDiHm9f6Bn+T
MMuK4jhQ3QpmuaT1Ps8jSW3hnK6zUXStFmOgRzmDTQnGqkzHybo9W9Ewj9nWINEO
PIz/wPpVO4ok7PuxP+sLo6xdUCY6oZFhRCU4k03SQhyk6jari2PxHD4DuiyjcLLU
IW+dFxscF5dhPi0TTdSZfrD6T53NsHeLDXBECmabKT+mugc2IsV+GG9N3rhwXhyO
4mduo2v0XsNLaYAqJdZue6zcw/o40mWoPCpK37ZfSeaABEey5UUVlc+fJR6+ct20
wRlvazYrOqWKW8C5I/ZXD/ei0v7hB+KB87Q40RBEJ27uDH8mITgWqg/pwMqBAs30
7+5lrddB79wuRRHIbE907uad8seRXT8CA0QBpSER9aXfet5SK6YkhP6Ve/p7OIt5
Ym4ZhtR377+YV3dLh08xNlFJ4Fd8iE/NSvRFoVFUb0s5DPQaUL42Sd2hH3WFz3U4
W2dMZ4Cnj89i56XNnA+Gwe+eaqrQmHpLVIeAfTlnmXjUWaOFHj6Xg91drLPPyFTH
64olhQImSa6xGN3wVdDDUEN6Oz3D2YBI5gV7YQVQkMZyqV7fgjUwY7uDCStgvHDc
b64/PrtWlDCqGN79ncTKomuHhUszIhnrRxspp4u5dPim2nd45/34LEvVMF7+exZ5
RUXRKIlg4wXznUhmuAwjCuRgH88dk3UWbIfYFt52sOC1rTm5mMNcF15jRgvxZHua
89/jcEJoTfelbMTqgoJoNQ7ZiOldxHyseqxjVHaZg/yVUgWaK+yl9n/8vXC+eGsn
Bm86QHd3JCwlaKoW8hvo2R7ntnLlyp6to+gzq//o3h/wzoQJehkubFyYug7cq1xd
7pMf/OFSiTulbDK8NzGqU+JN1EHalRgoNLZMKsrHgwlW0CVDDq1TO2WLjrk+cZXB
jBbiQqW35gUK81vkqFm01BFUd/vWWG1X+cGfRgLPcMNYNHUdkYhR2MXE13o+yVUf
chDkfRgiif68lYAoP74njGQcXwAugTB9bkQIYyQCuMIxaT1W+rgieCX4ieqaa+hw
HmSd9D96UVPbhhISqZINkbmzoKsEA+iD4qqWl9/L7Kt9QESiTnRZvQW9Pi3hkEcU
d79thZ8DwCkS/1KeFJonFxe59adBZyL5d6ttXDoTBNfGrfVNEntzkj/fmTWpNYpx
LuDrc92OEylJs7Z0Utz3XX9dGU24qBCfQeEVoAK78eggtBwFxRgJmZ9f8acBI5tP
ezLDkl9eioV0hoSI1Pgfdgc38QzNJJIG98zh4mPeOmOB/aumVW1iT/cZpEPK09XH
n7vAcQxhQL6ksZdKXSqEXcDQPgrUro19qqW6fwCZcNvuvZQOA9PKmg==

================================================
FILE: Demo/Demo/xml.bundle/FlexXmlScene.xml
================================================
<body>
    <div align="0 0 0 0">
        <div align="64 0 * 0" height="100"
            justify-content="center"
            flex-direction="row"
            align-items="flex-end"
            background-color="gray"
            id="first"
            >
            <span
                text-alignment="center"
                flex-padding="{10,10,10,10}"
                flex-margin="{8,8,8,8}"
                flex="3"
                background-color="blue"
                >3</span>
            <span
                text-alignment="center"
                flex="2"
                flex-padding="{10,10,10,10}"
                flex-margin="{8,8,8,8}"
                background-color="blue"
                >2</span>
            <span
                text-alignment="center"
                flex="1"
                flex-padding="{10,10,10,10}"
                flex-margin="{8,8,8,8}"
                background-color="blue"
                >1</span>
        </div>
        <div align="left:0;right:0" margin="top:10 first" height="200"
            justify-content="center"
            flex-direction="column"
            align-items="flex-end"
            background-color="gray"
            id="second">
            <span
                text-alignment="center"
                flex-padding="{10,10,10,10}"
                flex-margin="{8,8,8,8}"
                flex="3"
                background-color="blue"
                >3</span>
            <span
                text-alignment="center"
                flex="2"
                flex-padding="{10,10,10,10}"
                flex-margin="{8,8,8,8}"
                background-color="blue"
                >2</span>
            <span
                text-alignment="center"
                flex="1"
                flex-padding="{10,10,10,10}"
                flex-margin="{8,8,8,8}"
                background-color="blue"
                >1</span>
        </div>
        <div align="left:0;right:0" margin="top:10 second" height="100"
            justify-content="center"
            flex-direction="row"
            align-items="center"
            background-color="gray"
            id="third"
            >
            <span
                text-alignment="center"
                flex-padding="{10,10,10,10}"
                flex-margin="{8,8,8,8}"
                flex="1"
                background-color="blue"
                >1</span>
            <span
                text-alignment="center"
                flex="1"
                flex-padding="{10,10,10,10}"
                flex-margin="{8,8,8,8}"
                background-color="blue"
                >1</span>
            <span
                text-alignment="center"
                flex="1"
                flex-padding="{10,10,10,10}"
                flex-margin="{8,8,8,8}"
                background-color="blue"
                >1</span>
            <span
                text-alignment="center"
                flex="1"
                flex-padding="{10,10,10,10}"
                flex-margin="{8,8,8,8}"
                background-color="blue"
                >1</span>
            <span
                text-alignment="center"
                flex="1"
                flex-padding="{10,10,10,10}"
                flex-margin="{8,8,8,8}"
                background-color="blue"
                >1</span>
        </div>
        
    </div>

</body>

================================================
FILE: Demo/Demo/xml.bundle/LabelHtml.xml
================================================
<h1>
    <a id="user-content-easyios-for-swift" class="anchor" href="#easyios-for-swift" aria-hidden="true"><span class="octicon octicon-link"></span></a>EasyIOS For Swift</h1>
<h2>
    <a id="user-content-star-is-the-best-way-to-support-easyios-" class="anchor" href="#star-is-the-best-way-to-support-easyios-" aria-hidden="true"><span class="octicon octicon-link"></span></a>Star is the Best Way to Support EasyIOS !</h2>

<ul>
    <li><a href="http://www.iosx.me">IOSX - EasyIOS Official Forum</a></li>
    <li><a href="https://github.com/EasyIOS/EasyIOS">EasyIOS-ObjC</a></li>
</ul>

<h2>
    <a id="user-content-features" class="anchor" href="#features" aria-hidden="true"><span class="octicon octicon-link"></span></a>Features</h2>

<ul>
    <li>MVVM : <code>Model-View-ViewModel</code> inspired by <a href="http://en.wikipedia.org/wiki/Functional_reactive_programming">Functional Reactive Programming</a> </li>
    <li>HTML To Native : Transform HTML&amp;CSS to Native Control,</li>
    <li>Reflect Cocoa Touch : Reflect all the Cocoa Touch Api ,we can use the Cocoa Touch Api via HTML </li>
    <li>AutoLayout : The HTML layout based on the <code>AutoLayout</code>
    </li>
    <li>Live Load : Edit the HTML and the view in smulator will update automaticly without rebuild your app</li>
    <li>Cryptographic HTML : To make the HTML be safety,we provide the <code>AES Encryption</code> to encrypt the HTML</li>
    <li>URLManager : Push or Present the Controller by the custom URL </li>
    <li>Elegant PullToRefresh : Add  PullToRefresh or InfiniteScrolling by HTML</li>
</ul>

<h2>
    <a id="user-content-usage" class="anchor" href="#usage" aria-hidden="true"><span class="octicon octicon-link"></span></a>Usage</h2>

<p>To run the example project, clone the repo, and run <code>pod install</code> from the Demo directory first.</p>

<h2>
    <a id="user-content-requirements" class="anchor" href="#requirements" aria-hidden="true"><span class="octicon octicon-link"></span></a>Requirements</h2>

<ul>
    <li>Swift</li>
    <li>IOS8</li>
</ul>
<h2>
    <a id="user-content-author" class="anchor" href="#author" aria-hidden="true"><span class="octicon octicon-link"></span></a>Author</h2>

<p>zhuchao, <a href="mailto:zhuchao@iosx.me">zhuchao@iosx.me</a></p>

<h2>
    <a id="user-content-license" class="anchor" href="#license" aria-hidden="true"><span class="octicon octicon-link"></span></a>License</h2>

<p>EasyIOS-Swift is available under the MIT license. See the LICENSE file for more info.</p>

================================================
FILE: Demo/Demo/xml.bundle/LabelScene.xml
================================================
<style>
    <!--支持css 样式设置,html中利用@的方式进行调用-->
    .contentAlign{
        edge:0 0 0 0;
        left:0 root;
        right:0 root;
    }
</style>

<body>
    <div align="0 0 0 0" type="UIScrollView" background-color="#F3F3F3">
        <div align="@contentAlign">
            <!--span标签设置了style属性则启用富文本模式,span内部可以支持原生HTML的所有属性,具体请看LabelHtml.xml文件-->
            <span align="64 0 0 0" id="labelId" style="color:#ACACAC;font-size:18px;" link-style="color:green;" number-of-lines="0">
                <!--导入XML模板文件-->
                    @import(LabelHtml)
            </span>
        </div>
    </div>
</body>

================================================
FILE: Demo/Demo/xml.bundle/LoginScene.xml
================================================
<style>
    .contentAlign{
        edge:0 0 0 0;
        left:0 root;
        right:0 root;
    }
    .inputStyle{
        font-size:15;color:#999999;
    }
</style>
<body>
    <div align="0 0 0 0" type="UIScrollView" background-color="#F3F3F3">
        <div align="@contentAlign">
            <img id="logo" image="login-logo" user-interaction-enabled="YES" ontap="tap()" align="center-x:0;top:110;"/>
            <div id="username" layer_corner-radius="8" background-color="white" align="* 15 * -15" margin="top:30 logo" height="45">
                <input class="userTextField" id="userTextField" align="edge:10 10 -10 -10;" placeholder-style="@inputStyle" keyboard-type="EmailAddress" style="@inputStyle" placeholder="上面的logo可以被点击"/>
            </div>
            <div id="password" layer_corner-radius="8" background-color="white" align="* 15 * -15" margin="top:13 username" height="45">
                <input id="passwordTextField" secure-text-entry="YES" align="10 10 -10 -10" placeholder="密码" placeholder-style="@inputStyle" style="@inputStyle" />
            </div>
            <button id="submit" style="color:white;font-size:20;" background-color="#3FBCFB" align="* 15 -10 -15" margin="top:25 password" height="45" layer_corner-radius="8" onEvent="touch-up-inside:login()">Login</button>
        </div>
    </div>
</body>

<script>
    function tap(){
        um.present('demo://login',true);
    };
    
    function login(){
        var password = document.getElementById("passwordTextField");
        password.attrs({
            placeholder:"hello",
            secureTextEntry:"NO"
        });

<!--        var logo = document.getElementById("logo")-->
<!--        password.callWithObject("test:",logo);-->

        console.log(password.val("text"));
    }
</script>

================================================
FILE: Demo/Demo/xml.bundle/MainScene.xml
================================================
<body>
    <div id="tableview" align="64 0 0 0" content-inset="{0,0,0,0}" type="UITableView"  estimated-row-height="100"  separator-style="None" pull-to-refresh="handlePullRefresh()" infinite-scrolling="handleInfinite() PullFooter">
        <div align="0 0 0 0" type="cell" id="cell" ontap-bind="um.push('{{link}}',true)" >
            <img id="avatar" align="10 10 -10 *" clips-to-bounds="YES" width="45" height="45" layer_corner-radius="5" src="{{srcUrl}}" />
            <span align="top:2 avatar;right:-10" margin="left:12 avatar"  font="15 system" id="title">{{title}}</span>
            <span align="bottom:0 avatar;right:-10" margin="left:12 avatar" font="13 system" text-color="#ACACAC" id="subTitle" style="color:#ACACAC;" link-style="color:green;" >{{subTitle}}</span>
        </div>
        
        <div type="section" id="bgView" background-color="#F2F1F6" >
            <span align="left:15;center-y:0" font="14 system">{{title}}</span>
        </div>
    </div>
</body>

================================================
FILE: Demo/Demo.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
	archiveVersion = 1;
	classes = {
	};
	objectVersion = 46;
	objects = {

/* Begin PBXBuildFile section */
		5B3FCA9A1BCDF6AB00AF20CD /* FlexScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B3FCA991BCDF6AB00AF20CD /* FlexScene.swift */; settings = {ASSET_TAGS = (); }; };
		5B4C52211BCE2E91003E0016 /* FlexXmlScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B4C52201BCE2E91003E0016 /* FlexXmlScene.swift */; settings = {ASSET_TAGS = (); }; };
		5B4C52291BCE547A003E0016 /* Chinese.md in Sources */ = {isa = PBXBuildFile; fileRef = 5B4C52271BCE547A003E0016 /* Chinese.md */; settings = {ASSET_TAGS = (); }; };
		5B4C522A1BCE547A003E0016 /* flexbox.png in Resources */ = {isa = PBXBuildFile; fileRef = 5B4C52281BCE547A003E0016 /* flexbox.png */; settings = {ASSET_TAGS = (); }; };
		5B6512B11B141A9E00B1BA89 /* EncodeLoginScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B6512B01B141A9E00B1BA89 /* EncodeLoginScene.swift */; };
		5B7B80C51B08D8E00059CAEF /* MainLabelDeleage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B7B80C41B08D8E00059CAEF /* MainLabelDeleage.swift */; };
		5B7B80DB1B0A0B2A0059CAEF /* LabelScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B7B80DA1B0A0B2A0059CAEF /* LabelScene.swift */; };
		5B8240C01B03715600D58574 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B8240BF1B03715600D58574 /* AppDelegate.swift */; };
		5B8240C21B03715600D58574 /* LoginScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B8240C11B03715600D58574 /* LoginScene.swift */; };
		5B8240C71B03715600D58574 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5B8240C61B03715600D58574 /* Images.xcassets */; };
		5B8240CA1B03715600D58574 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B8240C81B03715600D58574 /* LaunchScreen.xib */; };
		5B8240D61B03715600D58574 /* DemoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B8240D51B03715600D58574 /* DemoTests.swift */; };
		5B8240E91B0377FC00D58574 /* EasyIOS-Swift.podspec in Resources */ = {isa = PBXBuildFile; fileRef = 5B8240E61B0377FC00D58574 /* EasyIOS-Swift.podspec */; };
		5B8240EA1B0377FC00D58574 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 5B8240E71B0377FC00D58574 /* LICENSE */; };
		5B8240EB1B0377FC00D58574 /* README.md in Sources */ = {isa = PBXBuildFile; fileRef = 5B8240E81B0377FC00D58574 /* README.md */; };
		5B90B5CD1B04BFF8000C848D /* FeedRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B90B5CC1B04BFF8000C848D /* FeedRequest.swift */; };
		5BBC33DA1BB3DFE00030B054 /* xml.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 5BBC33D91BB3DFE00030B054 /* xml.bundle */; settings = {ASSET_TAGS = (); }; };
		5BDBF0CE1B038B7300E95ACF /* login-logo@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5BDBF0CD1B038B7300E95ACF /* login-logo@2x.png */; };
		5BDBF0D01B038C1700E95ACF /* MainScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BDBF0CF1B038C1700E95ACF /* MainScene.swift */; };
		5BDBF0D51B038C7800E95ACF /* MainSceneModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BDBF0D41B038C7800E95ACF /* MainSceneModel.swift */; };
		5BDBF0D91B038F0D00E95ACF /* url.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BDBF0D81B038F0D00E95ACF /* url.plist */; };
		5BDC06BB1B0394C200C486E0 /* CollectionScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BDC06BA1B0394C200C486E0 /* CollectionScene.swift */; };
		5BDC06BD1B03950500C486E0 /* CollectionSceneModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BDC06BC1B03950500C486E0 /* CollectionSceneModel.swift */; };
		5BDC06BF1B03955A00C486E0 /* CollectionCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BDC06BE1B03955A00C486E0 /* CollectionCellViewModel.swift */; };
		87D67298D115B9D5014DB706 /* Pods.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 55CB89BDD03972BB5036E6DF /* Pods.framework */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
		5B8240D01B03715600D58574 /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 5B8240B21B03715600D58574 /* Project object */;
			proxyType = 1;
			remoteGlobalIDString = 5B8240B91B03715600D58574;
			remoteInfo = Demo;
		};
/* End PBXContainerItemProxy section */

/* Begin PBXFileReference section */
		0BAFEE4C5E077414790C2042 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = "<group>"; };
		55CB89BDD03972BB5036E6DF /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; };
		5B3FCA991BCDF6AB00AF20CD /* FlexScene.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FlexScene.swift; sourceTree = "<group>"; };
		5B4C52201BCE2E91003E0016 /* FlexXmlScene.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FlexXmlScene.swift; sourceTree = "<group>"; };
		5B4C52271BCE547A003E0016 /* Chinese.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = Chinese.md; sourceTree = "<group>"; };
		5B4C52281BCE547A003E0016 /* flexbox.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = flexbox.png; sourceTree = "<group>"; };
		5B6512B01B141A9E00B1BA89 /* EncodeLoginScene.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EncodeLoginScene.swift; sourceTree = "<group>"; };
		5B7B80C41B08D8E00059CAEF /* MainLabelDeleage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainLabelDeleage.swift; sourceTree = "<group>"; };
		5B7B80DA1B0A0B2A0059CAEF /* LabelScene.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LabelScene.swift; sourceTree = "<group>"; };
		5B8240BA1B03715600D58574 /* Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Demo.app; sourceTree = BUILT_PRODUCTS_DIR; };
		5B8240BE1B03715600D58574 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		5B8240BF1B03715600D58574 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
		5B8240C11B03715600D58574 /* LoginScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginScene.swift; sourceTree = "<group>"; };
		5B8240C61B03715600D58574 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
		5B8240C91B03715600D58574 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
		5B8240CF1B03715600D58574 /* DemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
		5B8240D41B03715600D58574 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		5B8240D51B03715600D58574 /* DemoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoTests.swift; sourceTree = "<group>"; };
		5B8240E61B0377FC00D58574 /* EasyIOS-Swift.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "EasyIOS-Swift.podspec"; path = "../EasyIOS-Swift.podspec"; sourceTree = "<group>"; };
		5B8240E71B0377FC00D58574 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = "<group>"; };
		5B8240E81B0377FC00D58574 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; };
		5B90B5CC1B04BFF8000C848D /* FeedRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedRequest.swift; sourceTree = "<group>"; };
		5BBC33D91BB3DFE00030B054 /* xml.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = xml.bundle; sourceTree = "<group>"; };
		5BDBF0CD1B038B7300E95ACF /* login-logo@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "login-logo@2x.png"; sourceTree = "<group>"; };
		5BDBF0CF1B038C1700E95ACF /* MainScene.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainScene.swift; sourceTree = "<group>"; };
		5BDBF0D41B038C7800E95ACF /* MainSceneModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainSceneModel.swift; sourceTree = "<group>"; };
		5BDBF0D81B038F0D00E95ACF /* url.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = url.plist; sourceTree = "<group>"; };
		5BDC06BA1B0394C200C486E0 /* CollectionScene.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionScene.swift; sourceTree = "<group>"; };
		5BDC06BC1B03950500C486E0 /* CollectionSceneModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionSceneModel.swift; sourceTree = "<group>"; };
		5BDC06BE1B03955A00C486E0 /* CollectionCellViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionCellViewModel.swift; sourceTree = "<group>"; };
		6FA5AECAF1463C83BB66DE59 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
		5B8240B71B03715600D58574 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				87D67298D115B9D5014DB706 /* Pods.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		5B8240CC1B03715600D58574 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
		1729A45EA55A2C898A1E3A6F /* Pods */ = {
			isa = PBXGroup;
			children = (
				6FA5AECAF1463C83BB66DE59 /* Pods.debug.xcconfig */,
				0BAFEE4C5E077414790C2042 /* Pods.release.xcconfig */,
			);
			name = Pods;
			sourceTree = "<group>";
		};
		5B3FCA981BCDF68B00AF20CD /* FlexScene */ = {
			isa = PBXGroup;
			children = (
				5B3FCA991BCDF6AB00AF20CD /* FlexScene.swift */,
				5B4C52201BCE2E91003E0016 /* FlexXmlScene.swift */,
			);
			name = FlexScene;
			sourceTree = "<group>";
		};
		5B4C52261BCE547A003E0016 /* README */ = {
			isa = PBXGroup;
			children = (
				5B4C52271BCE547A003E0016 /* Chinese.md */,
				5B4C52281BCE547A003E0016 /* flexbox.png */,
			);
			name = README;
			path = ../README;
			sourceTree = "<group>";
		};
		5B7B80D91B0A0B0F0059CAEF /* LabelScene */ = {
			isa = PBXGroup;
			children = (
				5B7B80DA1B0A0B2A0059CAEF /* LabelScene.swift */,
			);
			name = LabelScene;
			sourceTree = "<group>";
		};
		5B8240B11B03715600D58574 = {
			isa = PBXGroup;
			children = (
				5B8240DF1B0372B500D58574 /* PodMeta */,
				5B8240BC1B03715600D58574 /* Demo */,
				5B8240D21B03715600D58574 /* DemoTests */,
				5B8240BB1B03715600D58574 /* Products */,
				1729A45EA55A2C898A1E3A6F /* Pods */,
				82578B0764B5D4425C7B4BC5 /* Frameworks */,
			);
			sourceTree = "<group>";
		};
		5B8240BB1B03715600D58574 /* Products */ = {
			isa = PBXGroup;
			children = (
				5B8240BA1B03715600D58574 /* Demo.app */,
				5B8240CF1B03715600D58574 /* DemoTests.xctest */,
			);
			name = Products;
			sourceTree = "<group>";
		};
		5B8240BC1B03715600D58574 /* Demo */ = {
			isa = PBXGroup;
			children = (
				5B3FCA981BCDF68B00AF20CD /* FlexScene */,
				5B7B80D91B0A0B0F0059CAEF /* LabelScene */,
				5B90B5C11B043889000C848D /* LoginScene */,
				5BDC06B91B03949900C486E0 /* CollectionScene */,
				5BDBF0D31B038C6400E95ACF /* MainScene */,
				5BDBF0CC1B038B6800E95ACF /* Rescource */,
				5B8240BF1B03715600D58574 /* AppDelegate.swift */,
				5B8240C61B03715600D58574 /* Images.xcassets */,
				5B8240C81B03715600D58574 /* LaunchScreen.xib */,
				5B8240BD1B03715600D58574 /* Supporting Files */,
				5BBC33D91BB3DFE00030B054 /* xml.bundle */,
			);
			path = Demo;
			sourceTree = "<group>";
		};
		5B8240BD1B03715600D58574 /* Supporting Files */ = {
			isa = PBXGroup;
			children = (
				5B8240BE1B03715600D58574 /* Info.plist */,
			);
			name = "Supporting Files";
			sourceTree = "<group>";
		};
		5B8240D21B03715600D58574 /* DemoTests */ = {
			isa = PBXGroup;
			children = (
				5B8240D51B03715600D58574 /* DemoTests.swift */,
				5B8240D31B03715600D58574 /* Supporting Files */,
			);
			path = DemoTests;
			sourceTree = "<group>";
		};
		5B8240D31B03715600D58574 /* Supporting Files */ = {
			isa = PBXGroup;
			children = (
				5B8240D41B03715600D58574 /* Info.plist */,
			);
			name = "Supporting Files";
			sourceTree = "<group>";
		};
		5B8240DF1B0372B500D58574 /* PodMeta */ = {
			isa = PBXGroup;
			children = (
				5B4C52261BCE547A003E0016 /* README */,
				5B8240E61B0377FC00D58574 /* EasyIOS-Swift.podspec */,
				5B8240E71B0377FC00D58574 /* LICENSE */,
				5B8240E81B0377FC00D58574 /* README.md */,
			);
			name = PodMeta;
			sourceTree = "<group>";
		};
		5B90B5C11B043889000C848D /* LoginScene */ = {
			isa = PBXGroup;
			children = (
				5B8240C11B03715600D58574 /* LoginScene.swift */,
				5B6512B01B141A9E00B1BA89 /* EncodeLoginScene.swift */,
			);
			name = LoginScene;
			sourceTree = "<group>";
		};
		5BDBF0CC1B038B6800E95ACF /* Rescource */ = {
			isa = PBXGroup;
			children = (
				5BDBF0D81B038F0D00E95ACF /* url.plist */,
				5BDBF0CD1B038B7300E95ACF /* login-logo@2x.png */,
			);
			name = Rescource;
			sourceTree = "<group>";
		};
		5BDBF0D31B038C6400E95ACF /* MainScene */ = {
			isa = PBXGroup;
			children = (
				5BDBF0CF1B038C1700E95ACF /* MainScene.swift */,
				5BDBF0D41B038C7800E95ACF /* MainSceneModel.swift */,
				5B7B80C41B08D8E00059CAEF /* MainLabelDeleage.swift */,
			);
			name = MainScene;
			sourceTree = "<group>";
		};
		5BDC06B91B03949900C486E0 /* CollectionScene */ = {
			isa = PBXGroup;
			children = (
				5BDC06BA1B0394C200C486E0 /* CollectionScene.swift */,
				5BDC06BC1B03950500C486E0 /* CollectionSceneModel.swift */,
				5BDC06BE1B03955A00C486E0 /* CollectionCellViewModel.swift */,
				5B90B5CC1B04BFF8000C848D /* FeedRequest.swift */,
			);
			name = CollectionScene;
			sourceTree = "<group>";
		};
		82578B0764B5D4425C7B4BC5 /* Frameworks */ = {
			isa = PBXGroup;
			children = (
				55CB89BDD03972BB5036E6DF /* Pods.framework */,
			);
			name = Frameworks;
			sourceTree = "<group>";
		};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
		5B8240B91B03715600D58574 /* Demo */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 5B8240D91B03715600D58574 /* Build configuration list for PBXNativeTarget "Demo" */;
			buildPhases = (
				58FFA88B0BBAEE141CD3F935 /* Check Pods Manifest.lock */,
				5B8240B61B03715600D58574 /* Sources */,
				5B8240B71B03715600D58574 /* Frameworks */,
				5B8240B81B03715600D58574 /* Resources */,
				B9036220CE63B1B76499B1DF /* Embed Pods Frameworks */,
				B0EA13793EF213CED106EF77 /* Copy Pods Resources */,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = Demo;
			productName = Demo;
			productReference = 5B8240BA1B03715600D58574 /* Demo.app */;
			productType = "com.apple.product-type.application";
		};
		5B8240CE1B03715600D58574 /* DemoTests */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 5B8240DC1B03715600D58574 /* Build configuration list for PBXNativeTarget "DemoTests" */;
			buildPhases = (
				5B8240CB1B03715600D58574 /* Sources */,
				5B8240CC1B03715600D58574 /* Frameworks */,
				5B8240CD1B03715600D58574 /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
				5B8240D11B03715600D58574 /* PBXTargetDependency */,
			);
			name = DemoTests;
			productName = DemoTests;
			productReference = 5B8240CF1B03715600D58574 /* DemoTests.xctest */;
			productType = "com.apple.product-type.bundle.unit-test";
		};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
		5B8240B21B03715600D58574 /* Project object */ = {
			isa = PBXProject;
			attributes = {
				LastSwiftMigration = 0700;
				LastSwiftUpdateCheck = 0700;
				LastUpgradeCheck = 0700;
				ORGANIZATIONNAME = zhuchao;
				TargetAttributes = {
					5B8240B91B03715600D58574 = {
						CreatedOnToolsVersion = 6.3.1;
					};
					5B8240CE1B03715600D58574 = {
						CreatedOnToolsVersion = 6.3.1;
						TestTargetID = 5B8240B91B03715600D58574;
					};
				};
			};
			buildConfigurationList = 5B8240B51B03715600D58574 /* Build configuration list for PBXProject "Demo" */;
			compatibilityVersion = "Xcode 3.2";
			developmentRegion = English;
			hasScannedForEncodings = 0;
			knownRegions = (
				en,
				Base,
			);
			mainGroup = 5B8240B11B03715600D58574;
			productRefGroup = 5B8240BB1B03715600D58574 /* Products */;
			projectDirPath = "";
			projectRoot = "";
			targets = (
				5B8240B91B03715600D58574 /* Demo */,
				5B8240CE1B03715600D58574 /* DemoTests */,
			);
		};
/* End PBXProject section */

/* Begin PBXResourcesBuildPhase section */
		5B8240B81B03715600D58574 /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				5BBC33DA1BB3DFE00030B054 /* xml.bundle in Resources */,
				5B8240CA1B03715600D58574 /* LaunchScreen.xib in Resources */,
				5B8240E91B0377FC00D58574 /* EasyIOS-Swift.podspec in Resources */,
				5BDBF0CE1B038B7300E95ACF /* login-logo@2x.png in Resources */,
				5B8240C71B03715600D58574 /* Images.xcassets in Resources */,
				5BDBF0D91B038F0D00E95ACF /* url.plist in Resources */,
				5B4C522A1BCE547A003E0016 /* flexbox.png in Resources */,
				5B8240EA1B0377FC00D58574 /* LICENSE in Resources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		5B8240CD1B03715600D58574 /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXResourcesBuildPhase section */

/* Begin PBXShellScriptBuildPhase section */
		58FFA88B0BBAEE141CD3F935 /* Check Pods Manifest.lock */ = {
			isa = PBXShellScriptBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			inputPaths = (
			);
			name = "Check Pods Manifest.lock";
			outputPaths = (
			);
			runOnlyForDeploymentPostprocessing = 0;
			shellPath = /bin/sh;
			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
			showEnvVarsInLog = 0;
		};
		B0EA13793EF213CED106EF77 /* Copy Pods Resources */ = {
			isa = PBXShellScriptBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			inputPaths = (
			);
			name = "Copy Pods Resources";
			outputPaths = (
			);
			runOnlyForDeploymentPostprocessing = 0;
			shellPath = /bin/sh;
			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n";
			showEnvVarsInLog = 0;
		};
		B9036220CE63B1B76499B1DF /* Embed Pods Frameworks */ = {
			isa = PBXShellScriptBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			inputPaths = (
			);
			name = "Embed Pods Frameworks";
			outputPaths = (
			);
			runOnlyForDeploymentPostprocessing = 0;
			shellPath = /bin/sh;
			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n";
			showEnvVarsInLog = 0;
		};
/* End PBXShellScriptBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
		5B8240B61B03715600D58574 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				5BDC06BD1B03950500C486E0 /* CollectionSceneModel.swift in Sources */,
				5B90B5CD1B04BFF8000C848D /* FeedRequest.swift in Sources */,
				5B6512B11B141A9E00B1BA89 /* EncodeLoginScene.swift in Sources */,
				5B4C52291BCE547A003E0016 /* Chinese.md in Sources */,
				5B4C52211BCE2E91003E0016 /* FlexXmlScene.swift in Sources */,
				5BDBF0D51B038C7800E95ACF /* MainSceneModel.swift in Sources */,
				5BDC06BF1B03955A00C486E0 /* CollectionCellViewModel.swift in Sources */,
				5B3FCA9A1BCDF6AB00AF20CD /* FlexScene.swift in Sources */,
				5BDC06BB1B0394C200C486E0 /* CollectionScene.swift in Sources */,
				5B7B80DB1B0A0B2A0059CAEF /* LabelScene.swift in Sources */,
				5B8240EB1B0377FC00D58574 /* README.md in Sources */,
				5BDBF0D01B038C1700E95ACF /* MainScene.swift in Sources */,
				5B8240C21B03715600D58574 /* LoginScene.swift in Sources */,
				5B8240C01B03715600D58574 /* AppDelegate.swift in Sources */,
				5B7B80C51B08D8E00059CAEF /* MainLabelDeleage.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		5B8240CB1B03715600D58574 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				5B8240D61B03715600D58574 /* DemoTests.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXSourcesBuildPhase section */

/* Begin PBXTargetDependency section */
		5B8240D11B03715600D58574 /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			target = 5B8240B91B03715600D58574 /* Demo */;
			targetProxy = 5B8240D01B03715600D58574 /* PBXContainerItemProxy */;
		};
/* End PBXTargetDependency section */

/* Begin PBXVariantGroup section */
		5B8240C81B03715600D58574 /* LaunchScreen.xib */ = {
			isa = PBXVariantGroup;
			children = (
				5B8240C91B03715600D58574 /* Base */,
			);
			name = LaunchScreen.xib;
			sourceTree = "<group>";
		};
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */
		5B8240D71B03715600D58574 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				ENABLE_TESTABILITY = YES;
				GCC_C_LANGUAGE_STANDARD = gnu99;
				GCC_DYNAMIC_NO_PIC = NO;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_OPTIMIZATION_LEVEL = 0;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
				);
				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				IPHONEOS_DEPLOYMENT_TARGET = 8.3;
				MTL_ENABLE_DEBUG_INFO = YES;
				ONLY_ACTIVE_ARCH = YES;
				SDKROOT = iphoneos;
				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
			};
			name = Debug;
		};
		5B8240D81B03715600D58574 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				ENABLE_NS_ASSERTIONS = NO;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				GCC_C_LANGUAGE_STANDARD = gnu99;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				IPHONEOS_DEPLOYMENT_TARGET = 8.3;
				MTL_ENABLE_DEBUG_INFO = NO;
				SDKROOT = iphoneos;
				VALIDATE_PRODUCT = YES;
			};
			name = Release;
		};
		5B8240DA1B03715600D58574 /* Debug */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = 6FA5AECAF1463C83BB66DE59 /* Pods.debug.xcconfig */;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				CLANG_ENABLE_MODULES = YES;
				INFOPLIST_FILE = Demo/Info.plist;
				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
				PRODUCT_BUNDLE_IDENTIFIER = "me.iosx.$(PRODUCT_NAME:rfc1034identifier)";
				PRODUCT_NAME = "$(TARGET_NAME)";
				SWIFT_INSTALL_OBJC_HEADER = NO;
				SWIFT_OBJC_BRIDGING_HEADER = "";
				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
			};
			name = Debug;
		};
		5B8240DB1B03715600D58574 /* Release */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = 0BAFEE4C5E077414790C2042 /* Pods.release.xcconfig */;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				CLANG_ENABLE_MODULES = YES;
				INFOPLIST_FILE = Demo/Info.plist;
				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
				PRODUCT_BUNDLE_IDENTIFIER = "me.iosx.$(PRODUCT_NAME:rfc1034identifier)";
				PRODUCT_NAME = "$(TARGET_NAME)";
				SWIFT_INSTALL_OBJC_HEADER = NO;
				SWIFT_OBJC_BRIDGING_HEADER = "";
			};
			name = Release;
		};
		5B8240DD1B03715600D58574 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				BUNDLE_LOADER = "$(TEST_HOST)";
				FRAMEWORK_SEARCH_PATHS = (
					"$(SDKROOT)/Developer/Library/Frameworks",
					"$(inherited)",
				);
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
				);
				INFOPLIST_FILE = DemoTests/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				PRODUCT_BUNDLE_IDENTIFIER = "me.iosx.$(PRODUCT_NAME:rfc1034identifier)";
				PRODUCT_NAME = "$(TARGET_NAME)";
				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Demo.app/Demo";
			};
			name = Debug;
		};
		5B8240DE1B03715600D58574 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				BUNDLE_LOADER = "$(TEST_HOST)";
				FRAMEWORK_SEARCH_PATHS = (
					"$(SDKROOT)/Developer/Library/Frameworks",
					"$(inherited)",
				);
				INFOPLIST_FILE = DemoTests/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				PRODUCT_BUNDLE_IDENTIFIER = "me.iosx.$(PRODUCT_NAME:rfc1034identifier)";
				PRODUCT_NAME = "$(TARGET_NAME)";
				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Demo.app/Demo";
			};
			name = Release;
		};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
		5B8240B51B03715600D58574 /* Build configuration list for PBXProject "Demo" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				5B8240D71B03715600D58574 /* Debug */,
				5B8240D81B03715600D58574 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		5B8240D91B03715600D58574 /* Build configuration list for PBXNativeTarget "Demo" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				5B8240DA1B03715600D58574 /* Debug */,
				5B8240DB1B03715600D58574 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		5B8240DC1B03715600D58574 /* Build configuration list for PBXNativeTarget "DemoTests" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				5B8240DD1B03715600D58574 /* Debug */,
				5B8240DE1B03715600D58574 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
/* End XCConfigurationList section */
	};
	rootObject = 5B8240B21B03715600D58574 /* Project object */;
}


================================================
FILE: Demo/Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "self:Demo.xcodeproj">
   </FileRef>
</Workspace>


================================================
FILE: Demo/Demo.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "group:Demo.xcodeproj">
   </FileRef>
   <FileRef
      location = "group:Pods/Pods.xcodeproj">
   </FileRef>
</Workspace>


================================================
FILE: Demo/DemoTests/DemoTests.swift
================================================
//
//  DemoTests.swift
//  DemoTests
//
//  Created by zhuchao on 15/5/13.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
import XCTest

class DemoTests: XCTestCase {
    
    override func setUp() {
        super.setUp()
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }
    
    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }
    
    func testExample() {
        // This is an example of a functional test case.
        XCTAssert(true, "Pass")
    }
    
    func testPerformanceExample() {
        // This is an example of a performance test case.
        self.measureBlock() {
            // Put the code you want to measure the time of here.
        }
    }
    
}


================================================
FILE: Demo/DemoTests/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>en</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>BNDL</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleVersion</key>
	<string>1</string>
</dict>
</plist>


================================================
FILE: Demo/Podfile
================================================
platform :ios, '8.0'
use_frameworks!
pod "EasyIOS-Swift", :path => "../"
pod 'SVProgressHUD', '~> 1.1.3'

================================================
FILE: EasyIOS-Swift.podspec
================================================
#
# Be sure to run `pod lib lint EasyIOS-Swift.podspec' to ensure this is a
# valid spec and remove all comments before submitting the spec.
#
# Any lines starting with a # are optional, but encouraged
#
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
#

Pod::Spec.new do |s|
  s.name             = "EasyIOS-Swift"
  s.version          = "2.0.1"
  s.summary          = "The Swift version of EasyIOS"
  s.description      = <<-DESC
                      EasyIOS is a new generation of development framework based on `Model-View-ViewModel`,`HTML To Native`,`Live Load`,`FlexBox`.
                       DESC
  s.homepage         = "https://github.com/EasyIOS/EasyIOS-Swift"
  # s.screenshots     = "www.example.com/screenshots_1", "www.example.com/screenshots_2"
  s.license          = 'MIT'
  s.author           = { "zhuchao" => "zhuchao@iosx.me" }
  s.source           = { :git => "https://github.com/EasyIOS/EasyIOS-Swift.git", :tag => s.version.to_s }
  #s.source           = { :git => "/Users/zhuchao/Documents/EasyIOS-Swift"}
  s.social_media_url = 'https://twitter.com/zhuchaowe'

  s.platform     = :ios, '8.0'
  s.requires_arc = true
  s.module_name = "EasyIOS"
  s.source_files = 'Pod/Classes/**/*'
  s.resource_bundles = {'EasyIOS-Swift' => ['Pod/Assets/*.png']}
    s.dependency 'HanekeSwift'
    s.dependency 'Bond'
    s.dependency 'Alamofire'
    s.dependency 'SnapKit'
    s.dependency 'Kingfisher'
    s.dependency 'ObjectMapper'
    s.dependency 'ReachabilitySwift'
    s.dependency 'TTTAttributedLabel'
s.public_header_files = 'Pod/Classes/Easy/**/*.h','Pod/Classes/Extend/**/*.h','Pod/Classes/Private/**/*.h'
s.frameworks = 'UIKit','JavaScriptCore'
end


================================================
FILE: LICENSE
================================================
Copyright (c) 2015 zhuchao <zhuchao@iosx.me>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.



================================================
FILE: Pod/Assets/.gitkeep
================================================


================================================
FILE: Pod/Classes/.gitkeep
================================================


================================================
FILE: Pod/Classes/Easy/Core/EZAction.swift
================================================
//
//  Action.swift
//  medical
//
//  Created by zhuchao on 15/4/25.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
import Alamofire
import Haneke
import Bond
import ReachabilitySwift

public var HOST_URL = "" //服务端域名:端口
public var CODE_KEY = "" //错误码key,暂不支持路径 如 code
public var RIGHT_CODE = 0  //正确校验码
public var MSG_KEY = "" //消息提示msg,暂不支持路径 如 msg


private var networkReachabilityHandle: UInt8 = 2;

public class EZAction: NSObject {
    
    //使用缓存策略 仅首次读取缓存
    public class func SEND_IQ_CACHE (req:EZRequest) {
        req.useCache = true
        req.dataFromCache = req.isFirstRequest
        self.Send(req)
    }
    
    //使用缓存策略 优先从缓存读取
    public class func SEND_CACHE (req:EZRequest) {
        req.useCache = true
        req.dataFromCache = true
        self.Send(req)
    }
    
    //不使用缓存策略
    public class func SEND (req:EZRequest) {
        req.useCache = false
        req.dataFromCache = false
        self.Send(req)
    }
    
    
    public class func Send (req :EZRequest){
        var url = ""
        var requestParams = Dictionary<String,AnyObject>()
        
        if !req.staticPath.characters.isEmpty {
            url = req.staticPath
        }else{
            if req.scheme.characters.isEmpty {
                req.scheme = "http"
            }
            if req.host.characters.isEmpty {
                req.host = HOST_URL
            }
            url = req.scheme + "://" + req.host + req.path
            if  req.appendPathInfo.characters.isEmpty {
                requestParams = req.requestParams
            }else{
                url = url + req.appendPathInfo
            }
        }
        req.state.value = RequestState.Sending
        
        req.op = req.manager
            .request(req.method, url, parameters: requestParams, encoding: req.parameterEncoding)
            .validate(statusCode: 200..<300)
            .validate(contentType: req.acceptableContentTypes)
            .responseJSON { response  in
                 req.response = response
                if response.result.isFailure{
                    req.error = response.result.error
                    self.failed(req)
                }else{
                    req.output = response.result.value as! Dictionary<String, AnyObject>
                    self.checkCode(req)
                }
            }
        req.url = req.op?.request!.URL
        self.getCacheJson(req)
    }
    
    public class func Upload (req :EZRequest){
        req.state.value = RequestState.Sending
        req.op = req.manager
            .upload(.POST, req.uploadUrl, data: req.uploadData!)
            .validate(statusCode: 200..<300)
            .validate(contentType: req.acceptableContentTypes)
            .progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
                req.totalBytesWritten = Double(totalBytesWritten)
                req.totalBytesExpectedToWrite = Double(totalBytesExpectedToWrite)
                req.progress = Double(totalBytesWritten) / Double(totalBytesExpectedToWrite)
            }.responseJSON { response in
                req.response = response
                if response.result.isFailure{
                    req.error = response.result.error
                    self.failed(req)
                }else{
                    req.output = response.result.value as! Dictionary<String, AnyObject>
                    self.checkCode(req)
                }
            }
        req.url = req.op?.request!.URL
    }
    
    public class func Download (req :EZRequest){
        req.state.value = RequestState.Sending
        req.op = req.manager
            .download(.GET, req.downloadUrl, destination: { (temporaryURL, response) in
            let directoryURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,
                    inDomains: .UserDomainMask)[0]
            return directoryURL.URLByAppendingPathComponent(req.targetPath + response.suggestedFilename!)
        })
            .validate(statusCode: 200..<300)
            .progress { (bytesRead, totalBytesRead, totalBytesExpectedToRead) in
                req.totalBytesRead = Double(totalBytesRead)
                req.totalBytesExpectedToRead = Double(totalBytesExpectedToRead)
                req.progress = Double(totalBytesRead) / Double(totalBytesExpectedToRead)
            }
            .response { (request, response, _, error) in
                if error != nil{
                    req.error = error
                    self.failed(req)
                }else{
                    req.state.value = RequestState.Success
                }
            }
        req.url = req.op?.request!.URL
    }
    
    private class func cacheJson (req: EZRequest) {
        if req.useCache {
            let cache = Shared.JSONCache
            cache.set(value: .Dictionary(req.output), key: req.cacheKey, formatName: HanekeGlobals.Cache.OriginalFormatName){ JSON in
                EZPrintln("Cache Success for key: \(req.cacheKey)")
            }
        }
    }
    
    private class func getCacheJson (req: EZRequest) {
        let cache = Shared.JSONCache
        cache.fetch(key: req.cacheKey).onSuccess { JSON in
            req.output = JSON.dictionary
            if req.dataFromCache && !isEmpty(req.output) {
                let delayTime = dispatch_time(DISPATCH_TIME_NOW,
                    Int64(0.1 * Double(NSEC_PER_SEC)))
            
                dispatch_after(delayTime, dispatch_get_main_queue()) {
                    self.loadFromCache(req)
                }
            }
        }
    }
    
    private class func loadFromCache (req: EZRequest){
        if req.needCheckCode && req.state.value != .Success {
            req.codeKey = req.output[CODE_KEY] as? Int
            if req.codeKey == RIGHT_CODE {
                req.message = req.output[MSG_KEY] as? String
                req.state.value = RequestState.SuccessFromCache
                EZPrintln("Fetch  Success from Cache by key: \(req.cacheKey)")
            }else{
                req.message = req.output[MSG_KEY] as? String
                req.state.value = RequestState.ErrorFromCache
                EZPrintln(req.message)
            }
        }
    }
    
    private class func checkCode (req: EZRequest) {
        if req.needCheckCode {
            req.codeKey = req.output[CODE_KEY] as? Int
            if req.codeKey == RIGHT_CODE {
                self.success(req)
                self.cacheJson(req)
            }else{
                self.error(req)
            }
        }else{
            req.state.value = RequestState.Success
            self.cacheJson(req)
        }
    }

    
    private class func success (req: EZRequest) {
        req.isFirstRequest = false
        req.message = req.output[MSG_KEY] as? String
        if req.output.isEmpty {
            req.state.value = RequestState.Error
        }else{
            req.state.value = RequestState.Success
        }
    }
    
    private class func failed (req: EZRequest) {
        req.message = req.error.debugDescription
        req.state.value = RequestState.Failed
        EZPrintln(req.message)
    }
    
    private class func error (req: EZRequest) {
        req.message = req.output[MSG_KEY] as? String
        req.state.value = RequestState.Error
        EZPrintln(req.message)
    }
    
    /* Usage
    EZAction.networkReachability *->> Bond<NetworkStatus>{ status in
        switch (status) {
        case .NotReachable:
        EZPrintln("NotReachable")
        case .ReachableViaWiFi:
        EZPrintln("ReachableViaWiFi")
        case .ReachableViaWWAN:
        EZPrintln("ReachableViaWWAN")
        default:
        EZPrintln("default")
        }
    }
    */
    
    public class var networkReachability: Observable<Reachability.NetworkStatus>? {
        if let d: AnyObject = objc_getAssociatedObject(self, &networkReachabilityHandle) {
            return d as? Observable<Reachability.NetworkStatus>
        } else {
            do {
                let reachability = try Reachability.reachabilityForInternetConnection()
                let d = Observable<Reachability.NetworkStatus>(reachability.currentReachabilityStatus)
                reachability.whenReachable = { reachability in
                    dispatch_async(dispatch_get_main_queue()) {
                        d.value = reachability.currentReachabilityStatus
                    }
                }
                reachability.whenUnreachable = { reachability in
                    dispatch_async(dispatch_get_main_queue()) {
                        d.value = reachability.currentReachabilityStatus
                    }
                }
                try reachability.startNotifier()
                objc_setAssociatedObject(self, &networkReachabilityHandle, d, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
                return d
            } catch {
                print("Unable to create Reachability")
                return nil
            }
        }
    }
}




================================================
FILE: Pod/Classes/Easy/Core/EZCollectionView.swift
================================================
//
//  EZCollectionView.swift
//  medical
//
//  Created by zhuchao on 15/4/26.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit

public class EZCollectionView: UICollectionView {

    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func drawRect(rect: CGRect) {
        // Drawing code
    }
    */

}


================================================
FILE: Pod/Classes/Easy/Core/EZNavigationController.swift
================================================
//
//  EZNavigationController.swift
//  medical
//
//  Created by zhuchao on 15/4/24.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit

public class EZNavigationController: UINavigationController,UINavigationControllerDelegate,UIGestureRecognizerDelegate{

    public var popGestureRecognizerEnabled = true
    
    override public func viewDidLoad() {
        super.viewDidLoad()
        self.configGestureRecognizer()
        // Do any additional setup after loading the view.
    }

    override public func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    public func configGestureRecognizer() {
        if let target = self.interactivePopGestureRecognizer?.delegate {
            let pan = UIPanGestureRecognizer(target: target, action: Selector("handleNavigationTransition:"))
            pan.delegate = self
            self.view.addGestureRecognizer(pan)
        }
        //禁掉系统的侧滑手势
        weak var weekSelf = self
        self.interactivePopGestureRecognizer?.enabled = false;
        self.interactivePopGestureRecognizer?.delegate = weekSelf;
    }

    public func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
        if gestureRecognizer != self.interactivePopGestureRecognizer && self.viewControllers.count > 1 && self.popGestureRecognizerEnabled{
            return true
        }else{
            return false
        }
    }
    
    override public func  pushViewController(viewController: UIViewController, animated: Bool) {
        self.interactivePopGestureRecognizer?.enabled = false
        super.pushViewController(viewController, animated: animated)
    }
    
    //UINavigationControllerDelegate
    public func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
        if self.popGestureRecognizerEnabled {
            self.interactivePopGestureRecognizer?.enabled = true
        }
    }
}


================================================
FILE: Pod/Classes/Easy/Core/EZRequest.swift
================================================
//
//  Request.swift
//  medical
//
//  Created by zhuchao on 15/4/24.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
import Bond
import Alamofire

public enum RequestState : Int {
    case Default  //初始化状态
    case Success 
    case Failed
    case Sending
    case Error
    case Cancle
    case Suspend
    case SuccessFromCache
    case ErrorFromCache
}
private var enabledDynamicHandleRequest: UInt8 = 0
private var stateDynamicHandleRequest: UInt8 = 1
private var managerHandle: UInt8 = 2

public class EZRequest: NSObject {
    public var output = Dictionary<String,AnyObject>() // 序列化后的数据
    public var params = Dictionary<String,AnyObject>() //使用字典参数
    public var response:Response<AnyObject, NSError>? // 获取字符串数据
    public var error:ErrorType? //请求的错误
    public var state = Observable<RequestState>(.Default) //Request状态
    public var url:NSURL? //请求的链接
    public var message:String? //错误消息或者服务器返回的MSG
    public var codeKey:Int?  // 错误码返回
    
    //upload上传相关参数
    public var uploadUrl:URLStringConvertible = "" //上传图片到这个URL协议
    public var uploadData:NSData?  //上传文件
    public var progress = 0.0 //上传进度
    public var totalBytesWritten = 0.0 //已上传数据大小
    public var totalBytesExpectedToWrite = 0.0  //全部需要上传的数据大小
    
    // download下载相关参数
    public var downloadUrl:URLStringConvertible = ""//下载图片URL
    public var targetPath = "" //下载到路径
    public var totalBytesRead = 0.0 //已下载传数据大小
    public var totalBytesExpectedToRead = 0.0 //全部需要下载的数据大小
    
    public var scheme = "http"  //协议
    public var host = ""           //域名
    public var path = ""       //请求路径
    public var staticPath = "" //其他路径
    public var method = Method.GET     //提交方式
    public var parameterEncoding = ParameterEncoding.URL //编码方式 Http头参数设置
    public var needCheckCode = true  //是否需要检查错误码
    
    public var acceptableContentTypes = ["application/json","text/plain"]  //可接受的序列化返回数据的格式
    public var requestBlock:(Void->())?
    public var isFirstRequest = false
    
    //HttpHeader timeoutInterval Cookies 等都在这里设置
    public var sessionConfiguration:NSURLSessionConfiguration?
    public var op:Request?
    
    public var requestNeedActive: Observable<Bool> {
        if let d: AnyObject = objc_getAssociatedObject(self, &enabledDynamicHandleRequest) {
            return (d as? Observable<Bool>)!
        } else {
            let d = Observable<Bool>(false)
            d.observe{ [weak self] v in if let s = self {
                if v {
                    d.value = false
                    s.requestBlock?()
                }
            }}
            objc_setAssociatedObject(self, &enabledDynamicHandleRequest, d, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            return d
        }
    }

    var useCache = false
    var dataFromCache = false

    
    public var requestKey :String {
        return self.nameOfClass
    }
    
    public class var requestKey:String {
        return self.nameOfClass
    }
    
    public var requestParams :Dictionary<String,AnyObject>{
        return self.listProperties()
    }
    
    public var appendPathInfo :String {
        var pathInfo = self.pathInfo
        if pathInfo != nil && !(pathInfo!).characters.isEmpty {
            for (key,nsValue) in self.requestParams {
                let par = "(\\{\(key)\\})"
                let str = "\(nsValue)"
                pathInfo = (try? NSRegularExpression(pattern: par, options: NSRegularExpressionOptions.CaseInsensitive))?.stringByReplacingMatchesInString(str, options: NSMatchingOptions.ReportCompletion, range: NSMakeRange(0, (pathInfo!).characters.count), withTemplate: str)
            }
        }
        if pathInfo == nil {
            pathInfo = ""
        }
        return pathInfo!
    }
    
    public var pathInfo :String?{
        return nil
    }
    
    //the key for cache
    public var cacheKey :String{
        if self.method == .GET {
            return self.url!.absoluteString.MD5
        }else if !isEmpty(self.requestParams) {
            return (self.url!.absoluteString + self.requestParams.joinPath).MD5
        }else{
            return self.url!.absoluteString.MD5
        }
    }
    
    public func suspend() {
        self.op?.suspend()
        self.state.value = .Suspend
    }
    
    public func resume() {
        self.op?.resume()
        self.state.value = .Sending
    }
    
    public func cancel() {
        self.op?.cancel()
        self.state.value = .Cancle
    }
    
    public var manager:Manager {
        get{
            if let reqManager = objc_getAssociatedObject(self, &managerHandle) as? Manager {
                return reqManager
            }else if let configuration = sessionConfiguration{
                let aManager = Alamofire.Manager(configuration: configuration)
                objc_setAssociatedObject(self, &managerHandle, aManager, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
                return aManager
            }else{
                return Alamofire.Manager.sharedInstance
            }
        }set(aManager){
            objc_setAssociatedObject(self, &managerHandle, aManager, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
}








================================================
FILE: Pod/Classes/Easy/Core/EZScene.swift
================================================
//
//  Scene.swift
//  medical
//
//  Created by zhuchao on 15/4/22.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
import SnapKit

public enum NAV : Int {
    case LEFT
    case RIGHT
}

public enum EXTEND : Int{
    case NONE
    case TOP
    case BOTTOM
    case TOP_BOTTOM
}

public enum INSET : Int{
    case NONE
    case TOP
    case BOTTOM
    case TOP_BOTTOM
}

public class EZScene: UIViewController {
    
    //parentScene 保留设计,必要的时候保存parentScene
    public weak var parentScene:EZScene?

    //导航条左右按钮设置 NAV是一个枚举值:.LEFT,.RIGHT
    public func showBarButton(position:NAV,title:String,fontColor:UIColor){
        self.showBarButton(position, button: UIButton(navTitle: title, color: fontColor))
    }
    
    public func showBarButton(position:NAV,imageName:String) -> Void{
        self.showBarButton(position, button: UIButton(navImage: UIImage(named: imageName)!))
    }
    
    public func showBarButton(position:NAV,button:UIButton?){
        if position == .LEFT {
            button?.addTarget(self, action: Selector("leftButtonTouch"), forControlEvents: UIControlEvents.TouchUpInside)
            self.navigationItem.leftBarButtonItem = nil
            self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: button!)
            self.navigationController?.interactivePopGestureRecognizer?.delegate = nil
        }else if position == .RIGHT {
            button?.addTarget(self, action: Selector("rightButtonTouch"), forControlEvents: UIControlEvents.TouchUpInside)
            self.navigationItem.rightBarButtonItem = nil
            self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: button!)
        }
    }
    
    public func leftButtonTouch(){
        self.navigationController?.popViewControllerAnimated(true)
    }
    
    public func rightButtonTouch(){
        
    }
    
    public func setTitleView(titleView:UIView){
        self.navigationItem.titleView = titleView
    }
    
    public func addSubView(view:UIView,extend:EXTEND){
        self.view.addSubview(view)
        self.view.sendSubviewToBack(view)
        
        self.automaticallyAdjustsScrollViewInsets = false
        self.extendedLayoutIncludesOpaqueBars = true
        self.edgesForExtendedLayout = UIRectEdge.All
        view.snp_makeConstraints { (make) -> Void in
            //TODO
//            make.edges.equalTo(view.superview!).inset(
//                EdgeInsetsMake((extend == EXTEND.TOP||extend == EXTEND.TOP_BOTTOM) ? 64:0, left:0,bottom:(extend == EXTEND.BOTTOM||extend == EXTEND.TOP_BOTTOM) ? 49:0, right: 0)
//            )
        }
    }

    public func addScrollView(view:UIScrollView,extend:EXTEND,inset:INSET){
        self.addSubView(view, extend: extend)
//        view.contentInset = UIEdgeInsetsMake((inset == INSET.TOP || inset == INSET.TOP_BOTTOM) ? 64:0, 0,
//            (inset == INSET.BOTTOM || inset == INSET.TOP_BOTTOM) ? 49:0, 0)
    }
    
    

}


================================================
FILE: Pod/Classes/Easy/Core/EZSceneModel.swift
================================================
//
//  SceneModel.swift
//  medical
//
//  Created by zhuchao on 15/4/26.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
import Bond

public class EZSceneModel: NSObject {

}


================================================
FILE: Pod/Classes/Easy/Core/EZTableView.swift
================================================
//
//  EZTableView.swift
//  medical
//
//  Created by zhuchao on 15/4/26.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit

public class EZTableView: UITableView {

    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func drawRect(rect: CGRect) {
        // Drawing code
    }
    */

}


================================================
FILE: Pod/Classes/Easy/Core/EZViewModel.swift
================================================
//
//  EZViewModel.swift
//  medical
//
//  Created by zhuchao on 15/5/11.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
import Bond

public class EZData:NSObject {
    public var dym:Observable<NSData>?
    
    public var value:NSData?{
        get{
            return self.dym?.value
        }set(value){
            self.dym?.value = value!
        }
    }
    
    public init(_ data:NSData) {
        self.dym = Observable<NSData>(data)
    }
}

public class EZString:NSObject {
    public var dym:Observable<String>?
    
    public var value:String?{
        get{
            return self.dym?.value
        }set(value){
            self.dym?.value = value!
        }
    }
    
    public init(_ str:String) {
        self.dym = Observable<String>(str)
    }
}

public class EZURL:NSObject {
    public var dym:Observable<NSURL?>?
    public var value:NSURL?{
        get{
            return self.dym?.value
        }set(value){
            self.dym?.value = value!
        }
    }
    public init(_ url:NSURL?) {
        self.dym = Observable<NSURL?>(url)
    }
}

public class EZAttributedString:NSObject {
    public var dym:Observable<NSAttributedString>?
    public var value:NSAttributedString?{
        get{
            return self.dym?.value
        }set(value){
            self.dym?.value = value!
        }
    }
    public init(_ str:NSAttributedString) {
        self.dym = Observable<NSAttributedString>(str)
    }
}

public class EZImage:NSObject {
    public var dym:Observable<UIImage?>?
    public var value:UIImage?{
        get{
            return self.dym?.value
        }set(value){
            self.dym?.value = value!
        }
    }
    public init(_ image:UIImage?) {
        self.dym = Observable<UIImage?>(image)
    }
}

public class EZColor:NSObject {
    public var dym:Observable<UIColor>?
    public var value:UIColor?{
        get{
            return self.dym?.value
        }set(value){
            self.dym?.value = value!
        }
    }
    public init(_ color:UIColor) {
        self.dym = Observable<UIColor>(color)
    }
}

public class EZBool:NSObject {
    public var dym:Observable<Bool>?
    public var value:Bool?{
        get{
            return self.dym?.value
        }set(value){
            self.dym?.value = value!
        }
    }
    public init(_ b:Bool) {
        self.dym = Observable<Bool>(b)
    }
}

public class EZFloat:NSObject {
    public var dym:Observable<CGFloat>?
    public var value:CGFloat?{
        get{
            return self.dym?.value
        }set(value){
            self.dym?.value = value!
        }
    }
    public init(_ fl:CGFloat) {
        self.dym = Observable<CGFloat>(fl)
    }
}

public class EZInt:NSObject {
    public var dym:Observable<Int>?
    public var value:Int?{
        get{
            return self.dym?.value
        }set(value){
            self.dym?.value = value!
        }
    }
    public init(_ i:Int) {
        self.dym = Observable<Int>(i)
    }
}

public class EZNumber:NSObject {
    public var dym:Observable<NSNumber>?
    public var value:NSNumber?{
        get{
            return self.dym?.value
        }set(value){
            self.dym?.value = value!
        }
    }
    public init(_ i:NSNumber) {
        self.dym = Observable<NSNumber>(i)
    }
}

extension NSObject{
    public var model_properyies :Dictionary<String,AnyObject>{
        return self.listProperties()
    }
    
    public func model_hasKey(key:String) -> Bool{
        return self.model_properyies.keys.contains(key)
    }
}

public class EZViewModel:NSObject {

}

================================================
FILE: Pod/Classes/Easy/Lib/EZCoreDataManager.swift
================================================
//
//  EZCoreDataManager.swift
//  medical
//
//  Created by zhuchao on 15/5/31.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import Foundation
import CoreData

private var managedObjectContextHandle:UInt8 = 0
private var persistentStoreCoordinatorHandle:UInt8 = 1
private var databaseNameHandle:UInt8 = 2
private var modelNameHandle:UInt8 = 3
private var managedObjectModelHandle:UInt8 = 4

public class EZCoreDataManager {
    
    private static let appName = NSBundle.mainBundle().infoDictionary!["CFBundleName"] as! String
    
    public var databaseName: String {
        get {
            if let db = objc_getAssociatedObject(self, &databaseNameHandle) as? String {
                return db
            } else {
                return EZCoreDataManager.appName + ".sqlite"
            }
        }
        set(value){
            objc_setAssociatedObject(self, &databaseNameHandle, value, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            objc_setAssociatedObject(self, &managedObjectContextHandle, nil, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            objc_setAssociatedObject(self, &persistentStoreCoordinatorHandle, nil, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    
    public var modelName: String {
        get {
            if let model = objc_getAssociatedObject(self, &modelNameHandle) as? String {
                return model
            } else {
                return EZCoreDataManager.appName
            }
        }
        set(value) {
            objc_setAssociatedObject(self, &modelNameHandle, value, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            objc_setAssociatedObject(self, &managedObjectContextHandle, nil, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            objc_setAssociatedObject(self, &persistentStoreCoordinatorHandle, nil, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    
    public var managedObjectContext: NSManagedObjectContext {
        get {
            if let context = objc_getAssociatedObject(self, &managedObjectContextHandle) as? NSManagedObjectContext  {
                return context
            } else {
                let c = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
                c.persistentStoreCoordinator = persistentStoreCoordinator
                objc_setAssociatedObject(self, &managedObjectContextHandle, c, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
                return c
            }
        }
        set (value){
            objc_setAssociatedObject(self, &managedObjectContextHandle, value, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    
    public var persistentStoreCoordinator: NSPersistentStoreCoordinator {
        get {
            if let store = objc_getAssociatedObject(self, &persistentStoreCoordinatorHandle) as? NSPersistentStoreCoordinator  {
                return store
            } else {
                let p = self.persistentStoreCoordinator(NSSQLiteStoreType, storeURL: self.sqliteStoreURL)
                objc_setAssociatedObject(self, &persistentStoreCoordinatorHandle, p, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
                return p
            }
        }set(value){
            objc_setAssociatedObject(self, &persistentStoreCoordinatorHandle, value, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }

    public var managedObjectModel: NSManagedObjectModel {
        if let m = objc_getAssociatedObject(self, &managedObjectModelHandle) as? NSManagedObjectModel {
            return m
        } else {
            let modelURL = NSBundle.mainBundle().URLForResource(self.modelName, withExtension: "momd")
            let model = NSManagedObjectModel(contentsOfURL: modelURL!)
            objc_setAssociatedObject(self, &managedObjectModelHandle, model, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            return model!
        }
    }
    
    public func useInMemoryStore() {
        persistentStoreCoordinator = self.persistentStoreCoordinator(NSInMemoryStoreType, storeURL: nil)
    }
    
    public func saveContext() -> Bool {
        return self.managedObjectContext.saveData()
    }
    
    private var sqliteStoreURL: NSURL {
        #if os(iOS)
            let dir = EZCoreDataManager.applicationDocumentsDirectory
            #else
            let dir = EZCoreDataManager.applicationSupportDirectory
            self.createApplicationSupportDirIfNeeded(dir)
        #endif
        return dir!.URLByAppendingPathComponent(self.databaseName)
        
    }
    
    private func persistentStoreCoordinator(storeType: String, storeURL: NSURL?) -> NSPersistentStoreCoordinator {
        let c = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
        let error = NSErrorPointer()
        do {
            try c.addPersistentStoreWithType(storeType, configuration: nil, URL: storeURL, options: [NSMigratePersistentStoresAutomaticallyOption:true,NSInferMappingModelAutomaticallyOption:true])
        } catch let error1 as NSError {
            error.memory = error1
            print("ERROR WHILE CREATING PERSISTENT STORE COORDINATOR! " + error.debugDescription)
        }
        return c
    }
    
    private static var applicationDocumentsDirectory:NSURL? {
        return NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask).last
    }
    
    private static var applicationSupportDirectory:NSURL? {
        return NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.ApplicationSupportDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask).last?.URLByAppendingPathComponent(EZCoreDataManager.appName)
    }
    
    private static func createApplicationSupportDirIfNeeded(dir: NSURL) {
        if NSFileManager.defaultManager().fileExistsAtPath(dir.absoluteString) {
            return
        }
        do {
            try NSFileManager.defaultManager().createDirectoryAtURL(dir, withIntermediateDirectories: true, attributes: nil)
        } catch _ {
        }
    }
    // singleton
    public static let sharedManager = EZCoreDataManager()
}


public extension NSManagedObjectContext {
    
    public static var defaultContext: NSManagedObjectContext {
        return EZCoreDataManager.sharedManager.managedObjectContext
    }
    
    func createFetchRequest(entityName:String) -> NSFetchRequest {
        let request = NSFetchRequest()
        request.entity = NSEntityDescription.entityForName(entityName, inManagedObjectContext: self)
        return request
    }
    
    func saveData() -> Bool {
        if !self.hasChanges {
            return true
        }
        let error = NSErrorPointer()
        let save: Bool
        do {
            try self.save()
            save = true
        } catch let error1 as NSError {
            error.memory = error1
            save = false
        }
        
        if (!save) {
            print("Unresolved error in saving context for entity:")
            print(self)
            print("!\nError: " + error.debugDescription)
            return false
        }
        return true
    }
}


public extension NSPredicate{
    
    public func condition(condition: AnyObject?) -> NSPredicate?{
        if let cond: AnyObject = condition {
            return NSCompoundPredicate(type: NSCompoundPredicateType.AndPredicateType, subpredicates:[self, NSPredicate.predicate(cond)])
        }
        return self
    }
    
    public func orCondition(condition: AnyObject?) -> NSPredicate?{
        if let cond: AnyObject = condition {
            return NSCompoundPredicate(type: NSCompoundPredicateType.OrPredicateType, subpredicates:[self, NSPredicate.predicate(cond)])
        }
        return self
    }
    
    private static func predicate(properties: [String:AnyObject]) -> NSPredicate {
        var preds = [NSPredicate]()
        for (key, value) in properties {
            preds.append(NSPredicate(format: "%K = %@", argumentArray: [key, value]))
        }
        return NSCompoundPredicate(type: NSCompoundPredicateType.AndPredicateType, subpredicates: preds)
    }
    
    private static func predicate(condition: AnyObject) -> NSPredicate {
        if condition is NSPredicate {
            return condition as! NSPredicate
        }
        if let d = condition as? [String:AnyObject] {
            return self.predicate(d)
        }
        return NSPredicate()
    }
}

public extension NSFetchRequest{
    
    public func condition(condition: AnyObject?) -> NSFetchRequest{
         if let cond: AnyObject = condition {
            if let pred = self.predicate {
                self.predicate = pred.condition(cond)
            }else{
                self.predicate = NSPredicate.predicate(cond)
            }
        }
        return self
    }
    
    public func orCondition(condition: AnyObject?) -> NSFetchRequest{
        if let cond: AnyObject = condition,let pred = self.predicate  {
            self.predicate = pred.orCondition(cond)
        }
        return self
    }
    
    public func orderBy(key:String,_ order:String = "ASC") -> NSFetchRequest{
        let sortDescriptor = NSSortDescriptor(key: key, ascending: order.uppercaseString=="ASC")
        if self.sortDescriptors == nil{
            self.sortDescriptors = [sortDescriptor]
        }else{
            self.sortDescriptors?.append(sortDescriptor)
        }
        return self
    }
    
    /**
    * Set the "limit" value of the query.
    *
    * @param int value
    * @return self
    * @static
    */
    public func limit(value:Int) -> NSFetchRequest{
        self.fetchLimit = value
        self.fetchOffset = 0
        return self
    }
    
    /**
    * Alias to set the "limit" value of the query.
    *
    * @param int value
    * @return NSFetchRequest
    */
    public func take(value:Int) -> NSFetchRequest{
        return self.limit(value)
    }
    
    /**
    * Set the limit and offset for a given page.
    *
    * @param int page
    * @param int perPage
    * @return NSFetchRequest
    */
    public func forPage(page:Int,_ perPage:Int) -> NSFetchRequest{
        self.fetchLimit = perPage
        self.fetchOffset = (page - 1) * perPage
        return self
    }
    
    public func first() -> NSManagedObject?{
        return self.take(1).get().first
    }
    
    public func delete() -> NSInteger{
        var i = 0
        for o in self.get() {
            o.delete()
            i++
        }
        return i
    }
    
    public func get() -> [NSManagedObject]{
        return (try! NSManagedObjectContext.defaultContext.executeFetchRequest(self)) as! [NSManagedObject] 
    }
    
    public func count() -> Int {
        return NSManagedObjectContext.defaultContext.countForFetchRequest(self, error: nil)
    }
    
    public func exists() -> Bool {
        return self.count() > 0
    }
    
}




================================================
FILE: Pod/Classes/Easy/Lib/EZExtend+Array.swift
================================================
//
//  EZExtend+Array.swift
//  medical
//
//  Created by zhuchao on 15/5/1.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import Foundation

extension Array {
    
    func stringAtIndex(index:Int,other:String) -> String{
        if self.count >= index + 1 {
            return (self[index] as! String).trim
        }else{
            return other
        }
    }
    
    func floatAtIndex(index:Int,other:CGFloat) -> CGFloat{
        if self.count >= index + 1 {
            return (self[index] as! String).trim.floatValue
        }else{
            return other
        }
    }
}

================================================
FILE: Pod/Classes/Easy/Lib/EZExtend+Bond.swift
================================================
//
//  EZBond.swift
//  medical
//
//  Created by zhuchao on 15/4/27.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import Bond
import TTTAttributedLabel

@objc class TapGestureDynamicHelper:NSObject
{
    weak var view: UIView?
    let sink:  (UITapGestureRecognizer) -> Void
    init(view: UIView,number:NSInteger,sink:((UITapGestureRecognizer) -> Void)) {
        self.view = view
        self.sink = sink
        super.init()
        view.addTapGesture(number, target: self, action: Selector("tapHandle:"))
    }

    
    func tapHandle(gesture: UITapGestureRecognizer) {
        sink(gesture)
    }
}

@objc class PanGestureDynamicHelper:NSObject{
    weak var view: UIView?
    let sink:  (UIPanGestureRecognizer) -> Void
    init(view: UIView,number:NSInteger,sink:((UIPanGestureRecognizer) -> Void)) {
        self.view = view
        self.sink = sink
        super.init()
        view.addPanGesture(self, action: Selector("panHandle:"))
    }
    func panHandle(gestureRecognizer:UIPanGestureRecognizer) {
        sink(gestureRecognizer)
    }
}

@objc class SwipeGestureDynamicHelper:NSObject
{
    weak var view: UIView?
    let sink:  ((UISwipeGestureRecognizer) -> Void)
    var number:NSInteger = 1
    init(view: UIView,number:NSInteger,sink:((UISwipeGestureRecognizer) -> Void)) {
        self.view = view
        self.number = number
        self.sink = sink
        super.init()
        view.addSwipeGesture(UISwipeGestureRecognizerDirection.Right, numberOfTouches: number, target: self, action: Selector("swipeRightHandle:"))
        view.addSwipeGesture(UISwipeGestureRecognizerDirection.Up, numberOfTouches: number, target: self, action: Selector("swipeUpHandle:"))
        view.addSwipeGesture(UISwipeGestureRecognizerDirection.Down, numberOfTouches: number, target: self, action: Selector("swipeDownHandle:"))
        view.addSwipeGesture(UISwipeGestureRecognizerDirection.Left, numberOfTouches: number, target: self, action: Selector("swipeLeftHandle:"))
    }
    
    func swipeRightHandle(gestureRecognizer:UISwipeGestureRecognizer) {
        sink(gestureRecognizer)
    }
    func swipeUpHandle(gestureRecognizer:UISwipeGestureRecognizer) {
        sink(gestureRecognizer)
    }
    func swipeDownHandle(gestureRecognizer:UISwipeGestureRecognizer) {
        sink(gestureRecognizer)
    }
    func swipeLeftHandle(gestureRecognizer:UISwipeGestureRecognizer) {
        sink(gestureRecognizer)
    }
}

extension UIView{
    private struct AssociatedKeys {
        static var PanGestureEventKey = "bnd_PanGestureEventKey"
        static var PanGestureEventHelperKey = "bnd_PanGestureEventHelperKey"
        static var SwipeGestureEventKey = "bnd_SwipeGestureEventKey"
        static var SwipeGestureEventHelperKey = "bnd_SwipeGestureEventHelperKey"
        static var TapGestureEventKey = "bnd_TapGestureEventKey"
        static var TapGestureEventHelperKey = "bnd_TapGestureEventHelperKey"
        
    }
    
    public func bnd_swipeGestureEvent(number:NSInteger) ->EventProducer<UISwipeGestureRecognizer> {
        if let bnd_swipeGestureEvent: AnyObject = objc_getAssociatedObject(self, &AssociatedKeys.SwipeGestureEventKey) {
            return bnd_swipeGestureEvent as! EventProducer<UISwipeGestureRecognizer>
        } else {
            var capturedSink: (UISwipeGestureRecognizer -> ())! = nil
            let bnd_swipeGestureEvent = EventProducer<UISwipeGestureRecognizer> { sink in
                capturedSink = sink
                return nil
            }
            let controlHelper =  SwipeGestureDynamicHelper(view: self, number: number, sink: capturedSink)
            objc_setAssociatedObject(self, &AssociatedKeys.SwipeGestureEventHelperKey, controlHelper, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            objc_setAssociatedObject(self, &AssociatedKeys.SwipeGestureEventKey, bnd_swipeGestureEvent, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            return bnd_swipeGestureEvent
        }
    }
    
    public func bnd_tapGestureEvent(number:NSInteger) ->EventProducer<UITapGestureRecognizer> {
        if let bnd_tapGestureEvent: AnyObject = objc_getAssociatedObject(self, &AssociatedKeys.TapGestureEventKey) {
            return bnd_tapGestureEvent as! EventProducer<UITapGestureRecognizer>
        } else {
            var capturedSink: (UITapGestureRecognizer -> ())! = nil
            let bnd_tapGestureEvent = EventProducer<UITapGestureRecognizer> { sink in
                capturedSink = sink
                return nil
            }
            let controlHelper =  TapGestureDynamicHelper(view: self, number: number, sink: capturedSink)
            objc_setAssociatedObject(self, &AssociatedKeys.TapGestureEventHelperKey, controlHelper, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            objc_setAssociatedObject(self, &AssociatedKeys.TapGestureEventKey, bnd_tapGestureEvent, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            return bnd_tapGestureEvent
        }
    }
    
    public var bnd_panGestureEvent:EventProducer<UIPanGestureRecognizer> {
        if let bnd_panGestureEvent: AnyObject = objc_getAssociatedObject(self, &AssociatedKeys.PanGestureEventKey) {
            return bnd_panGestureEvent as! EventProducer<UIPanGestureRecognizer>
        } else {
            var capturedSink: (UIPanGestureRecognizer -> ())! = nil
            let bnd_panGestureEvent = EventProducer<UIPanGestureRecognizer> { sink in
                capturedSink = sink
                return nil
            }
            let controlHelper =  PanGestureDynamicHelper(view: self, number: 1, sink: capturedSink)
            objc_setAssociatedObject(self, &AssociatedKeys.PanGestureEventHelperKey, controlHelper, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            objc_setAssociatedObject(self, &AssociatedKeys.PanGestureEventKey, bnd_panGestureEvent, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            return bnd_panGestureEvent
        }
    }
}



extension UIImageView {
    private struct AssociatedKeys {
        static var UrlImageDynamicHandleUIImageView = "UrlImageDynamicHandleUIImageView"
    }
    public var bnd_URLImage: Observable<NSURL?> {
        if let d: AnyObject = objc_getAssociatedObject(self, &AssociatedKeys.UrlImageDynamicHandleUIImageView) {
            return (d as? Observable<NSURL?>)!
        } else {
            let d = Observable<NSURL?>(NSURL())
            d.observe { [weak self] v in if let s = self {
                if v != nil {
                    s.kf_setImageWithURL(v!)
                }
            } }
            objc_setAssociatedObject(self, &AssociatedKeys.UrlImageDynamicHandleUIImageView, d, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            return d
        }
    }
}

extension TTTAttributedLabel {
    private struct AssociatedKeys {
        static var textDynamicHandleTTTAttributeLabel = "textDynamicHandleTTTAttributeLabel"
        static var attributedTextDynamicHandleTTTAttributeLabel = "attributedTextDynamicHandleTTTAttributeLabel"
        static var dataDynamicHandleTTTAttributeLabel = "dataDynamicHandleTTTAttributeLabel"
    }
    
     public var dynTTText: Observable<String> {
        if let d: AnyObject = objc_getAssociatedObject(self, &AssociatedKeys.textDynamicHandleTTTAttributeLabel) {
            return (d as? Observable<String>)!
        } else {
            let d = Observable<String>(self.text ?? "")
            d.observe { [weak self] v in if let s = self {
                s.setText(v)
            } }
            objc_setAssociatedObject(self, &AssociatedKeys.textDynamicHandleTTTAttributeLabel, d, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            return d
        }
    }
    
    public var dynTTTData: Observable<NSData> {
        if let d: AnyObject = objc_getAssociatedObject(self, &AssociatedKeys.dataDynamicHandleTTTAttributeLabel) {
            return (d as? Observable<NSData>)!
        } else {
            let d = Observable<NSData>(NSData())
            d.observe{ [weak self] v in if let s = self {
                s.setText(NSAttributedString(fromHTMLData: v, attributes: ["dict":s.tagProperty.style]))
            }}
            objc_setAssociatedObject(self, &AssociatedKeys.dataDynamicHandleTTTAttributeLabel, d, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            return d
        }
    }
    
    public var dynTTTAttributedText: Observable<NSAttributedString> {
        if let d: AnyObject = objc_getAssociatedObject(self, &AssociatedKeys.attributedTextDynamicHandleTTTAttributeLabel) {
            return (d as? Observable<NSAttributedString>)!
        } else {
            let d = Observable<NSAttributedString>(self.attributedText ?? NSAttributedString(string: ""))
            d.observe { [weak self] v in if let s = self {
                s.setText(v) } }
            objc_setAssociatedObject(self, &AssociatedKeys.attributedTextDynamicHandleTTTAttributeLabel, d, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            return d
        }
    }

}


================================================
FILE: Pod/Classes/Easy/Lib/EZExtend+Dictionary.swift
================================================
//
//  Dictionary+EZExtend.swift
//  medical
//
//  Created by zhuchao on 15/4/25.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import Foundation

extension Dictionary {
    
    //join the Dictionary with "&" to a url path
    var joinPath : String{
        var array = ArraySlice<String>()
        for (key,value) in self {
           array.append("\(key)=\(value)")
        }
        return array.joinWithSeparator("&")
    }
}

================================================
FILE: Pod/Classes/Easy/Lib/EZExtend+NSDate.swift
================================================
//
//  EZExtend+NSDate.swift
//  medical
//
//  Created by zhuchao on 15/5/9.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import Foundation

extension NSDate {
    //format :yyyy-MM-dd
    public func formatTo(format:String) -> String{
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = format
        let currentDateStr = dateFormatter.stringFromDate(self)
        return currentDateStr
    }
}


================================================
FILE: Pod/Classes/Easy/Lib/EZExtend+String.swift
================================================
//
//  EZExtend+String.swift
//  medical
//
//  Created by zhuchao on 15/4/28.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import Foundation
// MARK: - String

public func trimToArray (str:String) -> Array<String>{
    return str.trim.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).filter(){
        return !$0.characters.isEmpty
    }
}

public func trimToArrayBy (str:String,by:String) -> Array<String>{
    return str.trim.componentsSeparatedByString(by).filter(){
        return !$0.characters.isEmpty
    }
}



extension String {
    public subscript (i: Int) -> String {
        return String(Array(self.characters)[i])
    }
    
    public var urlencode :String? {
        return self.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.letterCharacterSet())
    }
    
    public var urldecode :String? {
        return self.stringByRemovingPercentEncoding;
    }
    
    public var trim :String {
        return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
    }
    
    public var trimArray : Array<String>{
        return trimToArray(self)
    }
    
    public func trimArrayBy (str:String) -> Array<String> {
        return trimToArrayBy(self,by: str)
    }
    
    public var toKeyPath :String {
        let keyArray = self.trim.componentsSeparatedByString("-")
        var str = ""
        var index = 0
        for akey in keyArray {
            if index == 0 {
                str += akey
            }else{
                str += akey.capitalizedString
            }
            index++
        }
        if let reg = Regex("_").replace(str, withTemplate: ".") {
            str = reg
        }
        return str
    }
    
    public var floatValue: CGFloat {
        return CGFloat((self as NSString).floatValue)
    }
    
    public var integerValue: Int {
        return (self as NSString).integerValue
    }
    
    public var boolValue: Bool {
        return (self as NSString).boolValue
    }
    
    
    public func anyValue(key:String) -> AnyObject{
        if key == "font" {
            if let font = UIFont.Font(self.trim) {
                return font
            }
        }
        return self.anyValue
    }
    
    public var anyValue :AnyObject{
        let str = self.trim
        
        if str.hasSuffix(".cg"){
            if let color = UIColor(CSS: Regex(".cg").replace(str, withTemplate: "")){
                return color.CGColor
            }
        }
        
        if ["YES","NO","TRUE","FALSE"].contains(str.uppercaseString) {
            return str.boolValue
        }else if let color = UIColor(CSS: str){
            return color
        }else if let image = UIImage(named: str){
            return image
        }else if str.floatValue != 0.0 {
            return str.floatValue
        }else{
            return str
        }
    }
    
    public var MD5 : String {
        let data = self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
        return data!.MD5String
    }
    
    public func toData () -> NSData?{
        return self.dataUsingEncoding(NSUTF8StringEncoding)?.dataByReplacingOccurrencesOfData("\\n".dataUsingEncoding(NSUTF8StringEncoding), withData: "\n".dataUsingEncoding(NSUTF8StringEncoding))
    }
    
    public var chineseFirstLetter : String{
        return HTFirstLetter.firstLetter(self)
    }
    
    public var chineseFirstLetters : String {
        return HTFirstLetter.firstLetters(self)
    }
}


================================================
FILE: Pod/Classes/Easy/Lib/EZExtend+UIAlertController.swift
================================================
//
//  EZExtend+UIAlertController.swift
//  medical
//
//  Created by zhuchao on 15/4/28.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit

// MARK: - UIAlertController

public func alert (title: String,
    message: String,
    cancelAction: ((UIAlertAction!)->Void)? = nil,
    okAction: ((UIAlertAction!)->Void)? = nil) -> UIAlertController {
        let a = UIAlertController (title: title, message: message, preferredStyle: .Alert)
        
        if let ok = okAction {
            a.addAction(UIAlertAction(title: "OK", style: .Default, handler: ok))
            a.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: cancelAction))
        } else {
            a.addAction(UIAlertAction(title: "OK", style: .Cancel, handler: cancelAction))
        }
        
        return a
}

================================================
FILE: Pod/Classes/Easy/Lib/EZExtend+UIButton.swift
================================================
//
//  UIButton+EZExtend.swift
//  medical
//
//  Created by zhuchao on 15/4/22.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit


let NAV_BAR_HEIGHT = CGFloat(40.0)
let NAV_BUTTON_MIN_WIDTH = CGFloat(40.0)
let NAV_BUTTON_MIN_HEIGHT = CGFloat(40.0)

extension UIButton{
    public convenience init(navImage: UIImage){
        var buttonFrame = CGRectMake(CGFloat(0.0), CGFloat(0.0), navImage.size.width, NAV_BAR_HEIGHT)
        if  buttonFrame.size.width < NAV_BUTTON_MIN_WIDTH
        {
            buttonFrame.size.width = NAV_BUTTON_MIN_WIDTH
        }
        if buttonFrame.size.height < NAV_BUTTON_MIN_HEIGHT
        {
            buttonFrame.size.height = NAV_BUTTON_MIN_HEIGHT
        }
        self.init(frame:buttonFrame)
        self.contentMode = UIViewContentMode.ScaleAspectFill
        self.backgroundColor = UIColor.clearColor()
        self.setImage(navImage, forState: UIControlState.Normal)
    }
    
    public convenience init(navTitle: String,color: UIColor){
        let titleSize = navTitle.boundingRectWithSize(CGSizeMake(999999.0, NAV_BAR_HEIGHT), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: Dictionary(dictionaryLiteral: (NSFontAttributeName,UIFont.systemFontOfSize(16.0))), context: nil).size
        var buttonFrame = CGRectMake(CGFloat(0.0), CGFloat(0.0), titleSize.width, NAV_BAR_HEIGHT)
        if  buttonFrame.size.width < NAV_BUTTON_MIN_WIDTH
        {
            buttonFrame.size.width = NAV_BUTTON_MIN_WIDTH
        }
        if buttonFrame.size.height < NAV_BUTTON_MIN_HEIGHT
        {
            buttonFrame.size.height = NAV_BUTTON_MIN_HEIGHT
        }
        self.init(frame: buttonFrame)
        self.contentMode = UIViewContentMode.ScaleAspectFill
        self.backgroundColor = UIColor.clearColor()
        self.titleLabel?.font = UIFont.systemFontOfSize(16.0)
        self.setTitleColor(color, forState: UIControlState.Normal)
        self.setTitle(navTitle, forState: UIControlState.Normal)
    }
    
    public func setBackgroundImageWithColor(color: UIColor?, forState state: UIControlState){
        if let c = color {
            let image = UIImage.imageWithColor(c, size: CGSizeMake(1, 1))
            self.setBackgroundImage(image, forState: state)
        }
    }
}


================================================
FILE: Pod/Classes/Easy/Lib/EZExtend+UIFont.swift
================================================
//
//  EZExtend+UIFont.swift
//  medical
//
//  Created by zhuchao on 15/4/28.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
// MARK: - UIFont

extension UIFont {
    
    public enum FontType: String {
        case Regular = "Regular"
        case Bold = "Bold"
        case Light = "Light"
        case UltraLight = "UltraLight"
        case Italic = "Italic"
        case Thin = "Thin"
        case Book = "Book"
        case Roman = "Roman"
        case Medium = "Medium"
        case MediumItalic = "MediumItalic"
        case CondensedMedium = "CondensedMedium"
        case CondensedExtraBold = "CondensedExtraBold"
        case SemiBold = "SemiBold"
        case BoldItalic = "BoldItalic"
        case Heavy = "Heavy"
    }
    
    public enum FontName: String {
        case HelveticaNeue = "HelveticaNeue"
        case Helvetica = "Helvetica"
        case Futura = "Futura"
        case Menlo = "Menlo"
        case Avenir = "Avenir"
        case AvenirNext = "AvenirNext"
        case Didot = "Didot"
        case AmericanTypewriter = "AmericanTypewriter"
        case Baskerville = "Baskerville"
        case Geneva = "Geneva"
        case GillSans = "GillSans"
        case SanFranciscoDisplay = "SanFranciscoDisplay"
        case Seravek = "Seravek"
    }
    
    public class func PrintFontFamily (font: FontName) {
        let arr = UIFont.fontNamesForFamilyName(font.rawValue)
        for name in arr {
            print(name)
        }
    }
    
    public class func Font (str:String) -> UIFont?  {
        var array = str.trimArray
        if array.count >= 2{
            let font = array[1] as String
            if font == "system" {
                return UIFont.systemFontOfSize(array[0].floatValue)
            }else{
                return UIFont(name: array[1], size: array[0].floatValue)
            }
        }else if array.count == 1{
            return UIFont.systemFontOfSize(array[0].floatValue)
        }
        return nil
    }
    
    public class func Font (name: FontName, type: FontType, size: CGFloat) -> UIFont {
        return UIFont (name: name.rawValue + "-" + type.rawValue, size: size)!
    }
    
    public class func HelveticaNeue (type: FontType, size: CGFloat) -> UIFont {
        return Font(.HelveticaNeue, type: type, size: size)
    }
}


================================================
FILE: Pod/Classes/Easy/Lib/EZExtend+UIImage.swift
================================================
//
//  EZExtend+UIImage.swift
//  medical
//
//  Created by zhuchao on 15/4/28.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
// MARK: - UIImage

extension UIImage {
    public class func imageWithColor(color:UIColor,size:CGSize) -> UIImage {
        let rect = CGRectMake(0, 0, size.width, size.height)
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        color.setFill()
        UIRectFill(rect)
        let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
    
    public func aspectResizeWithWidth (width: CGFloat) -> UIImage {
        let aspectSize = CGSize (width: width, height: aspectHeightForWidth(width))
        
        UIGraphicsBeginImageContext(aspectSize)
        self.drawInRect(CGRect(origin: CGPointZero, size: aspectSize))
        let img = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        
        return img
    }
    
    public func aspectResizeWithHeight (height: CGFloat) -> UIImage {
        let aspectSize = CGSize (width: aspectWidthForHeight(height), height: height)
        
        UIGraphicsBeginImageContext(aspectSize)
        self.drawInRect(CGRect(origin: CGPointZero, size: aspectSize))
        let img = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        
        return img
    }
    
    public func aspectHeightForWidth (width: CGFloat) -> CGFloat {
        return (width * self.size.height) / self.size.width
    }
    
    public func aspectWidthForHeight (height: CGFloat) -> CGFloat {
        return (height * self.size.width) / self.size.height
    }
    
}


================================================
FILE: Pod/Classes/Easy/Lib/EZExtend+UILabel.swift
================================================
//
//  EZExtend+UILabel.swift
//  medical
//
//  Created by zhuchao on 15/4/28.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
// MARK: - UILabel

private var UILabelAttributedStringArray: UInt8 = 0
extension UILabel {
    
    public var attributedStrings: [NSAttributedString]? {
        get {
            return objc_getAssociatedObject(self, &UILabelAttributedStringArray) as? [NSAttributedString]
        } set (value) {
            objc_setAssociatedObject(self, &UILabelAttributedStringArray, value, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    
    public  func addAttributedString (text: String,
        color: UIColor,
        font: UIFont) {
            let att = NSAttributedString (string: text,
                attributes: [NSFontAttributeName: font,
                    NSForegroundColorAttributeName: color])
            self.addAttributedString(att)
    }
    
    public func addAttributedString (attributedString: NSAttributedString) {
        var att: NSMutableAttributedString?
        
        if let a = self.attributedText {
            att = NSMutableAttributedString (attributedString: a)
            att?.appendAttributedString(attributedString)
        } else {
            att = NSMutableAttributedString (attributedString: attributedString)
            attributedStrings = []
        }
        
        attributedStrings?.append(attributedString)
        self.attributedText = NSAttributedString (attributedString: att!)
    }
    
    
    public func updateAttributedStringAtIndex (index: Int,
        attributedString: NSAttributedString) {
            
            if (attributedStrings?[index] != nil) {
                attributedStrings?.removeAtIndex(index)
                attributedStrings?.insert(attributedString, atIndex: index)
                
                let updated = NSMutableAttributedString ()
                for att in attributedStrings! {
                    updated.appendAttributedString(att)
                }
                
                self.attributedText = NSAttributedString (attributedString: updated)
            }
    }
    
    public func updateAttributedStringAtIndex (index: Int,
        newText: String) {
            if let att = attributedStrings?[index] {
                let newAtt = NSMutableAttributedString (string: newText)
                
                att.enumerateAttributesInRange(NSMakeRange(0, att.string.characters.count-1),
                    options: NSAttributedStringEnumerationOptions.LongestEffectiveRangeNotRequired,
                    usingBlock: { (attribute, range, stop) -> Void in
                        for (key, value) in attribute {
                            newAtt.addAttribute(key , value: value, range: range)
                        }
                })
                
                updateAttributedStringAtIndex(index, attributedString: newAtt)
            }
    }
    
    
    public func getEstimatedHeight () -> CGFloat {
        let att = NSAttributedString(string: self.text!, attributes: [NSFontAttributeName:font])
        let rect = att.boundingRectWithSize(CGSize (width: w, height: CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, context: nil)
        return rect.height
    }
    
    public func fitHeight () {
        self.h = getEstimatedHeight()
    }
}


================================================
FILE: Pod/Classes/Easy/Lib/EZExtend+UIView.swift
================================================
//
//  EZExtend+UIView.swift
//  medical
//
//  Created by zhuchao on 15/4/28.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
import Bond
// MARK: - UIView

let UIViewAnimationDuration: NSTimeInterval = 1
let UIViewAnimationSpringDamping: CGFloat = 0.5
let UIViewAnimationSpringVelocity: CGFloat = 0.5
var UIViewGestureUniqueArray:CGFloat = 0.6
extension UIView {
    
//    public var gestureUniqueArray: [String:DisposableType] {
//        get {
//            if let viewGestureUniqueArray: AnyObject = objc_getAssociatedObject(self, &UIViewGestureUniqueArray) {
//                return viewGestureUniqueArray as! Dictionary
//            } else {
//                let mapData = [String:DisposableType]()
//                objc_setAssociatedObject(self, &UIViewGestureUniqueArray, mapData, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
//                return mapData
//            }
//        }set(value){
////            if let viewGestureUniqueArray: AnyObject = objc_getAssociatedObject(self, &UIViewGestureUniqueArray) {
////                
////            } else {
////                let mapData = [String:DisposableType]()
////                mapData[]
////            }
//        
//        }
//       
//    }
    
    // MARK: Custom Initilizer
    
    convenience init (x: CGFloat,
        y: CGFloat,
        w: CGFloat,
        h: CGFloat) {
            self.init (frame: CGRect (x: x, y: y, width: w, height: h))
    }
    
    // MARK: Frame Extensions
    
    public var x: CGFloat {
        get {
            return self.frame.origin.x
        } set (value) {
            self.frame = CGRect (x: value, y: self.y, width: self.w, height: self.h)
        }
    }
    
    public var y: CGFloat {
        get {
            return self.frame.origin.y
        } set (value) {
            self.frame = CGRect (x: self.x, y: value, width: self.w, height: self.h)
        }
    }
    
    public var w: CGFloat {
        get {
            return self.frame.size.width
        } set (value) {
            self.frame = CGRect (x: self.x, y: self.y, width: value, height: self.h)
        }
    }
    
    public var h: CGFloat {
        get {
            return self.frame.size.height
        } set (value) {
            self.frame = CGRect (x: self.x, y: self.y, width: self.w, height: value)
        }
    }
    
    
    public var left: CGFloat {
        get {
            return self.x
        } set (value) {
            self.x = value
        }
    }
    
     var right: CGFloat {
        get {
            return self.x + self.w
        } set (value) {
            self.x = value - self.w
        }
    }
    
    public var top: CGFloat {
        get {
            return self.y
        } set (value) {
            self.y = value
        }
    }
    
    public var bottom: CGFloat {
        get {
            return self.y + self.h
        } set (value) {
            self.y = value - self.h
        }
    }
    
    
    public var position: CGPoint {
        get {
            return self.frame.origin
        } set (value) {
            self.frame = CGRect (origin: value, size: self.frame.size)
        }
    }
    
    public var size: CGSize {
        get {
            return self.frame.size
        } set (value) {
            self.frame = CGRect (origin: self.frame.origin, size: size)
        }
    }
    
    
    public func leftWithOffset (offset: CGFloat) -> CGFloat {
        return self.left - offset
    }
    
    public func rightWithOffset (offset: CGFloat) -> CGFloat {
        return self.right + offset
    }
    
    public func topWithOffset (offset: CGFloat) -> CGFloat {
        return self.top - offset
    }
    
    public func botttomWithOffset (offset: CGFloat) -> CGFloat {
        return self.bottom + offset
    }
    
    
    
    // MARK: Transform Extensions
    
    public func setRotationX (x: CGFloat) {
        var transform = CATransform3DIdentity
        transform.m34 = 1.0 / -1000.0
        transform = CATransform3DRotate(transform, degreesToRadians(x), 1.0, 0.0, 0.0)
        
        self.layer.transform = transform
    }
    
    public func setRotationY (y: CGFloat) {
        var transform = CATransform3DIdentity
        transform.m34 = 1.0 / -1000.0
        transform = CATransform3DRotate(transform, degreesToRadians(y), 0.0, 1.0, 0.0)
        
        self.layer.transform = transform
    }
    
    public func setRotationZ (z: CGFloat) {
        var transform = CATransform3DIdentity
        transform.m34 = 1.0 / -1000.0
        transform = CATransform3DRotate(transform, degreesToRadians(z), 0.0, 0.0, 1.0)
        
        self.layer.transform = transform
    }
    
    public func setRotation (x: CGFloat,
        y: CGFloat,
        z: CGFloat) {
            var transform = CATransform3DIdentity
            transform.m34 = 1.0 / -1000.0
            transform = CATransform3DRotate(transform, degreesToRadians(x), 1.0, 0.0, 0.0)
            transform = CATransform3DRotate(transform, degreesToRadians(y), 0.0, 1.0, 0.0)
            transform = CATransform3DRotate(transform, degreesToRadians(z), 0.0, 0.0, 1.0)
            
            self.layer.transform = transform
    }
    
    
    public func setScale (x: CGFloat,
        y: CGFloat) {
            var transform = CATransform3DIdentity
            transform.m34 = 1.0 / -1000.0
            transform = CATransform3DScale(transform, x, y, 1)
            
            self.layer.transform = transform
    }
    
    
    
    // MARK: Anchor Extensions
    
    public func setAnchorPosition (anchorPosition: AnchorPosition) {
        print(anchorPosition.rawValue)
        self.layer.anchorPoint = anchorPosition.rawValue
    }
    
    
    
    // MARK: Layer Extensions
    
    public func addShadow (offset: CGSize,
        radius: CGFloat,
        color: UIColor,
        opacity: Float) {
            self.layer.shadowOffset = offset
            self.layer.shadowRadius = radius
            self.layer.shadowOpacity = opacity
            self.layer.shadowColor = color.CGColor
    }
    
    public func addBorder (width: CGFloat,
        color: UIColor) {
            self.layer.borderWidth = width
            self.layer.borderColor = color.CGColor
            self.layer.masksToBounds = true
    }
    
    
    public func setCornerRadius (radius: CGFloat) {
        self.layer.cornerRadius = radius
        self.layer.masksToBounds = true
    }
    
    
    public func drawCircle (fillColor: UIColor,
        strokeColor: UIColor,
        strokeWidth: CGFloat) {
            let path = UIBezierPath (roundedRect: CGRect (x: 0, y: 0, width: self.w, height: self.w), cornerRadius: self.w/2)
            
            let shapeLayer = CAShapeLayer ()
            shapeLayer.path = path.CGPath
            shapeLayer.fillColor = fillColor.CGColor
            shapeLayer.strokeColor = strokeColor.CGColor
            shapeLayer.lineWidth = strokeWidth
            
            self.layer.addSublayer(shapeLayer)
    }
    
    public func drawStroke (width: CGFloat,
        color: UIColor) {
            let path = UIBezierPath (roundedRect: CGRect (x: 0, y: 0, width: self.w, height: self.w), cornerRadius: self.w/2)
            
            let shapeLayer = CAShapeLayer ()
            shapeLayer.path = path.CGPath
            shapeLayer.fillColor = UIColor.clearColor().CGColor
            shapeLayer.strokeColor = color.CGColor
            shapeLayer.lineWidth = width
            
            self.layer.addSublayer(shapeLayer)
    }
    
    public func drawArc (from: CGFloat,
        to: CGFloat,
        clockwise: Bool,
        width: CGFloat,
        fillColor: UIColor,
        strokeColor: UIColor,
        lineCap: String) {
            let path = UIBezierPath (arcCenter: self.center, radius: self.w/2, startAngle: degreesToRadians(from), endAngle: degreesToRadians(to), clockwise: clockwise)
            
            let shapeLayer = CAShapeLayer ()
            shapeLayer.path = path.CGPath
            shapeLayer.fillColor = fillColor.CGColor
            shapeLayer.strokeColor = strokeColor.CGColor
            shapeLayer.lineWidth = width
            
            self.layer.addSublayer(shapeLayer)
    }
    
    
    
    // MARK: Animation Extensions
    
    public func spring (animations: (()->Void)!,
        completion: ((Bool)->Void)? = nil) {
            UIView.animateWithDuration(UIViewAnimationDuration,
                delay: 0,
                usingSpringWithDamping: UIViewAnimationSpringDamping,
                initialSpringVelocity: UIViewAnimationSpringVelocity,
                options: UIViewAnimationOptions.AllowAnimatedContent,
                animations: animations,
                completion: completion)
    }
    
    public func animate (animations: (()->Void)!,
        completion: ((Bool)->Void)? = nil) {
            UIView.animateWithDuration(UIViewAnimationDuration,
                animations: animations,
                completion: completion)
    }
    
    
    
    // MARK: Gesture Extensions
    
    public func addTapGesture (tapNumber: NSInteger,
        target: AnyObject, action: Selector) {
            let tap = UITapGestureRecognizer (target: target, action: action)
            tap.numberOfTapsRequired = tapNumber
            self.addGestureRecognizer(tap)
    }
    
    public func addSwipeGesture (direction: UISwipeGestureRecognizerDirection,
        numberOfTouches: Int,
        target: AnyObject,
        action: Selector) {
            let swipe = UISwipeGestureRecognizer (target: target, action: action)
            swipe.direction = direction
            swipe.numberOfTouchesRequired = numberOfTouches
            self.addGestureRecognizer(swipe)
    }
    
    public func addPanGesture (target: AnyObject,
        action: Selector) {
            let pan = UIPanGestureRecognizer (target: target, action: action)
            self.addGestureRecognizer(pan)
    }
    
    public func whenTap(number:NSInteger = 1,block:()->Void) -> DisposableType{
        self.userInteractionEnabled = true
        return bnd_tapGestureEvent(number).observe { (_) -> () in
            block()
        }
    }
    
    public func whenSwipe(number:NSInteger = 1,direction:UISwipeGestureRecognizerDirection,block:()->Void) -> DisposableType{
        self.userInteractionEnabled = true
        return bnd_swipeGestureEvent(number).observe { (_) -> () in
            block()
        }
    }
}


================================================
FILE: Pod/Classes/Easy/Lib/EZExtend+UIViewController.swift
================================================
//
//  EZExtend+UIViewController.swift
//  medical
//
//  Created by zhuchao on 15/4/28.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
// MARK: - UIViewController

extension UIViewController {
    
    public var top: CGFloat {
        get {
            if let nav = self.navigationController {
                if nav.navigationBarHidden {
                    return view.top
                } else {
                    return nav.navigationBar.bottom
                }
            } else {
                return view.top
            }
        }
    }
    
    public var bottom: CGFloat {
        get {
            if let tab = tabBarController {
                if tab.tabBar.hidden {
                    return view.bottom
                } else {
                    return tab.tabBar.top
                }
            } else {
                return view.bottom
            }
        }
    }
    
    
    public var navigationBarHeight: CGFloat {
        get {
            if let nav = self.navigationController {
                return nav.navigationBar.h
            }
            
            return 0
        }
    }
    
    public var navigationBarColor: UIColor? {
        get {
            return navigationController?.navigationBar.tintColor
        } set (value) {
            navigationController?.navigationBar.barTintColor = value
        }
    }
    
    public var navigationBar: UINavigationBar? {
        get {
            return navigationController?.navigationBar
        }
    }
    
    public var applicationFrame: CGRect {
        get {
            return CGRect (x: view.x, y: top, width: view.w, height: bottom - top)
        }
    }
}


================================================
FILE: Pod/Classes/Easy/Lib/EZKit.swift
================================================
//
//  CEMKit.swift
//  CEMKit-Swift
//
//  Created by Cem Olcay on 05/11/14.
//  Copyright (c) 2014 Cem Olcay. All rights reserved.
//

import UIKit



// MARK: - UIBarButtonItem

public func barButtonItem (imageName: String,
    action: (AnyObject)->()) -> UIBarButtonItem {
        let button = BlockButton (frame: CGRect(x: 0, y: 0, width: 20, height: 20))
        button.setImage(UIImage(named: imageName), forState: .Normal)
        button.actionBlock = action
        
        return UIBarButtonItem (customView: button)
}

public func barButtonItem (title: String,
    color: UIColor,
    action: (AnyObject)->()) -> UIBarButtonItem {
        let button = BlockButton (frame: CGRect(x: 0, y: 0, width: 20, height: 20))
        button.setTitle(title, forState: .Normal)
        button.setTitleColor(color, forState: .Normal)
        button.actionBlock = action
        button.sizeToFit()
        
        return UIBarButtonItem (customView: button)
}



// MARK: - CGSize

public func + (left: CGSize, right: CGSize) -> CGSize {
    return CGSize (width: left.width + right.width, height: left.height + right.height)
}

public func - (left: CGSize, right: CGSize) -> CGSize {
    return CGSize (width: left.width - right.width, height: left.width - right.width)
}



// MARK: - CGPoint

public func + (left: CGPoint, right: CGPoint) -> CGPoint {
    return CGPoint (x: left.x + right.x, y: left.y + right.y)
}

public func - (left: CGPoint, right: CGPoint) -> CGPoint {
    return CGPoint (x: left.x - right.x, y: left.y - right.y)
}


public enum AnchorPosition: CGPoint {
    case TopLeft        = "{0, 0}"
    case TopCenter      = "{0.5, 0}"
    case TopRight       = "{1, 0}"
    
    case MidLeft        = "{0, 0.5}"
    case MidCenter      = "{0.5, 0.5}"
    case MidRight       = "{1, 0.5}"
    
    case BottomLeft     = "{0, 1}"
    case BottomCenter   = "{0.5, 1}"
    case BottomRight    = "{1, 1}"
}

extension CGPoint: StringLiteralConvertible {
    
    public init(stringLiteral value: StringLiteralType) {
        self = CGPointFromString(value)
    }
    
    public init(extendedGraphemeClusterLiteral value: StringLiteralType) {
        self = CGPointFromString(value)
    }
    
    public init(unicodeScalarLiteral value: StringLiteralType) {
        self = CGPointFromString(value)
    }
}



// MARK: - CGFloat

public func degreesToRadians (angle: CGFloat) -> CGFloat {
    return (CGFloat (M_PI) * angle) / 180.0
}


public func normalizeValue (value: CGFloat,
    min: CGFloat,
    max: CGFloat) -> CGFloat {
    return (max - min) / value
}


public func convertNormalizedValue (value: CGFloat,
    min: CGFloat,
    max: CGFloat) -> CGFloat {
    return ((max - min) * value) + min
}



// MARK: - Block Classes


// MARK: - BlockButton

public class BlockButton: UIButton {
    
    override init (frame: CGRect) {
        super.init(frame: frame)
    }
    
    required public init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    var actionBlock: ((sender: BlockButton) -> ())? {
        didSet {
            self.addTarget(self, action: "action:", forControlEvents: UIControlEvents.TouchUpInside)
        }
    }
    
    func action (sender: BlockButton) {
        actionBlock! (sender: sender)
    }
}



// MARK: - BlockWebView

public class BlockWebView: UIWebView, UIWebViewDelegate {
    
    var didStartLoad: ((NSURLRequest?) -> ())?
    var didFinishLoad: ((NSURLRequest?) -> ())?
    var didFailLoad: ((NSURLRequest?, NSError?) -> ())?
    
    var shouldStartLoadingRequest: ((NSURLRequest) -> (Bool))?
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        delegate = self
    }
    
    public required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    
    @objc public func webViewDidStartLoad(webView: UIWebView) {
        didStartLoad? (webView.request)
    }
    
    @objc public func webViewDidFinishLoad(webView: UIWebView) {
        didFinishLoad? (webView.request)
    }
    @objc  public func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
        didFailLoad? (webView.request, error)
    }
    
    @objc public func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        if let should = shouldStartLoadingRequest {
            return should (request)
        } else {
            return true
        }
    }
    
}


public func nsValueForAny(anyValue:Any) -> NSObject? {
    switch(anyValue) {
    case let intValue as Int:
        return NSNumber(int: CInt(intValue))
    case let doubleValue as Double:
        return NSNumber(double: CDouble(doubleValue))
    case let stringValue as String:
        return stringValue as NSString
    case let boolValue as Bool:
        return NSNumber(bool: boolValue)
    default:
        return nil
    }
}

extension NSObject{
    public class var nameOfClass: String{
        return NSStringFromClass(self).componentsSeparatedByString(".").last!
    }
    
    public var nameOfClass: String{
        return NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last!
    }

    
    public func listProperties() -> Dictionary<String,AnyObject>{

        var modelDictionary = Dictionary<String,AnyObject>()
        Mirror(reflecting: self).children.forEach { (element) -> () in
            if  element.label != "super" {
                if let nsValue = nsValueForAny(element.value) {
                    modelDictionary.updateValue(nsValue, forKey: element.label!)
                }
            }
        }
        return modelDictionary
    }
    
}


public func isEmpty<C : NSObject>(x: C) -> Bool {
    if x.isKindOfClass(NSNull) {
        return true
    }else if x.respondsToSelector(Selector("length")) && NSData().self.length == 0 {
        return true
    }else if x.respondsToSelector(Selector("count")) && NSArray().self.count == 0 {
        return true
    }
    return false
}






================================================
FILE: Pod/Classes/Easy/Lib/EZPrintln.swift
================================================
//
//  EZPrintln.swift
//  medical
//
//  Created by zhuchao on 15/4/28.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import Foundation

var EZ_DEBUG_MODE = true
/**
Writes the textual representation of `object` and a newline character into the standard output.
The textual representation is obtained from the `object` using its protocol conformances,
in the following order of preference: `Streamable`, `Printable`, `DebugPrintable`.
This functional also augments the original function with the filename, function name, and line number of the object that is being logged.
- parameter object:   A textual representation of the object.
- parameter file:     Defaults to the name of the file that called magic(). Do not override this default.
- parameter function: Defaults to the name of the function within the file in which magic() was called. Do not override this default.
- parameter line:     Defaults to the line number within the file in which magic() was called. Do not override this default.
*/
public func EZPrintln<T>(object: T, _ file: String = __FILE__, _ function: String = __FUNCTION__, _ line: Int = __LINE__)
{
    if EZ_DEBUG_MODE {
        let filename = NSURL(fileURLWithPath: file).lastPathComponent?.URLString
        print("\(filename).\(function)[\(line)]: \(object)\n", terminator: "")
    }
}



================================================
FILE: Pod/Classes/Easy/Lib/EZSystemInfo.swift
================================================
//
//  EZSystemInfo.swift
//  medical
//
//  Created by zhuchao on 15/4/22.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit

#if os(iOS)
let IOS10_OR_LATER = (UIDevice.currentDevice().systemVersion.caseInsensitiveCompare("10.0") != NSComparisonResult.OrderedAscending)
let IOS9_OR_LATER = (UIDevice.currentDevice().systemVersion.caseInsensitiveCompare("9.0") != NSComparisonResult.OrderedAscending)
let IOS8_OR_LATER = (UIDevice.currentDevice().systemVersion.caseInsensitiveCompare("8.0") != NSComparisonResult.OrderedAscending)
let IOS7_OR_LATER = (UIDevice.currentDevice().systemVersion.caseInsensitiveCompare("7.0") != NSComparisonResult.OrderedAscending)
let IOS6_OR_LATER = (UIDevice.currentDevice().systemVersion.caseInsensitiveCompare("6.0") != NSComparisonResult.OrderedAscending)
let IOS5_OR_LATER = (UIDevice.currentDevice().systemVersion.caseInsensitiveCompare("5.0") != NSComparisonResult.OrderedAscending)
let IOS4_OR_LATER = (UIDevice.currentDevice().systemVersion.caseInsensitiveCompare("4.0") != NSComparisonResult.OrderedAscending)
let IOS3_OR_LATER = (UIDevice.currentDevice().systemVersion.caseInsensitiveCompare("3.0") != NSComparisonResult.OrderedAscending)

let IOS9_OR_EARLIER = !IOS10_OR_LATER
let IOS8_OR_EARLIER = !IOS9_OR_LATER
let IOS7_OR_EARLIER = !IOS8_OR_LATER
let IOS6_OR_EARLIER = !IOS7_OR_LATER
let IOS5_OR_EARLIER = !IOS6_OR_LATER
let IOS4_OR_EARLIER = !IOS5_OR_LATER
let IOS3_OR_EARLIER = !IOS4_OR_LATER

let IS_SCREEN_4_INCH = CGSizeEqualToSize(CGSizeMake(640, 1136), UIScreen.mainScreen().currentMode!.size)
let IS_SCREEN_35_INCH = CGSizeEqualToSize(CGSizeMake(640, 960), UIScreen.mainScreen().currentMode!.size)
let IS_SCREEN_47_INCH = CGSizeEqualToSize(CGSizeMake(750, 1334), UIScreen.mainScreen().currentMode!.size)
let IS_SCREEN_55_INCH = CGSizeEqualToSize(CGSizeMake(1242, 2208), UIScreen.mainScreen().currentMode!.size)

#else
let IOS9_OR_LATER = false
let IOS8_OR_LATER = false
let IOS7_OR_LATER = false
let IOS6_OR_LATER = false
let IOS5_OR_LATER = false
let IOS4_OR_LATER = false
let IOS3_OR_LATER = false
    
let IOS9_OR_EARLIER = false
let IOS8_OR_EARLIER = false
let IOS7_OR_EARLIER = false
let IOS6_OR_EARLIER = false
let IOS5_OR_EARLIER = false
let IOS4_OR_EARLIER = false
let IOS3_OR_EARLIER = false
    
let IS_SCREEN_4_INCH = false
let IS_SCREEN_35_INCH = false
let IS_SCREEN_47_INCH = false
let IS_SCREEN_55_INCH = false
#endif


public var IsSimulator:Bool {
#if (arch(i386) || arch(x86_64)) && os(iOS)
    return true;
#else
    return false;
#endif
}

public func OSVersion() ->String{
#if os(iOS)
    return UIDevice.currentDevice().systemName + " " + UIDevice.currentDevice().systemVersion
#else	// #if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR)
    return ""
#endif	// #if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR)
}

//func AppVersion() ->String{
//    var value = NSBundle.mainBundle().infoDictionary["CFBundleVersion"]
//    if nil == value || 0 == value.length
//    {
//    value = NSBundle.mainBundle().infoDictionary["CFBundleShortVersion"]
//    }
//    return value
//}

//func AppIdentifier() ->String{
//#if os(iOS)
//    var value = NSBundle.mainBundle().infoDictionary["CFBundleVersion"]
//    if nil == value || 0 == value.length
//    {
//    value = NSBundle.mainBundle().infoDictionary["CFBundleShortVersion"]
//    }
//    return value
//#else	// #if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR)
//    return ""
//#endif	// #if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR)
//}




public var Orientation: UIInterfaceOrientation {
get {
    return UIApplication.sharedApplication().statusBarOrientation
}
}

public var ScreenWidth: CGFloat {
get {
    if UIInterfaceOrientationIsPortrait(Orientation) {
        return UIScreen.mainScreen().bounds.size.width
    } else {
        return UIScreen.mainScreen().bounds.size.height
    }
}
}

public var ScreenHeight: CGFloat {
get {
    if UIInterfaceOrientationIsPortrait(Orientation) {
        return UIScreen.mainScreen().bounds.size.height
    } else {
        return UIScreen.mainScreen().bounds.size.width
    }
}
}

public var StatusBarHeight: CGFloat {
get {
    return UIApplication.sharedApplication().statusBarFrame.height
}
}



================================================
FILE: Pod/Classes/Easy/Lib/EZWatch.swift
================================================

//  EZWatch.swift
//  medical
//
//  Created by zhuchao on 15/4/29.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import Foundation

func watchForChangesToFilePath(filePath:String,callback:dispatch_block_t) {
    let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
    let fileDescriptor = open(filePath, O_EVTONLY)
    
    if fileDescriptor <= 0 {
        return
    }
    assert(fileDescriptor > 0, "Error could subscribe to events for file at path: \(filePath)")
    let source = dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE, UInt(fileDescriptor), DISPATCH_VNODE_DELETE | DISPATCH_VNODE_WRITE | DISPATCH_VNODE_EXTEND, queue)
    dispatch_source_set_event_handler(source){
        let flags = dispatch_source_get_data(source)
        if flags != 0 {
            dispatch_source_cancel(source)
            dispatch_async(dispatch_get_main_queue()){
                 callback()
            }
            let popTime = dispatch_time(DISPATCH_TIME_NOW,  Int64(0.5*Double(NSEC_PER_SEC)))
            dispatch_after(popTime, queue){
                watchForChangesToFilePath(filePath, callback: callback)
            }
        }
    }
    dispatch_source_set_cancel_handler(source){
        close(fileDescriptor)
    }
    dispatch_resume(source)
}







================================================
FILE: Pod/Classes/Easy/Lib/EasyORM.swift
================================================
//
//  NSManagedObject+EZExtend.swift
//  medical
//
//  Created by zhuchao on 15/5/30.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import Foundation
import CoreData

public func DBQuery(aClass: NSManagedObject.Type!,entityName:String) -> NSFetchRequest {
    return aClass.defaultContext().createFetchRequest(entityName)
}

public class EasyORM {
    
    public static var generateRelationships = false
    
    public static func setUpEntities(entities: [String:NSManagedObject.Type]) {
        nameToEntities = entities
    }
    
    private static var nameToEntities: [String:NSManagedObject.Type] = [String:NSManagedObject.Type]()

    
}

public extension NSManagedObject{

    public func defaultContext() -> NSManagedObjectContext{
        return self.managedObjectContext ?? self.dynamicType.defaultContext()
    }
    
    public static func defaultContext() -> NSManagedObjectContext{
        return NSManagedObjectContext.defaultContext
    }
    
    private static var query:NSFetchRequest{
        return self.defaultContext().createFetchRequest(self.entityName())
    }
    
    public static func condition(condition: AnyObject?) -> NSFetchRequest{
        return self.query.condition(condition)
    }
    
    public static func orderBy(key:String,_ order:String = "ASC") -> NSFetchRequest{
        return self.query.orderBy(key, order)
    }
    
    /**
    * Set the "limit" value of the query.
    *
    * @param int value
    * @return self
    * @static
    */
    public static func limit(value:Int) -> NSFetchRequest{
        return self.query.limit(value)
    }
    
    /**
    * Alias to set the "limit" value of the query.
    *
    * @param int value
    * @return NSFetchRequest
    */
    public static func take(value:Int) -> NSFetchRequest{
        return self.query.take(value)
    }
    
    /**
    * Set the limit and offset for a given page.
    *
    * @param int page
    * @param int perPage
    * @return NSFetchRequest
    */
    public static func forPage(page:Int,_ perPage:Int) -> NSFetchRequest{
        return self.query.forPage(page,perPage)
    }
    
    public static func all() -> [NSManagedObject] {
        return self.query.get()
    }
    
    public static func count() -> Int {
        return self.query.count()
    }
    
    public static func findAndUpdate(unique:[String:AnyObject],data:[String:AnyObject]) -> NSManagedObject?{
        if let object = self.find(unique) {
            object.update(data)
            return object
        }else{
            return nil
        }
    }
    
    public static func updateOrCreate(unique:[String:AnyObject],data:[String:AnyObject]) -> NSManagedObject{
        if let object = self.find(unique) {
            object.update(data)
            return object
        }else{
            return self.create(data)
        }
    }
    
    public static func findOrCreate(properties: [String:AnyObject]) -> NSManagedObject {
        let transformed = self.transformProperties(properties)
        let existing = self.find(properties)
        return existing ?? self.create(transformed)
    }
    
    public static func find(condition: AnyObject) -> NSManagedObject? {
        return self.query.condition(condition).first()
    }
    
    public func update(properties: [String:AnyObject]) {
        
        if (properties.count == 0) {
            return
        }
        let transformed = self.dynamicType.transformProperties(properties)
        //Finish
        for (key, value) in transformed {
            self.willChangeValueForKey(key)
            self.setSafeValue(value, forKey: key)
            self.didChangeValueForKey(key)
        }
    }
    
    public func save() -> Bool {
        return self.defaultContext().saveData()
    }
    
    public func delete() -> NSManagedObjectContext {
        let context = self.defaultContext()
        context.deleteObject(self)
        return context
    }
    
    public static func deleteAll() -> NSManagedObjectContext{
        for o in self.all() {
            o.delete()
        }
        return self.defaultContext()
    }
    
    public static func create() -> NSManagedObject {
        let o = NSEntityDescription.insertNewObjectForEntityForName(self.entityName(), inManagedObjectContext: self.defaultContext()) 
        if let idprop = self.autoIncrementingId() {
            o.setPrimitiveValue(NSNumber(integer: self.nextId()), forKey: idprop)
        }
        return o
    }
    
    public static func create(properties: [String:AnyObject]) -> NSManagedObject {
        let newEntity: NSManagedObject = self.create()
        newEntity.update(properties)
        if let idprop = self.autoIncrementingId() {
            if newEntity.primitiveValueForKey(idprop) == nil {
                newEntity.setPrimitiveValue(NSNumber(integer: self.nextId()), forKey: idprop)
            }
        }
        return newEntity
    }
    
    public static func autoIncrements() -> Bool {
        return self.autoIncrementingId() != nil
    }
    
    public static func nextId() -> Int {
        let key = "SwiftRecord-" + self.entityName() + "-ID"
        if self.autoIncrementingId() != nil {
            let id = NSUserDefaults.standardUserDefaults().integerForKey(key)
            NSUserDefaults.standardUserDefaults().setInteger(id + 1, forKey: key)
            return id
        }
        return 0
    }
    

    public class func autoIncrementingId() -> String? {
        return nil
    }
    
    //Private
    
    private static func transformProperties(properties: [String:AnyObject]) -> [String:AnyObject]{
        let entity = NSEntityDescription.entityForName(self.entityName(), inManagedObjectContext: self.defaultContext())!
        let attrs = entity.attributesByName
        let rels = entity.relationshipsByName
        
        var transformed = [String:AnyObject]()
        for (key, value) in properties {
            let localKey = self.keyForRemoteKey(key)
            if attrs[localKey] != nil {
                transformed[localKey] = value
            } else if let rel = rels[localKey]  {
                if EasyORM.generateRelationships {
                    if rel.toMany {
                        if let array = value as? [[String:AnyObject]] {
                            transformed[localKey] = self.generateSet(rel, array: array)
                        } else {
                            #if DEBUG
                                println("Invalid value for relationship generation in \(NSStringFromClass(self)).\(localKey)")
                                println(value)
                            #endif
                        }
                    } else if let dict = value as? [String:AnyObject] {
                        transformed[localKey] = self.generateObject(rel, dict: dict)
                    } else {
                        #if DEBUG
                            println("Invalid value for relationship generation in \(NSStringFromClass(self)).\(localKey)")
                            println(value)
                        #endif
                    }
                }
            }
        }
        return transformed
    }
    
    
    private func setSafeValue(value: AnyObject?, forKey key: String) {
        if (value == nil) {
            self.setNilValueForKey(key)
            return
        }
        let val: AnyObject = value!
        if let attr = self.entity.attributesByName[key] {
            let attrType = attr.attributeType
            if attrType == NSAttributeType.StringAttributeType && value is NSNumber {
                self.setPrimitiveValue((val as! NSNumber).stringValue, forKey: key)
            } else if let s = val as? String {
                if self.isIntegerAttributeType(attrType) {
                    self.setPrimitiveValue(NSNumber(integer: val.integerValue), forKey: key)
                    return
                } else if attrType == NSAttributeType.BooleanAttributeType {
                    self.setPrimitiveValue(NSNumber(bool: val.boolValue), forKey: key)
                    return
                } else if (attrType == NSAttributeType.FloatAttributeType) {
                    self.setPrimitiveValue(NSNumber(floatLiteral: val.doubleValue), forKey: key)
                    return
                } else if (attrType == NSAttributeType.DateAttributeType) {
                    self.setPrimitiveValue(self.dynamicType.dateFormatter.dateFromString(s), forKey: key)
                    return
                }
            }
        }
        self.setPrimitiveValue(value, forKey: key)
    }
    
    private func isIntegerAttributeType(attrType: NSAttributeType) -> Bool {
        return attrType == NSAttributeType.Integer16AttributeType || attrType == NSAttributeType.Integer32AttributeType || attrType == NSAttributeType.Integer64AttributeType
    }
    
    private static var dateFormatter: NSDateFormatter {
        if _dateFormatter == nil {
            _dateFormatter = NSDateFormatter()
            _dateFormatter!.dateFormat = "yyyy-MM-dd HH:mm:ss z"
        }
        return _dateFormatter!
    }
    private static var _dateFormatter: NSDateFormatter?
    
    
    public class func mappings() -> [String:String] {
        return [String:String]()
    }
    
    public static func keyForRemoteKey(remote: String) -> String {
        if let s = cachedMappings[remote] {
            return s
        }
        let entity = NSEntityDescription.entityForName(self.entityName(), inManagedObjectContext: self.defaultContext())!
        let properties = entity.propertiesByName
        if properties[remote] != nil {
            _cachedMappings![remote] = remote
            return remote
        }
        
        let camelCased = remote.camelCase
        if properties[camelCased] != nil {
            _cachedMappings![remote] = camelCased
            return camelCased
        }
        _cachedMappings![remote] = remote
        return remote
    }
    private static var cachedMappings: [String:String] {
        if let m = _cachedMappings {
            return m
        } else {
            var m = [String:String]()
            for (key, value) in mappings() {
                m[value] = key
            }
            _cachedMappings = m
            return m
        }
    }
    private static var _cachedMappings: [String:String]?
    
    private static func generateSet(rel: NSRelationshipDescription, array: [[String:AnyObject]]) -> NSSet {
        var cls: NSManagedObject.Type?
        if EasyORM.nameToEntities.count > 0 {
            cls = EasyORM.nameToEntities[rel.destinationEntity!.managedObjectClassName]
        }
        if cls == nil {
            cls = (NSClassFromString(rel.destinationEntity!.managedObjectClassName) as! NSManagedObject.Type)
        } else {
            print("Got class name from entity setup")
        }
        let set = NSMutableSet()
        for d in array {
            set.addObject(cls!.findOrCreate(d))
        }
        return set
    }
    
    private static func generateObject(rel: NSRelationshipDescription, dict: [String:AnyObject]) -> NSManagedObject {
        let entity = rel.destinationEntity!
        
        let cls: NSManagedObject.Type = NSClassFromString(entity.managedObjectClassName) as! NSManagedObject.Type
        return cls.findOrCreate(dict)
    }
    
    public static func primaryKey() -> String {
        NSException(name: "Primary key undefined in " + NSStringFromClass(self), reason: "Override primaryKey if you want to support automatic creation, otherwise disable this feature", userInfo: nil).raise()
        return ""
    }
    
    private static func entityName() -> String {
        var name = NSStringFromClass(self)
        if name.rangeOfString(".") != nil {
            let comp = name.characters.split {$0 == "."}.map { String($0) }
            if comp.count > 1 {
                name = comp.last!
            }
        }
        if name.rangeOfString("_") != nil {
            var comp = name.characters.split {$0 == "_"}.map { String($0) }
            var last: String = ""
            var remove = -1
            for (i,s) in Array(comp.reverse()).enumerate() {
                if last == s {
                    remove = i
                }
                last = s
            }
            if remove > -1 {
                comp.removeAtIndex(remove)
                name = comp.joinWithSeparator("_")
            }
        }
        return name
    }
}

public extension String {
    var camelCase: String {
        let spaced = self.stringByReplacingOccurrencesOfString("_", withString: " ", options: [], range:Range<String.Index>(start: self.startIndex, end: self.endIndex))
        let capitalized = spaced.capitalizedString
        let spaceless = capitalized.stringByReplacingOccurrencesOfString(" ", withString: "", options:[], range:Range<String.Index>(start:self.startIndex, end:self.endIndex))
        return spaceless.stringByReplacingCharactersInRange(Range<String.Index>(start:spaceless.startIndex, end:spaceless.startIndex.successor()), withString: "\(spaceless[spaceless.startIndex])".lowercaseString)
    }
}


================================================
FILE: Pod/Classes/Easy/Lib/NSData+EasyExtend.h
================================================
//
//  NSData+EasyExtend.h
//  fastSign
//
//  Created by EasyIOS on 14-4-10.
//  Copyright (c) 2014年 zhuchao. All rights reserved.
//

#import <Foundation/Foundation.h>
@interface NSData (EasyExtend)

@property (nonatomic, readonly) NSData *	MD5;
@property (nonatomic, readonly) NSString *	MD5String;

+ (NSData *)fromResource:(NSString *)resName;

@end


================================================
FILE: Pod/Classes/Easy/Lib/NSData+EasyExtend.m
================================================
//
//  NSData+EasyExtend.m
//
//  Created by EasyIOS on 14-4-10.
//  Copyright (c) 2014年 zhuchao. All rights reserved.
//

#import "NSData+EasyExtend.h"

#import <CommonCrypto/CommonDigest.h>
@implementation NSData (EasyExtend)

- (NSData *)MD5
{
	unsigned char	md5Result[CC_MD5_DIGEST_LENGTH + 1];
	CC_LONG			md5Length = (CC_LONG)[self length];
	
	CC_MD5( [self bytes], md5Length, md5Result );
	
	
	NSMutableData * retData = [[NSMutableData alloc] init];
	if ( nil == retData )
		return nil;
	
	[retData appendBytes:md5Result length:CC_MD5_DIGEST_LENGTH];
	return retData;
}

- (NSString *)MD5String
{
	NSData * value = [self MD5];
	if ( value )
	{
		char			tmp[16];
		unsigned char *	hex = (unsigned char *)malloc( 2048 + 1 );
		unsigned char *	bytes = (unsigned char *)[value bytes];
		unsigned long	length = [value length];
		
		hex[0] = '\0';
		
		for ( unsigned long i = 0; i < length; ++i )
		{
			sprintf( tmp, "%02X", bytes[i] );
			strcat( (char *)hex, tmp );
		}
		
		NSString * result = [NSString stringWithUTF8String:(const char *)hex];
		free( hex );
		return result;
	}
	else
	{
		return nil;
	}
}

+ (NSData *)fromResource:(NSString *)resName
{
	NSString *	extension = [resName pathExtension];
	NSString *	fullName = [resName substringToIndex:(resName.length - extension.length - 1)];
	
	NSString * path = [[NSBundle mainBundle] pathForResource:fullName ofType:extension];
	return [NSData dataWithContentsOfFile:path];
}
@end


================================================
FILE: Pod/Classes/Easy/Lib/PullRefresh/EZInfiniteScrolling.swift
================================================
//
//  EZInfiniteScrolling.swift
//  Demo
//
//  Created by zhuchao on 15/5/15.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
import Bond

let EZInfiniteScrollingViewHeight:CGFloat = 60.0

public enum EZInfiniteScrollingState {
    case Stopped
    case Triggered
    case Loading
    case Pulling
    case Ended
}

public class Footer:UIView {
    init(scrollView:UIScrollView,frame: CGRect = CGRectZero) {
        super.init(frame: frame)
        
    }
    
    required public init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    public func resetScrollViewContentInset(scrollView:UIScrollView){
        var currentInsets = scrollView.contentInset
        let newBottom = scrollView.infiniteScrollingView!.originalBottomInset + scrollView.infiniteScrollingView!.extendBottom;
        if newBottom != currentInsets.bottom {
            currentInsets.bottom = newBottom
            self.setScrollViewContentInset(currentInsets, scrollView: scrollView)
        }
    }
    
    public func setScrollViewContentInsetForLoading(scrollView:UIScrollView){
        var currentInsets = scrollView.contentInset
        let newBottom  = scrollView.infiniteScrollingView!.originalBottomInset + scrollView.infiniteScrollingView!.extendBottom + EZInfiniteScrollingViewHeight;
        if newBottom != currentInsets.bottom {
            currentInsets.bottom = newBottom
            self.setScrollViewContentInset(currentInsets, scrollView: scrollView)
        }
    }
    
    public func setScrollViewContentInset(contentInset:UIEdgeInsets,scrollView:UIScrollView){
        UIView.animateWithDuration(0.3, delay: 0,
            options: UIViewAnimationOptions.BeginFromCurrentState,
            animations: {
                scrollView.contentInset = contentInset
            },completion:nil)
    }
}

public class EZInfiniteScrollingView :UIView {
    public var state = Observable<EZInfiniteScrollingState>(.Stopped)
    public var extendBottom:CGFloat = 0.0
    public var originalBottomInset:CGFloat = 0.0
    private var infiniteScrollingHandler:(Void -> ())?
    private var oldState = EZInfiniteScrollingState.Stopped
    
    private func commonInit(){
        self.autoresizingMask = UIViewAutoresizing.FlexibleWidth
        
        self.state.observe{ [unowned self] state in
            if state == .Loading && self.oldState == .Triggered {
                self.infiniteScrollingHandler?()
            }
            self.oldState = state
        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.commonInit()
    }
    
    required public init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.commonInit()
    }
    
    func setCustomView(customView:UIView){
        if customView.isKindOfClass(UIView) {
            for view in self.subviews {
                view.removeFromSuperview()
            }
            self.addSubview(customView)
            let viewBounds = customView.bounds;
            let origin = CGPointMake(
                CGFloat(roundf(Float(self.bounds.size.width-viewBounds.size.width)/2)),
                CGFloat(roundf(Float(self.bounds.size.height-viewBounds.size.height)/2)))
            customView.frame =  CGRectMake(origin.x, origin.y, viewBounds.size.width, viewBounds.size.height)
        }
    }
    
    public func resetState(){
        self.state.value = .Stopped;
    }
    
    public func startAnimating(){
        self.state.value = .Loading;
    }
    
    public func stopAnimating(){
        self.state.value = .Stopped;
    }
    
    public func setEnded(){
        self.state.value = .Ended;
    }
    
    
    public override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        let scrollView = object as! UIScrollView
        if keyPath == "contentOffset" && scrollView.showsInfiniteScrolling {
            if self.state.value != .Loading && self.state.value != .Ended  && scrollView.contentSize.height > 0{
                let scrollViewContentHeight = scrollView.contentSize.height;
                let scrollOffsetThreshold =  scrollViewContentHeight - scrollView.bounds.size.height + self.extendBottom
                
                if !scrollView.dragging && self.state.value == .Triggered {
                    self.state.value = .Loading
                }else if scrollView.dragging && self.state.value == .Pulling && scrollView.contentOffset.y - scrollOffsetThreshold > EZInfiniteScrollingViewHeight {
                    self.state.value = .Triggered
                }else if scrollView.contentOffset.y - scrollOffsetThreshold <= 1 && self.state.value != .Stopped {
                    self.state.value = .Stopped
                }else if scrollView.contentOffset.y - scrollOffsetThreshold > 0 && scrollView.contentOffset.y - scrollOffsetThreshold < EZInfiniteScrollingViewHeight  {
                    self.state.value = .Pulling
                }
            }
        }else if keyPath == "contentSize" && scrollView.contentSize.height >= scrollView.bounds.size.height && scrollView.showsInfiniteScrolling == false  {
                scrollView.showsInfiniteScrolling = true // 当contentSize.height大于scrollView的高度时才显示上拉加载
        }
    }
}

private var InfiniteScrollingViewHandle :UInt8 = 1
extension UIScrollView {
    
    public var infiniteScrollingView : EZInfiniteScrollingView? {
        get{
            if let d: AnyObject = objc_getAssociatedObject(self, &InfiniteScrollingViewHandle) {
                return d as? EZInfiniteScrollingView
            }else{
                return nil
            }
        }set (value){
            objc_setAssociatedObject(self, &InfiniteScrollingViewHandle, value, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    
    var showsInfiniteScrolling :Bool {
        get{
            return !self.infiniteScrollingView!.hidden
        }set(value){
            if value {
                self.addObserver(self.infiniteScrollingView!, forKeyPath: "contentOffset", options:NSKeyValueObservingOptions.New, context: nil)
                self.infiniteScrollingView?.hidden = false
            }else if (self.infiniteScrollingView?.hidden == false){
                self.removeObserver(self.infiniteScrollingView!, forKeyPath: "contentOffset")
                self.infiniteScrollingView?.hidden = true
            }
        }
    }
    
    public func addInfiniteScrollingWithActionHandler(customer:UIView? = nil,actionHandler:Void -> ()){
        if self.infiniteScrollingView == nil {
            let view = EZInfiniteScrollingView(frame: CGRectZero)
            view.infiniteScrollingHandler = actionHandler
            view.originalBottomInset = self.contentInset.bottom
            view.hidden = true
            self.infiniteScrollingView = view;
            
            self.addObserver(self.infiniteScrollingView!, forKeyPath: "contentSize", options:NSKeyValueObservingOptions.New, context: nil)
            
            self.addSubview(self.infiniteScrollingView!)
        }
        
        if customer == nil {
            self.infiniteScrollingView?.setCustomView(PullFooter(scrollView: self))
        }else{
            self.infiniteScrollingView?.setCustomView(customer!)
        }
    }
    
    public func triggerInfiniteScrolling(){
        self.infiniteScrollingView?.oldState = .Triggered
        self.infiniteScrollingView?.startAnimating()
    }
}

================================================
FILE: Pod/Classes/Easy/Lib/PullRefresh/EZPullToRefresh.swift
================================================
//
//  EZPullToRefresh.swift
//  Demo
//
//  Created by zhuchao on 15/5/15.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
import Bond

let EZPullToRefreshViewHeight:CGFloat = 60.0

public enum EZPullToRefreshState {
    case Stopped
    case Triggered
    case Loading
    case Pulling
}

public class Header : UIView {
    
    init(scrollView:UIScrollView,frame: CGRect = CGRectZero) {
        super.init(frame: frame)

    }

    required public init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    public func resetScrollViewContentInset(scrollView:UIScrollView){
        var currentInsets = scrollView.contentInset
        currentInsets.top = scrollView.pullToRefreshView!.originalTopInset
        self.setScrollViewContentInset(currentInsets, scrollView: scrollView)
    }
    
    public func setScrollViewContentInsetForLoading(scrollView:UIScrollView){
        let offset = max(EZPullToRefreshViewHeight, 0)
        var currentInsets = scrollView.contentInset
        currentInsets.top = max(offset, scrollView.pullToRefreshView!.originalTopInset + scrollView.pullToRefreshView!.bounds.size.height)
        self.setScrollViewContentInset(currentInsets, scrollView: scrollView)
    }
    
    public func setScrollViewContentInset(contentInset:UIEdgeInsets,scrollView:UIScrollView){
        UIView.animateWithDuration(0.3, delay: 0,
            options: UIViewAnimationOptions.BeginFromCurrentState,
            animations: {
            scrollView.contentInset = contentInset
        },completion:nil)
    }
}




public class EZPullToRefreshView : UIView {
    
    public var state = Observable<EZPullToRefreshState>(.Stopped)
    public var originalTopInset:CGFloat = 0.0
    public var originalBottomInset:CGFloat = 0.0
    public var originalOffset:CGFloat = 0.0
    private var pullToRefreshActionHandler:(Void -> ())?
    private var oldState = EZPullToRefreshState.Stopped
    
    private func commonInit(){
        self.autoresizingMask = UIViewAutoresizing.FlexibleWidth
        self.state.observe{ [unowned self] state in
            if state == .Loading && self.oldState == .Triggered {
                self.pullToRefreshActionHandler?()
            }
            self.oldState = state
        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.commonInit()
    }
    
    required public init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.commonInit()
    }
    
    func setCustomView(customView:UIView){
        if customView.isKindOfClass(UIView) {
            for view in self.subviews {
                view.removeFromSuperview()
            }
            self.addSubview(customView)
            let viewBounds = customView.bounds;
            let origin = CGPointMake(
                CGFloat(roundf(Float(self.bounds.size.width-viewBounds.size.width)/2)),
                CGFloat(roundf(Float(self.bounds.size.height-viewBounds.size.height)/2)))
            customView.frame =  CGRectMake(origin.x, origin.y, viewBounds.size.width, viewBounds.size.height)
        }
    }
    
    public func startAnimating(){
        self.state.value = .Loading
    }

    public func stopAnimating(){
        self.state.value = .Stopped
    }
    
    public override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        let scrollView = object as! UIScrollView
        if keyPath == "contentOffset" && scrollView.showsPullToRefresh {
            if self.state.value != .Loading{
                let pullNum = scrollView.contentOffset.y + self.originalTopInset
                if !scrollView.dragging && self.state.value == .Triggered {
                    self.state.value = .Loading
                }else if scrollView.dragging && self.state.value == .Pulling && pullNum < -EZPullToRefreshViewHeight {
                    self.state.value = .Triggered
                }else if pullNum <= -1 && pullNum > -EZPullToRefreshViewHeight {
                    self.state.value = .Pulling
                }else if pullNum > -1 {
                    self.state.value = .Stopped
                }
            }
        }
    }
}

private var PullToRefreshViewHandle :UInt8 = 0
extension UIScrollView {
    
    public var pullToRefreshView : EZPullToRefreshView? {
        get{
            if let d: AnyObject = objc_getAssociatedObject(self, &PullToRefreshViewHandle) {
                return d as? EZPullToRefreshView
            }else{
                return nil
            }
        }set (value){
            objc_setAssociatedObject(self, &PullToRefreshViewHandle, value, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    
    var showsPullToRefresh :Bool {
        get{
            return !self.pullToRefreshView!.hidden
        }set(value){
            if value {
                self.addObserver(self.pullToRefreshView!, forKeyPath: "contentOffset", options:NSKeyValueObservingOptions.New, context: nil)
                self.pullToRefreshView?.hidden = false
            }else{
                self.removeObserver(self.pullToRefreshView!, forKeyPath: "contentOffset")
                self.pullToRefreshView?.hidden = true
            }
        }
    }

    public func addPullToRefreshWithActionHandler(customer:UIView? = nil,actionHandler:Void -> ()){
        if self.pullToRefreshView == nil {
            let view = EZPullToRefreshView(frame: CGRectZero)
            view.pullToRefreshActionHandler = actionHandler
            view.originalTopInset = self.contentInset.top;
            view.originalBottomInset = self.contentInset.bottom;
            self.pullToRefreshView = view;
            self.showsPullToRefresh = true;
            self.addSubview(self.pullToRefreshView!)
        }
        if customer == nil {
            self.pullToRefreshView?.setCustomView(PullHeader(scrollView: self))
        }else{
            self.pullToRefreshView?.setCustomView(customer!)
        }
    }
    
    public func triggerPullToRefresh(){
        self.pullToRefreshView?.oldState = .Triggered
        self.pullToRefreshView?.startAnimating()
    }
}

================================================
FILE: Pod/Classes/Easy/Lib/PullRefresh/PullFooter.swift
================================================
//
//  PullFooter.swift
//  Demo
//
//  Created by zhuchao on 15/5/16.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
import Bond

public class PullFooter : Footer {
    var arrowImage:UIImageView!
    var activityView:UIActivityIndicatorView!
    var statusLabel:UILabel!
    
    init (scrollView:UIScrollView){
        super.init(
            scrollView: scrollView,
            frame: CGRectMake(0, 0, scrollView.superview!.size.width, EZInfiniteScrollingViewHeight))
        self.commonInit()
        
        scrollView.infiniteScrollingView!.frame = CGRectMake(0,scrollView.contentSize.height, scrollView.superview!.size.width, EZInfiniteScrollingViewHeight)
        scrollView.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.New, context: nil)
        
        
        scrollView.infiniteScrollingView!.state.observe{state in
            switch (state){
            case .Ended:
                self.arrowImage.hidden = true
                self.activityView.stopAnimating()
                self.statusLabel.text = "没有了哦"
            case .Stopped:
                UIView.animateWithDuration(0.25){ [unowned self] in
                    self.resetScrollViewContentInset(scrollView)
                    self.arrowImage.hidden = false
                    self.activityView.stopAnimating()
                    self.statusLabel.text = "上拉加载"
                    self.arrowImage.transform = CGAffineTransformMakeRotation(CGFloat(M_PI))
                }
            case .Pulling:
                UIView.animateWithDuration(0.25){ [unowned self] in
                    self.arrowImage.hidden = false
                    self.activityView.stopAnimating();
                    self.statusLabel.text = "上拉加载"
                    self.arrowImage.transform = CGAffineTransformMakeRotation(CGFloat(M_PI))
                }
            case .Triggered:
                UIView.animateWithDuration(0.25){ [unowned self] in
                    self.arrowImage.hidden = false;
                    self.activityView.stopAnimating();
                    self.statusLabel.text = "释放加载"
                    self.arrowImage.transform = CGAffineTransformIdentity
                }
            case .Loading:
                UIView.animateWithDuration(0.25){ [unowned self] in
                    self.setScrollViewContentInsetForLoading(scrollView)
                    self.arrowImage.hidden = true;
                    self.activityView.startAnimating();
                    self.statusLabel.text = "正在加载..."
                }
            }
        }
    }
    
    public override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        let scrollView = object as! UIScrollView
        if keyPath == "contentSize" && scrollView.contentSize.height > scrollView.bounds.size.height && scrollView.bounds.size.height > 0  {
            scrollView.infiniteScrollingView!.frame = CGRectMake(0, scrollView.contentSize.height, scrollView.superview!.size.width,EZInfiniteScrollingViewHeight)
        }
    }
    
    
    required public init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.commonInit()
    }
    
    func commonInit(){
        let bundle = NSBundle(forClass: self.dynamicType)
        let url = bundle.URLForResource("EasyIOS-Swift", withExtension: "bundle")
        let imageBundle = NSBundle(URL: url!)
        if imageBundle?.loaded == false {
            imageBundle?.load()
        }
        let arrow = UIImage(contentsOfFile: imageBundle!.pathForResource("arrow-down@2x", ofType: "png")!)
        
        arrowImage = UIImageView(image: arrow)
        arrowImage.autoresizingMask = [UIViewAutoresizing.FlexibleLeftMargin, UIViewAutoresizing.FlexibleRightMargin]
        self.addSubview(arrowImage)
        
        activityView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray)
        activityView.autoresizingMask = arrowImage.autoresizingMask;
        activityView.hidden = true
        self.addSubview(activityView)
        
        statusLabel = UILabel()
        statusLabel.autoresizingMask = UIViewAutoresizing.FlexibleWidth;
        statusLabel.font = UIFont.boldSystemFontOfSize(13);
        statusLabel.textColor = UIColor.blackColor();
        statusLabel.backgroundColor = UIColor.clearColor();
        statusLabel.textAlignment = NSTextAlignment.Center;
        self.addSubview(statusLabel)
        
        arrowImage.snp_makeConstraints(){[unowned self] (make) -> Void in
            make.centerY.equalTo(self.arrowImage.superview!)
        }
        activityView.snp_makeConstraints(){[unowned self] (make) -> Void in
            make.edges.equalTo(self.arrowImage)
        }
        statusLabel.snp_makeConstraints(){[unowned self] (make) -> Void in
            make.leading.equalTo(self.arrowImage).offset(30.0)
            make.center.equalTo(self.statusLabel.superview!)
        }
    }

}

================================================
FILE: Pod/Classes/Easy/Lib/PullRefresh/PullHeader.swift
================================================
//
//  PullHeader.swift
//  Demo
//
//  Created by zhuchao on 15/5/16.
//  Copyright (c) 2015年 zhuchao. All rights reserved.
//

import UIKit
import SnapKit
import Bond

public class PullHeader : Header {
    var arrowImage:UIImageView!
    var activityView:UIActivityIndicatorView!
    var statusLabel:UILabel!
    var lastUpdateTimeLabel:UILabel!
    
    init (scrollView:UIScrollView){
        super.init(
            scrollView: scrollView,
            frame: CGRectMake(0, 0, scrollView.size.width, EZPullToRefreshViewHeight))
        self.common
Download .txt
gitextract_b4h_akqo/

├── .gitignore
├── .travis.yml
├── Demo/
│   ├── Demo/
│   │   ├── AppDelegate.swift
│   │   ├── Base.lproj/
│   │   │   └── LaunchScreen.xib
│   │   ├── CollectionCellViewModel.swift
│   │   ├── CollectionScene.swift
│   │   ├── CollectionSceneModel.swift
│   │   ├── EncodeLoginScene.swift
│   │   ├── FeedRequest.swift
│   │   ├── FlexScene.swift
│   │   ├── FlexXmlScene.swift
│   │   ├── Images.xcassets/
│   │   │   └── AppIcon.appiconset/
│   │   │       └── Contents.json
│   │   ├── Info.plist
│   │   ├── LabelScene.swift
│   │   ├── LoginScene.swift
│   │   ├── MainLabelDeleage.swift
│   │   ├── MainScene.swift
│   │   ├── MainSceneModel.swift
│   │   ├── url.plist
│   │   └── xml.bundle/
│   │       ├── CollectionScene.xml
│   │       ├── EncodeLoginScene.crypto
│   │       ├── FlexXmlScene.xml
│   │       ├── LabelHtml.xml
│   │       ├── LabelScene.xml
│   │       ├── LoginScene.xml
│   │       └── MainScene.xml
│   ├── Demo.xcodeproj/
│   │   ├── project.pbxproj
│   │   └── project.xcworkspace/
│   │       └── contents.xcworkspacedata
│   ├── Demo.xcworkspace/
│   │   └── contents.xcworkspacedata
│   ├── DemoTests/
│   │   ├── DemoTests.swift
│   │   └── Info.plist
│   └── Podfile
├── EasyIOS-Swift.podspec
├── LICENSE
├── Pod/
│   ├── Assets/
│   │   └── .gitkeep
│   └── Classes/
│       ├── .gitkeep
│       ├── Easy/
│       │   ├── Core/
│       │   │   ├── EZAction.swift
│       │   │   ├── EZCollectionView.swift
│       │   │   ├── EZNavigationController.swift
│       │   │   ├── EZRequest.swift
│       │   │   ├── EZScene.swift
│       │   │   ├── EZSceneModel.swift
│       │   │   ├── EZTableView.swift
│       │   │   └── EZViewModel.swift
│       │   └── Lib/
│       │       ├── EZCoreDataManager.swift
│       │       ├── EZExtend+Array.swift
│       │       ├── EZExtend+Bond.swift
│       │       ├── EZExtend+Dictionary.swift
│       │       ├── EZExtend+NSDate.swift
│       │       ├── EZExtend+String.swift
│       │       ├── EZExtend+UIAlertController.swift
│       │       ├── EZExtend+UIButton.swift
│       │       ├── EZExtend+UIFont.swift
│       │       ├── EZExtend+UIImage.swift
│       │       ├── EZExtend+UILabel.swift
│       │       ├── EZExtend+UIView.swift
│       │       ├── EZExtend+UIViewController.swift
│       │       ├── EZKit.swift
│       │       ├── EZPrintln.swift
│       │       ├── EZSystemInfo.swift
│       │       ├── EZWatch.swift
│       │       ├── EasyORM.swift
│       │       ├── NSData+EasyExtend.h
│       │       ├── NSData+EasyExtend.m
│       │       └── PullRefresh/
│       │           ├── EZInfiniteScrolling.swift
│       │           ├── EZPullToRefresh.swift
│       │           ├── PullFooter.swift
│       │           └── PullHeader.swift
│       ├── Extend/
│       │   ├── EUI/
│       │   │   ├── Defines.h
│       │   │   ├── DesEncrypt.h
│       │   │   ├── DesEncrypt.m
│       │   │   ├── ENSObject.swift
│       │   │   ├── EUI+ButtonProperty.swift
│       │   │   ├── EUI+CollectionViewProperty.swift
│       │   │   ├── EUI+ImageProperty.swift
│       │   │   ├── EUI+LabelProperty.swift
│       │   │   ├── EUI+ScrollViewProperty.swift
│       │   │   ├── EUI+TableViewProperty.swift
│       │   │   ├── EUI+TextFieldProperty.swift
│       │   │   ├── EUI+ViewProperty.swift
│       │   │   ├── EUI.swift
│       │   │   ├── EUIExtend+UIView.swift
│       │   │   ├── EUIKit.swift
│       │   │   ├── EUIParse.swift
│       │   │   ├── EUIProperty.swift
│       │   │   ├── EUScene.swift
│       │   │   ├── EZJSCore.swift
│       │   │   ├── NSAttributedString+HTMLStyle.h
│       │   │   ├── NSAttributedString+HTMLStyle.m
│       │   │   ├── StringFormat.swift
│       │   │   ├── SwiftTryCatch.h
│       │   │   ├── SwiftTryCatch.m
│       │   │   ├── UIColor+HTMLColors.h
│       │   │   └── UIColor+HTMLColors.m
│       │   ├── FlexboxKit/
│       │   │   ├── FLEXBOXContainerView.h
│       │   │   ├── FLEXBOXContainerView.m
│       │   │   ├── FLEXBOXNode.h
│       │   │   ├── FLEXBOXNode.m
│       │   │   ├── FlexboxKit.h
│       │   │   ├── Layout.c
│       │   │   ├── Layout.h
│       │   │   ├── UIView+FLEXBOX.h
│       │   │   └── UIView+FLEXBOX.m
│       │   ├── Pinyin/
│       │   │   ├── pinyin.h
│       │   │   └── pinyin.m
│       │   ├── SwiftRegex/
│       │   │   ├── Match.swift
│       │   │   └── Regex.swift
│       │   └── URLManager/
│       │       ├── UIViewController+URLManage.h
│       │       ├── UIViewController+URLManage.m
│       │       ├── URLManager.h
│       │       ├── URLManager.m
│       │       ├── URLNavigation.h
│       │       └── URLNavigation.m
│       └── Private/
│           ├── Gumbo/
│           │   ├── attribute.c
│           │   ├── attribute.h
│           │   ├── char_ref.c
│           │   ├── char_ref.h
│           │   ├── error.c
│           │   ├── error.h
│           │   ├── gumbo.h
│           │   ├── insertion_mode.h
│           │   ├── parser.c
│           │   ├── parser.h
│           │   ├── string_buffer.c
│           │   ├── string_buffer.h
│           │   ├── string_piece.c
│           │   ├── string_piece.h
│           │   ├── tag.c
│           │   ├── token_type.h
│           │   ├── tokenizer.c
│           │   ├── tokenizer.h
│           │   ├── tokenizer_states.h
│           │   ├── utf8.c
│           │   ├── utf8.h
│           │   ├── util.c
│           │   ├── util.h
│           │   ├── vector.c
│           │   └── vector.h
│           └── ObjectiveGumbo/
│               ├── NSString+OGString.h
│               ├── NSString+OGString.m
│               ├── OGDocument.h
│               ├── OGDocument.m
│               ├── OGElement.h
│               ├── OGElement.m
│               ├── OGNode.h
│               ├── OGNode.m
│               ├── OGText.h
│               ├── OGText.m
│               ├── OGUtility.h
│               ├── OGUtility.m
│               ├── ObjectiveGumbo.h
│               └── ObjectiveGumbo.m
├── README/
│   └── Chinese.md
└── README.md
Download .txt
SYMBOL INDEX (443 symbols across 30 files)

FILE: Pod/Classes/Extend/EUI/Defines.h
  type NSInteger (line 225) | typedef long NSInteger;
  type NSUInteger (line 226) | typedef unsigned long NSUInteger;
  type NSInteger (line 228) | typedef int NSInteger;
  type NSUInteger (line 229) | typedef unsigned int NSUInteger;
  type CGFloat (line 240) | typedef double CGFloat;
  type CGFloat (line 245) | typedef float CGFloat;

FILE: Pod/Classes/Extend/EUI/NSAttributedString+HTMLStyle.h
  type NSString (line 11) | typedef NSString QRHTMLAttribute;

FILE: Pod/Classes/Extend/FlexboxKit/Layout.c
  function fmaxf (line 23) | __forceinline const float fmaxf(const float a, const float b) {
  function isUndefined (line 29) | bool isUndefined(float value) {
  function eq (line 33) | static bool eq(float a, float b) {
  function init_css_node (line 40) | void init_css_node(css_node_t *node) {
  function css_node_t (line 80) | css_node_t *new_css_node() {
  function free_css_node (line 86) | void free_css_node(css_node_t *node) {
  function indent (line 90) | static void indent(int n) {
  function print_number_0 (line 96) | static void print_number_0(const char *str, float number) {
  function print_number_nan (line 102) | static void print_number_nan(const char *str, float number) {
  function four_equal (line 108) | static bool four_equal(float four[4]) {
  function print_css_node_rec (line 116) | static void print_css_node_rec(
  function print_css_node (line 244) | void print_css_node(css_node_t *node, css_print_options_t options) {
  function isRowDirection (line 274) | static bool isRowDirection(css_flex_direction_t flex_direction) {
  function isColumnDirection (line 279) | static bool isColumnDirection(css_flex_direction_t flex_direction) {
  function getLeadingMargin (line 284) | static float getLeadingMargin(css_node_t *node, css_flex_direction_t axi...
  function getTrailingMargin (line 292) | static float getTrailingMargin(css_node_t *node, css_flex_direction_t ax...
  function getLeadingPadding (line 300) | static float getLeadingPadding(css_node_t *node, css_flex_direction_t ax...
  function getTrailingPadding (line 314) | static float getTrailingPadding(css_node_t *node, css_flex_direction_t a...
  function getLeadingBorder (line 328) | static float getLeadingBorder(css_node_t *node, css_flex_direction_t axi...
  function getTrailingBorder (line 342) | static float getTrailingBorder(css_node_t *node, css_flex_direction_t ax...
  function getLeadingPaddingAndBorder (line 356) | static float getLeadingPaddingAndBorder(css_node_t *node, css_flex_direc...
  function getTrailingPaddingAndBorder (line 360) | static float getTrailingPaddingAndBorder(css_node_t *node, css_flex_dire...
  function getBorderAxis (line 364) | static float getBorderAxis(css_node_t *node, css_flex_direction_t axis) {
  function getMarginAxis (line 368) | static float getMarginAxis(css_node_t *node, css_flex_direction_t axis) {
  function getPaddingAndBorderAxis (line 372) | static float getPaddingAndBorderAxis(css_node_t *node, css_flex_directio...
  function css_position_type_t (line 376) | static css_position_type_t getPositionType(css_node_t *node) {
  function css_justify_t (line 380) | static css_justify_t getJustifyContent(css_node_t *node) {
  function css_align_t (line 384) | static css_align_t getAlignContent(css_node_t *node) {
  function css_align_t (line 388) | static css_align_t getAlignItem(css_node_t *node, css_node_t *child) {
  function css_direction_t (line 395) | static css_direction_t resolveDirection(css_node_t *node, css_direction_...
  function css_flex_direction_t (line 405) | static css_flex_direction_t getFlexDirection(css_node_t *node) {
  function css_flex_direction_t (line 409) | static css_flex_direction_t resolveAxis(css_flex_direction_t flex_direct...
  function css_flex_direction_t (line 421) | static css_flex_direction_t getCrossFlexDirection(css_flex_direction_t f...
  function getFlex (line 429) | static float getFlex(css_node_t *node) {
  function isFlex (line 433) | static bool isFlex(css_node_t *node) {
  function isFlexWrap (line 440) | static bool isFlexWrap(css_node_t *node) {
  function getDimWithMargin (line 444) | static float getDimWithMargin(css_node_t *node, css_flex_direction_t axi...
  function isDimDefined (line 450) | static bool isDimDefined(css_node_t *node, css_flex_direction_t axis) {
  function isPosDefined (line 455) | static bool isPosDefined(css_node_t *node, css_position_t position) {
  function isMeasureDefined (line 459) | static bool isMeasureDefined(css_node_t *node) {
  function getPosition (line 463) | static float getPosition(css_node_t *node, css_position_t position) {
  function boundAxis (line 471) | static float boundAxis(css_node_t *node, css_flex_direction_t axis, floa...
  function setDimensionFromStyle (line 496) | static void setDimensionFromStyle(css_node_t *node, css_flex_direction_t...
  function setTrailingPosition (line 513) | static void setTrailingPosition(css_node_t *node, css_node_t *child, css...
  function getRelativePosition (line 520) | static float getRelativePosition(css_node_t *node, css_flex_direction_t ...
  function layoutNodeImpl (line 528) | static void layoutNodeImpl(css_node_t *node, float parentMaxWidth, css_d...
  function layoutNode (line 1111) | void layoutNode(css_node_t *node, float parentMaxWidth, css_direction_t ...

FILE: Pod/Classes/Extend/FlexboxKit/Layout.h
  type css_direction_t (line 26) | typedef enum {
  type css_flex_direction_t (line 32) | typedef enum {
  type css_justify_t (line 39) | typedef enum {
  type css_align_t (line 49) | typedef enum {
  type css_position_type_t (line 57) | typedef enum {
  type css_wrap_type_t (line 62) | typedef enum {
  type css_position_t (line 69) | typedef enum {
  type css_dimension_t (line 79) | typedef enum {
  type css_layout_t (line 84) | typedef struct {
  type css_dim_t (line 99) | typedef struct {
  type css_style_t (line 103) | typedef struct {
  type css_node_t (line 132) | typedef struct css_node {
  type css_print_options_t (line 152) | typedef enum {

FILE: Pod/Classes/Private/Gumbo/attribute.c
  type GumboInternalParser (line 26) | struct GumboInternalParser
  function GumboAttribute (line 28) | GumboAttribute* gumbo_get_attribute(
  function gumbo_destroy_attribute (line 39) | void gumbo_destroy_attribute(

FILE: Pod/Classes/Private/Gumbo/attribute.h
  type GumboInternalParser (line 26) | struct GumboInternalParser
  type GumboInternalParser (line 31) | struct GumboInternalParser

FILE: Pod/Classes/Private/Gumbo/char_ref.c
  type GumboInternalParser (line 29) | struct GumboInternalParser
  type NamedCharRef (line 44) | typedef struct {
  type CharReplacement (line 2296) | typedef struct {
  function parse_digit (line 2340) | static int parse_digit(int c, bool allow_hex) {
  function add_no_digit_error (line 2353) | static void add_no_digit_error(
  function add_codepoint_error (line 2363) | static void add_codepoint_error(
  function add_named_reference_error (line 2375) | static void add_named_reference_error(
  function maybe_replace_codepoint (line 2387) | static int maybe_replace_codepoint(int codepoint) {
  function consume_numeric_ref (line 2396) | static bool consume_numeric_ref(
  function NamedCharRef (line 2457) | static const NamedCharRef* find_named_char_ref(Utf8Iterator* input) {
  function is_legal_attribute_char_next (line 2472) | static bool is_legal_attribute_char_next(Utf8Iterator* input) {
  function maybe_add_invalid_named_reference (line 2477) | static bool maybe_add_invalid_named_reference(
  function consume_named_ref (line 2500) | static bool consume_named_ref(
  function consume_char_ref (line 2532) | bool consume_char_ref(

FILE: Pod/Classes/Private/Gumbo/char_ref.h
  type GumboInternalParser (line 30) | struct GumboInternalParser
  type GumboInternalUtf8Iterator (line 31) | struct GumboInternalUtf8Iterator
  type OneOrTwoCodepoints (line 41) | typedef struct {
  type GumboInternalParser (line 53) | struct GumboInternalParser
  type GumboInternalUtf8Iterator (line 53) | struct GumboInternalUtf8Iterator

FILE: Pod/Classes/Private/Gumbo/error.c
  function print_message (line 35) | static int print_message(GumboParser* parser, GumboStringBuffer* output,
  function print_tag_stack (line 54) | static void print_tag_stack(
  function handle_parser_error (line 68) | static void handle_parser_error(GumboParser* parser,
  function GumboError (line 136) | GumboError* gumbo_add_error(GumboParser* parser) {
  function gumbo_error_to_string (line 146) | void gumbo_error_to_string(
  function gumbo_caret_diagnostic_to_string (line 205) | void gumbo_caret_diagnostic_to_string(
  function gumbo_print_caret_diagnostic (line 230) | void gumbo_print_caret_diagnostic(
  function gumbo_error_destroy (line 239) | void gumbo_error_destroy(GumboParser* parser, GumboError* error) {
  function gumbo_init_errors (line 249) | void gumbo_init_errors(GumboParser* parser) {
  function gumbo_destroy_errors (line 253) | void gumbo_destroy_errors(GumboParser* parser) {

FILE: Pod/Classes/Private/Gumbo/error.h
  type GumboInternalParser (line 33) | struct GumboInternalParser
  type GumboErrorType (line 35) | typedef enum {
  type GumboDuplicateAttrError (line 81) | typedef struct GumboInternalDuplicateAttrError {
  type GumboTokenizerErrorState (line 97) | typedef enum {
  type GumboTokenizerError (line 117) | typedef struct GumboInternalTokenizerError {
  type GumboParserError (line 126) | typedef struct GumboInternalParserError {
  type GumboError (line 145) | typedef struct GumboInternalError {
  type GumboInternalParser (line 186) | struct GumboInternalParser
  type GumboInternalParser (line 189) | struct GumboInternalParser
  type GumboInternalParser (line 192) | struct GumboInternalParser
  type GumboInternalParser (line 195) | struct GumboInternalParser
  type GumboInternalParser (line 203) | struct GumboInternalParser
  type GumboInternalParser (line 212) | struct GumboInternalParser
  type GumboInternalParser (line 218) | struct GumboInternalParser

FILE: Pod/Classes/Private/Gumbo/gumbo.h
  type GumboSourcePosition (line 62) | typedef struct {
  type GumboStringPiece (line 84) | typedef struct {
  type GumboVector (line 119) | typedef struct {
  type GumboTag (line 154) | typedef enum {
  type GumboAttributeNamespaceEnum (line 368) | typedef enum {
  type GumboAttribute (line 380) | typedef struct {
  type GumboNodeType (line 447) | typedef enum {
  type GumboNode (line 466) | typedef struct GumboInternalNode GumboNode;
  type GumboQuirksModeEnum (line 469) | typedef enum {
  type GumboNamespaceEnum (line 482) | typedef enum {
  type GumboParseFlags (line 496) | typedef enum {
  type GumboDocument (line 570) | typedef struct {
  type GumboText (line 597) | typedef struct {
  type GumboElement (line 621) | typedef struct {
  type GumboInternalNode (line 666) | struct GumboInternalNode {
  type GumboOptions (line 712) | typedef struct GumboInternalOptions {
  type GumboOutput (line 751) | typedef struct GumboInternalOutput {

FILE: Pod/Classes/Private/Gumbo/insertion_mode.h
  type GumboInsertionMode (line 25) | typedef enum {

FILE: Pod/Classes/Private/Gumbo/parser.c
  function free_wrapper (line 45) | static void free_wrapper(void* unused, void* ptr) {
  type ReplacementEntry (line 175) | typedef struct _ReplacementEntry {
  type NamespacedAttributeReplacement (line 289) | typedef struct _NamespacedAttributeReplacement {
  type TextNodeBufferState (line 325) | typedef struct _TextNodeBufferState {
  type GumboParserState (line 343) | typedef struct GumboInternalParserState {
  function token_has_attribute (line 399) | static bool token_has_attribute(const GumboToken* token, const char* nam...
  function attribute_matches (line 406) | static bool attribute_matches(
  function attribute_matches_case_sensitive (line 414) | static bool attribute_matches_case_sensitive(
  function all_attributes_match (line 421) | static bool all_attributes_match(
  function set_frameset_not_ok (line 435) | static void set_frameset_not_ok(GumboParser* parser) {
  function GumboNode (line 440) | static GumboNode* create_node(GumboParser* parser, GumboNodeType type) {
  function GumboNode (line 449) | static GumboNode* new_document_node(GumboParser* parser) {
  function output_init (line 465) | static void output_init(GumboParser* parser) {
  function parser_state_init (line 473) | static void parser_state_init(GumboParser* parser) {
  function parser_state_destroy (line 493) | static void parser_state_destroy(GumboParser* parser) {
  function GumboNode (line 501) | static GumboNode* get_document_node(GumboParser* parser) {
  function GumboNode (line 507) | static GumboNode* get_current_node(GumboParser* parser) {
  function is_in_static_list (line 523) | static bool is_in_static_list(
  function set_insertion_mode (line 534) | static void set_insertion_mode(GumboParser* parser, GumboInsertionMode m...
  function GumboInsertionMode (line 543) | static GumboInsertionMode get_appropriate_insertion_mode(
  function reset_insertion_mode_appropriately (line 579) | static void reset_insertion_mode_appropriately(GumboParser* parser) {
  function GumboError (line 594) | static GumboError* add_parse_error(GumboParser* parser, const GumboToken...
  function tag_in (line 634) | static bool tag_in(const GumboToken* token, bool is_start, ...) {
  function tag_is (line 659) | static bool tag_is(const GumboToken* token, bool is_start, GumboTag tag) {
  function node_tag_in (line 670) | static bool node_tag_in(const GumboNode* node, ...) {
  function node_tag_is (line 693) | static bool node_tag_is(const GumboNode* node, GumboTag tag) {
  function is_mathml_integration_point (line 698) | static bool is_mathml_integration_point(const GumboNode* node) {
  function is_html_integration_point (line 705) | static bool is_html_integration_point(const GumboNode* node) {
  function append_node (line 718) | static void append_node(
  function insert_node (line 737) | static void insert_node(
  function foster_parent_element (line 757) | static void foster_parent_element(GumboParser* parser, GumboNode* node) {
  function maybe_flush_text_node_buffer (line 795) | static void maybe_flush_text_node_buffer(GumboParser* parser) {
  function record_end_of_element (line 831) | static void record_end_of_element(
  function GumboNode (line 839) | static GumboNode* pop_current_node(GumboParser* parser) {
  function append_comment_node (line 868) | static void append_comment_node(
  function clear_stack_to_table_row_context (line 881) | static void clear_stack_to_table_row_context(GumboParser* parser) {
  function clear_stack_to_table_context (line 889) | static void clear_stack_to_table_context(GumboParser* parser) {
  function clear_stack_to_table_body_context (line 897) | void clear_stack_to_table_body_context(GumboParser* parser) {
  function GumboNode (line 906) | static GumboNode* create_element(GumboParser* parser, GumboTag tag) {
  function GumboNode (line 921) | static GumboNode* create_element_from_token(
  function insert_element (line 948) | static void insert_element(GumboParser* parser, GumboNode* node,
  function GumboNode (line 983) | static GumboNode* insert_element_from_token(
  function GumboNode (line 996) | static GumboNode* insert_element_of_tag_type(
  function GumboNode (line 1008) | static GumboNode* insert_foreign_element(
  function insert_text_token (line 1030) | static void insert_text_token(GumboParser* parser, GumboToken* token) {
  function run_generic_parsing_algorithm (line 1048) | static void run_generic_parsing_algorithm(
  function acknowledge_self_closing_tag (line 1057) | static void acknowledge_self_closing_tag(GumboParser* parser) {
  function find_last_anchor_index (line 1063) | static bool find_last_anchor_index(GumboParser* parser, int* anchor_inde...
  function count_formatting_elements_of_tag (line 1082) | static int count_formatting_elements_of_tag(
  function add_formatting_element (line 1107) | static void add_formatting_element(GumboParser* parser, const GumboNode*...
  function is_open_element (line 1132) | static bool is_open_element(GumboParser* parser, const GumboNode* node) {
  function GumboNode (line 1145) | GumboNode* clone_node(
  function reconstruct_active_formatting_elements (line 1177) | static void reconstruct_active_formatting_elements(GumboParser* parser) {
  function clear_active_formatting_elements (line 1225) | static void clear_active_formatting_elements(GumboParser* parser) {
  function GumboQuirksModeEnum (line 1238) | static GumboQuirksModeEnum compute_quirks_mode(
  function has_an_element_in_specific_scope (line 1272) | static bool has_an_element_in_specific_scope(
  function has_an_element_in_scope (line 1335) | static bool has_an_element_in_scope(GumboParser* parser, GumboTag tag) {
  function has_node_in_scope (line 1351) | static bool has_node_in_scope(GumboParser* parser, const GumboNode* node) {
  function has_an_element_in_scope_with_tagname (line 1377) | static bool has_an_element_in_scope_with_tagname(GumboParser* parser, .....
  function has_an_element_in_list_scope (line 1400) | static bool has_an_element_in_list_scope(GumboParser* parser, GumboTag t...
  function has_an_element_in_button_scope (line 1412) | static bool has_an_element_in_button_scope(GumboParser* parser, GumboTag...
  function has_an_element_in_table_scope (line 1423) | static bool has_an_element_in_table_scope(GumboParser* parser, GumboTag ...
  function has_an_element_in_select_scope (line 1430) | static bool has_an_element_in_select_scope(GumboParser* parser, GumboTag...
  function generate_implied_end_tags (line 1441) | static void generate_implied_end_tags(GumboParser* parser, GumboTag exce...
  function close_table (line 1454) | static bool close_table(GumboParser* parser) {
  function close_table_cell (line 1469) | static bool close_table_cell(GumboParser* parser, const GumboToken* token,
  function close_current_cell (line 1489) | static bool close_current_cell(GumboParser* parser, const GumboToken* to...
  function close_current_select (line 1503) | static void close_current_select(GumboParser* parser) {
  function is_special_node (line 1513) | static bool is_special_node(const GumboNode* node) {
  function implicitly_close_tags (line 1556) | static bool implicitly_close_tags(
  function maybe_implicitly_close_p_tag (line 1576) | static bool maybe_implicitly_close_p_tag(GumboParser* parser, GumboToken...
  function maybe_implicitly_close_list_tag (line 1585) | static void maybe_implicitly_close_list_tag(
  function merge_attributes (line 1606) | static void merge_attributes(
  function adjust_foreign_attributes (line 1650) | static void adjust_foreign_attributes(GumboParser* parser, GumboToken* t...
  function adjust_svg_attributes (line 1670) | static void adjust_svg_attributes(GumboParser* parser, GumboToken* token) {
  function adjust_mathml_attributes (line 1688) | static void adjust_mathml_attributes(GumboParser* parser, GumboToken* to...
  function doctype_matches (line 1699) | static bool doctype_matches(
  function maybe_add_doctype_error (line 1709) | static bool maybe_add_doctype_error(
  function remove_from_parent (line 1731) | static void remove_from_parent(GumboParser* parser, GumboNode* node) {
  function adoption_agency_algorithm (line 1755) | static bool adoption_agency_algorithm(
  function ignore_token (line 1967) | static void ignore_token(GumboParser* parser) {
  function finish_parsing (line 1984) | static void finish_parsing(GumboParser* parser) {
  function handle_initial (line 1998) | static bool handle_initial(GumboParser* parser, GumboToken* token) {
  function handle_before_html (line 2023) | static bool handle_before_html(GumboParser* parser, GumboToken* token) {
  function handle_before_head (line 2057) | static bool handle_before_head(GumboParser* parser, GumboToken* token) {
  function handle_in_head (line 2094) | static bool handle_in_head(GumboParser* parser, GumboToken* token) {
  function handle_in_head_noscript (line 2166) | static bool handle_in_head_noscript(GumboParser* parser, GumboToken* tok...
  function handle_after_head (line 2203) | static bool handle_after_head(GumboParser* parser, GumboToken* token) {
  function destroy_node (line 2254) | static void destroy_node(GumboParser* parser, GumboNode* node) {
  function handle_in_body (line 2289) | static bool handle_in_body(GumboParser* parser, GumboToken* token) {
  function handle_text (line 2899) | static bool handle_text(GumboParser* parser, GumboToken* token) {
  function handle_in_table (line 2921) | static bool handle_in_table(GumboParser* parser, GumboToken* token) {
  function handle_in_table_text (line 3031) | static bool handle_in_table_text(GumboParser* parser, GumboToken* token) {
  function handle_in_caption (line 3064) | static bool handle_in_caption(GumboParser* parser, GumboToken* token) {
  function handle_in_column_group (line 3106) | static bool handle_in_column_group(GumboParser* parser, GumboToken* toke...
  function handle_in_table_body (line 3147) | static bool handle_in_table_body(GumboParser* parser, GumboToken* token) {
  function handle_in_row (line 3201) | static bool handle_in_row(GumboParser* parser, GumboToken* token) {
  function handle_in_cell (line 3253) | static bool handle_in_cell(GumboParser* parser, GumboToken* token) {
  function handle_in_select (line 3297) | static bool handle_in_select(GumboParser* parser, GumboToken* token) {
  function handle_in_select_in_table (line 3393) | static bool handle_in_select_in_table(GumboParser* parser, GumboToken* t...
  function handle_after_body (line 3419) | static bool handle_after_body(GumboParser* parser, GumboToken* token) {
  function handle_in_frameset (line 3451) | static bool handle_in_frameset(GumboParser* parser, GumboToken* token) {
  function handle_after_frameset (line 3501) | static bool handle_after_frameset(GumboParser* parser, GumboToken* token) {
  function handle_after_after_body (line 3529) | static bool handle_after_after_body(GumboParser* parser, GumboToken* tok...
  function handle_after_after_frameset (line 3548) | static bool handle_after_after_frameset(
  function handle_html_content (line 3596) | static bool handle_html_content(GumboParser* parser, GumboToken* token) {
  function handle_in_foreign_content (line 3602) | static bool handle_in_foreign_content(GumboParser* parser, GumboToken* t...
  function handle_token (line 3726) | static bool handle_token(GumboParser* parser, GumboToken* token) {
  function GumboOutput (line 3776) | GumboOutput* gumbo_parse(const char* buffer) {
  function GumboOutput (line 3781) | GumboOutput* gumbo_parse_with_options(
  function gumbo_destroy_node (line 3874) | void gumbo_destroy_node(GumboOptions* options, GumboNode* node) {
  function gumbo_destroy_output (line 3882) | void gumbo_destroy_output(const GumboOptions* options, GumboOutput* outp...

FILE: Pod/Classes/Private/Gumbo/parser.h
  type GumboInternalParserState (line 27) | struct GumboInternalParserState
  type GumboInternalOutput (line 28) | struct GumboInternalOutput
  type GumboInternalOptions (line 29) | struct GumboInternalOptions
  type GumboInternalTokenizerState (line 30) | struct GumboInternalTokenizerState
  type GumboParser (line 35) | typedef struct GumboInternalParser {

FILE: Pod/Classes/Private/Gumbo/string_buffer.c
  type GumboInternalParser (line 27) | struct GumboInternalParser
  function maybe_resize_string_buffer (line 31) | static void maybe_resize_string_buffer(
  function gumbo_string_buffer_init (line 48) | void gumbo_string_buffer_init(
  function gumbo_string_buffer_reserve (line 55) | void gumbo_string_buffer_reserve(
  function gumbo_string_buffer_append_codepoint (line 61) | void gumbo_string_buffer_append_codepoint(
  function gumbo_string_buffer_append_string (line 87) | void gumbo_string_buffer_append_string(
  type GumboInternalParser (line 96) | struct GumboInternalParser
  function gumbo_string_buffer_destroy (line 103) | void gumbo_string_buffer_destroy(

FILE: Pod/Classes/Private/Gumbo/string_buffer.h
  type GumboInternalParser (line 29) | struct GumboInternalParser
  type GumboStringBuffer (line 36) | typedef struct {
  type GumboInternalParser (line 49) | struct GumboInternalParser
  type GumboInternalParser (line 55) | struct GumboInternalParser
  type GumboInternalParser (line 62) | struct GumboInternalParser
  type GumboInternalParser (line 66) | struct GumboInternalParser
  type GumboInternalParser (line 71) | struct GumboInternalParser
  type GumboInternalParser (line 75) | struct GumboInternalParser

FILE: Pod/Classes/Private/Gumbo/string_piece.c
  type GumboInternalParser (line 26) | struct GumboInternalParser
  function gumbo_string_equals (line 30) | bool gumbo_string_equals(
  function gumbo_string_equals_ignore_case (line 36) | bool gumbo_string_equals_ignore_case(
  function gumbo_string_copy (line 42) | void gumbo_string_copy(

FILE: Pod/Classes/Private/Gumbo/string_piece.h
  type GumboInternalParser (line 26) | struct GumboInternalParser
  type GumboInternalParser (line 32) | struct GumboInternalParser

FILE: Pod/Classes/Private/Gumbo/tag.c
  function gumbo_tag_from_original_text (line 184) | void gumbo_tag_from_original_text(GumboStringPiece* text) {
  function GumboTag (line 212) | GumboTag gumbo_tag_enum(const char* tagname) {

FILE: Pod/Classes/Private/Gumbo/token_type.h
  type GumboTokenType (line 25) | typedef enum {

FILE: Pod/Classes/Private/Gumbo/tokenizer.c
  type StateResult (line 70) | typedef enum {
  type GumboTagState (line 78) | typedef struct GumboInternalTagState {
  type GumboTokenizerState (line 124) | typedef struct GumboInternalTokenizerState {
  function add_parse_error (line 199) | static void add_parse_error(GumboParser* parser, GumboErrorType type) {
  function is_alpha (line 307) | static bool is_alpha(int c) {
  function ensure_lowercase (line 314) | static int ensure_lowercase(int c) {
  function GumboTokenType (line 318) | static GumboTokenType get_char_token_type(int c) {
  function clear_temporary_buffer (line 347) | static void clear_temporary_buffer(GumboParser* parser) {
  function append_char_to_temporary_buffer (line 360) | static void append_char_to_temporary_buffer(
  function temporary_buffer_equals (line 369) | static bool temporary_buffer_equals(
  function doc_type_state_init (line 381) | static void doc_type_state_init(GumboParser* parser) {
  function reset_token_start_point (line 400) | static void reset_token_start_point(GumboTokenizerState* tokenizer) {
  function reset_tag_buffer_start_point (line 409) | static void reset_tag_buffer_start_point(GumboParser* parser) {
  function finish_temporary_buffer (line 419) | static void finish_temporary_buffer(GumboParser* parser, const char** ou...
  function finish_token (line 434) | static void finish_token(GumboParser* parser, GumboToken* token) {
  function finish_doctype_public_id (line 457) | static void finish_doctype_public_id(GumboParser* parser) {
  function finish_doctype_system_id (line 467) | static void finish_doctype_system_id(GumboParser* parser) {
  function emit_char (line 476) | static void emit_char(GumboParser* parser, int c, GumboToken* output) {
  function StateResult (line 484) | static StateResult emit_replacement_char(
  function StateResult (line 493) | static StateResult emit_eof(GumboParser* parser, GumboToken* output) {
  function emit_current_char (line 500) | static bool emit_current_char(GumboParser* parser, GumboToken* output) {
  function emit_doctype (line 507) | static void emit_doctype(GumboParser* parser, GumboToken* output) {
  function mark_tag_state_as_empty (line 516) | static void mark_tag_state_as_empty(GumboTagState* tag_state) {
  function StateResult (line 524) | static StateResult emit_current_tag(GumboParser* parser, GumboToken* out...
  function abandon_current_tag (line 563) | static void abandon_current_tag(GumboParser* parser) {
  function StateResult (line 577) | static StateResult emit_char_ref(
  function StateResult (line 599) | static StateResult emit_comment(GumboParser* parser, GumboToken* output) {
  function maybe_emit_from_temporary_buffer (line 611) | static bool maybe_emit_from_temporary_buffer(
  function emit_temporary_buffer (line 643) | static bool emit_temporary_buffer(
  function append_char_to_tag_buffer (line 657) | static void append_char_to_tag_buffer(GumboParser* parser, int codepoint,
  function initialize_tag_buffer (line 668) | static void initialize_tag_buffer(GumboParser* parser) {
  function start_new_tag (line 679) | static void start_new_tag(GumboParser* parser, bool is_start_tag) {
  function copy_over_tag_buffer (line 699) | static void copy_over_tag_buffer(GumboParser* parser, const char** outpu...
  function copy_over_original_tag_text (line 711) | static void copy_over_original_tag_text(
  function reinitialize_tag_buffer (line 733) | static void reinitialize_tag_buffer(GumboParser* parser) {
  function finish_tag_name (line 741) | static void finish_tag_name(GumboParser* parser) {
  function add_duplicate_attr_error (line 753) | static void add_duplicate_attr_error(GumboParser* parser, const char* at...
  function finish_attribute_name (line 775) | static bool finish_attribute_name(GumboParser* parser) {
  function finish_attribute_value (line 812) | static void finish_attribute_value(GumboParser* parser) {
  function is_appropriate_end_tag (line 831) | static bool is_appropriate_end_tag(GumboParser* parser) {
  function gumbo_tokenizer_state_init (line 843) | void gumbo_tokenizer_state_init(
  function gumbo_tokenizer_state_destroy (line 866) | void gumbo_tokenizer_state_destroy(GumboParser* parser) {
  function gumbo_tokenizer_set_state (line 876) | void gumbo_tokenizer_set_state(GumboParser* parser, GumboTokenizerEnum s...
  function gumbo_tokenizer_set_is_current_node_foreign (line 880) | void gumbo_tokenizer_set_is_current_node_foreign(
  function StateResult (line 890) | static StateResult handle_data_state(
  function StateResult (line 916) | static StateResult handle_char_ref_in_data_state(
  function StateResult (line 924) | static StateResult handle_rcdata_state(
  function StateResult (line 947) | static StateResult handle_char_ref_in_rcdata_state(
  function StateResult (line 955) | static StateResult handle_rawtext_state(
  function StateResult (line 974) | static StateResult handle_script_state(
  function StateResult (line 993) | static StateResult handle_plaintext_state(
  function StateResult (line 1007) | static StateResult handle_tag_open_state(
  function StateResult (line 1041) | static StateResult handle_end_tag_open_state(
  function StateResult (line 1069) | static StateResult handle_tag_name_state(
  function StateResult (line 1104) | static StateResult handle_rcdata_lt_state(
  function StateResult (line 1120) | static StateResult handle_rcdata_end_tag_open_state(
  function StateResult (line 1137) | static StateResult handle_rcdata_end_tag_name_state(
  function StateResult (line 1170) | static StateResult handle_rawtext_lt_state(
  function StateResult (line 1186) | static StateResult handle_rawtext_end_tag_open_state(
  function StateResult (line 1202) | static StateResult handle_rawtext_end_tag_name_state(
  function StateResult (line 1238) | static StateResult handle_script_lt_state(
  function StateResult (line 1258) | static StateResult handle_script_end_tag_open_state(
  function StateResult (line 1274) | static StateResult handle_script_end_tag_name_state(
  function StateResult (line 1307) | static StateResult handle_script_escaped_start_state(
  function StateResult (line 1321) | static StateResult handle_script_escaped_start_dash_state(
  function StateResult (line 1335) | static StateResult handle_script_escaped_state(
  function StateResult (line 1358) | static StateResult handle_script_escaped_dash_state(
  function StateResult (line 1384) | static StateResult handle_script_escaped_dash_dash_state(
  function StateResult (line 1412) | static StateResult handle_script_escaped_lt_state(
  function StateResult (line 1434) | static StateResult handle_script_escaped_end_tag_open_state(
  function StateResult (line 1450) | static StateResult handle_script_escaped_end_tag_name_state(
  function StateResult (line 1483) | static StateResult handle_script_double_escaped_start_state(
  function StateResult (line 1511) | static StateResult handle_script_double_escaped_state(
  function StateResult (line 1533) | static StateResult handle_script_double_escaped_dash_state(
  function StateResult (line 1558) | static StateResult handle_script_double_escaped_dash_dash_state(
  function StateResult (line 1584) | static StateResult handle_script_double_escaped_lt_state(
  function StateResult (line 1601) | static StateResult handle_script_double_escaped_end_state(
  function StateResult (line 1629) | static StateResult handle_before_attr_name_state(
  function StateResult (line 1668) | static StateResult handle_attr_name_state(
  function StateResult (line 1712) | static StateResult handle_after_attr_name_state(
  function StateResult (line 1753) | static StateResult handle_before_attr_value_state(
  function StateResult (line 1803) | static StateResult handle_attr_value_double_quoted_state(
  function StateResult (line 1832) | static StateResult handle_attr_value_single_quoted_state(
  function StateResult (line 1861) | static StateResult handle_attr_value_unquoted_state(
  function StateResult (line 1905) | static StateResult handle_char_ref_in_attr_value_state(
  function StateResult (line 1948) | static StateResult handle_after_attr_value_quoted_state(
  function StateResult (line 1980) | static StateResult handle_self_closing_start_tag_state(
  function StateResult (line 2002) | static StateResult handle_bogus_comment_state(
  function StateResult (line 2018) | static StateResult handle_markup_declaration_state(
  function StateResult (line 2053) | static StateResult handle_comment_start_state(
  function StateResult (line 2083) | static StateResult handle_comment_start_dash_state(
  function StateResult (line 2115) | static StateResult handle_comment_state(
  function StateResult (line 2138) | static StateResult handle_comment_end_dash_state(
  function StateResult (line 2165) | static StateResult handle_comment_end_state(
  function StateResult (line 2203) | static StateResult handle_comment_end_bang_state(
  function StateResult (line 2240) | static StateResult handle_doctype_state(
  function StateResult (line 2267) | static StateResult handle_before_doctype_name_state(
  function StateResult (line 2303) | static StateResult handle_doctype_name_state(
  function StateResult (line 2345) | static StateResult handle_after_doctype_name_state(
  function StateResult (line 2385) | static StateResult handle_after_doctype_public_keyword_state(
  function StateResult (line 2430) | static StateResult handle_before_doctype_public_id_state(
  function StateResult (line 2471) | static StateResult handle_doctype_public_id_double_quoted_state(
  function StateResult (line 2504) | static StateResult handle_doctype_public_id_single_quoted_state(
  function StateResult (line 2537) | static StateResult handle_after_doctype_public_id_state(
  function StateResult (line 2579) | static StateResult handle_between_doctype_public_system_id_state(
  function StateResult (line 2618) | static StateResult handle_after_doctype_system_keyword_state(
  function StateResult (line 2661) | static StateResult handle_before_doctype_system_id_state(
  function StateResult (line 2701) | static StateResult handle_doctype_system_id_double_quoted_state(
  function StateResult (line 2734) | static StateResult handle_doctype_system_id_single_quoted_state(
  function StateResult (line 2767) | static StateResult handle_after_doctype_system_id_state(
  function StateResult (line 2794) | static StateResult handle_bogus_doctype_state(
  function StateResult (line 2806) | static StateResult handle_cdata_state(
  type StateResult (line 2820) | typedef StateResult (*GumboLexerStateFunction)(
  function gumbo_lex (line 2894) | bool gumbo_lex(GumboParser* parser, GumboToken* output) {
  function gumbo_token_destroy (line 2950) | void gumbo_token_destroy(GumboParser* parser, GumboToken* token) {

FILE: Pod/Classes/Private/Gumbo/tokenizer.h
  type GumboInternalParser (line 34) | struct GumboInternalParser
  type GumboTokenDocType (line 37) | typedef struct GumboInternalTokenDocType {
  type GumboTokenStartTag (line 50) | typedef struct GumboInternalTokenStartTag {
  type GumboToken (line 59) | typedef struct GumboInternalToken {
  type GumboInternalParser (line 75) | struct GumboInternalParser
  type GumboInternalParser (line 79) | struct GumboInternalParser
  type GumboInternalParser (line 85) | struct GumboInternalParser
  type GumboInternalParser (line 92) | struct GumboInternalParser
  type GumboInternalParser (line 107) | struct GumboInternalParser
  type GumboInternalParser (line 117) | struct GumboInternalParser

FILE: Pod/Classes/Private/Gumbo/tokenizer_states.h
  type GumboTokenizerEnum (line 32) | typedef enum {

FILE: Pod/Classes/Private/Gumbo/utf8.c
  function add_error (line 40) | static void add_error(Utf8Iterator* iter, GumboErrorType type) {
  function read_char (line 65) | static void read_char(Utf8Iterator* iter) {
  function update_position (line 172) | static void update_position(Utf8Iterator* iter) {
  function utf8_is_invalid_code_point (line 187) | bool utf8_is_invalid_code_point(int c) {
  function utf8iterator_init (line 193) | void utf8iterator_init(
  function utf8iterator_next (line 210) | void utf8iterator_next(Utf8Iterator* iter) {
  function utf8iterator_current (line 222) | int utf8iterator_current(const Utf8Iterator* iter) {
  function utf8iterator_get_position (line 226) | void utf8iterator_get_position(
  function utf8iterator_maybe_consume_match (line 235) | bool utf8iterator_maybe_consume_match(
  function utf8iterator_mark (line 251) | void utf8iterator_mark(Utf8Iterator* iter) {
  function utf8iterator_reset (line 257) | void utf8iterator_reset(Utf8Iterator* iter) {
  function utf8iterator_fill_error_at_mark (line 265) | void utf8iterator_fill_error_at_mark(

FILE: Pod/Classes/Private/Gumbo/utf8.h
  type GumboInternalError (line 44) | struct GumboInternalError
  type GumboInternalParser (line 45) | struct GumboInternalParser
  type Utf8Iterator (line 50) | typedef struct GumboInternalUtf8Iterator {
  type GumboInternalParser (line 85) | struct GumboInternalParser
  type GumboInternalError (line 122) | struct GumboInternalError

FILE: Pod/Classes/Private/Gumbo/util.c
  function gumbo_parser_deallocate (line 38) | void gumbo_parser_deallocate(GumboParser* parser, void* ptr) {
  function gumbo_debug (line 50) | void gumbo_debug(const char* format, ...) {

FILE: Pod/Classes/Private/Gumbo/util.h
  type GumboInternalParser (line 32) | struct GumboInternalParser
  type GumboInternalParser (line 39) | struct GumboInternalParser
  type GumboInternalParser (line 44) | struct GumboInternalParser
  type GumboInternalParser (line 48) | struct GumboInternalParser

FILE: Pod/Classes/Private/Gumbo/vector.c
  type GumboInternalParser (line 26) | struct GumboInternalParser
  function gumbo_vector_init (line 30) | void gumbo_vector_init(
  function gumbo_vector_destroy (line 42) | void gumbo_vector_destroy(struct GumboInternalParser* parser, GumboVecto...
  function enlarge_vector_if_full (line 48) | static void enlarge_vector_if_full(
  function gumbo_vector_add (line 68) | void gumbo_vector_add(
  type GumboInternalParser (line 77) | struct GumboInternalParser
  function gumbo_vector_index_of (line 84) | int gumbo_vector_index_of(GumboVector* vector, void* element) {
  function gumbo_vector_insert_at (line 93) | void gumbo_vector_insert_at(
  function gumbo_vector_remove (line 105) | void gumbo_vector_remove(
  type GumboInternalParser (line 115) | struct GumboInternalParser

FILE: Pod/Classes/Private/Gumbo/vector.h
  type GumboInternalParser (line 28) | struct GumboInternalParser
  type GumboInternalParser (line 32) | struct GumboInternalParser
  type GumboInternalParser (line 38) | struct GumboInternalParser
  type GumboInternalParser (line 42) | struct GumboInternalParser
  type GumboInternalParser (line 47) | struct GumboInternalParser
  type GumboInternalParser (line 52) | struct GumboInternalParser
  type GumboInternalParser (line 58) | struct GumboInternalParser
  type GumboInternalParser (line 63) | struct GumboInternalParser

FILE: Pod/Classes/Private/ObjectiveGumbo/OGText.h
  function interface (line 10) | interface OGText : OGNode
Condensed preview — 154 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,011K chars).
[
  {
    "path": ".gitignore",
    "chars": 622,
    "preview": "# OS X\n.DS_Store\n\n# Xcode\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.pers"
  },
  {
    "path": ".travis.yml",
    "chars": 638,
    "preview": "# references:\n# * http://www.objc.io/issue-6/travis-ci.html\n# * https://github.com/supermarin/xcpretty#usage\nosx_image: "
  },
  {
    "path": "Demo/Demo/AppDelegate.swift",
    "chars": 2886,
    "preview": "//\n//  AppDelegate.swift\n//  Demo\n//\n//  Created by zhuchao on 15/5/13.\n//  Copyright (c) 2015年 zhuchao. All rights rese"
  },
  {
    "path": "Demo/Demo/Base.lproj/LaunchScreen.xib",
    "chars": 3697,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" versi"
  },
  {
    "path": "Demo/Demo/CollectionCellViewModel.swift",
    "chars": 453,
    "preview": "//\n//  CollectionCellViewModel.swift\n//  Demo\n//\n//  Created by zhuchao on 15/5/13.\n//  Copyright (c) 2015年 zhuchao. All"
  },
  {
    "path": "Demo/Demo/CollectionScene.swift",
    "chars": 2362,
    "preview": "//\n//  CollectionScene.swift\n//  Demo\n//\n//  Created by zhuchao on 15/5/13.\n//  Copyright (c) 2015年 zhuchao. All rights "
  },
  {
    "path": "Demo/Demo/CollectionSceneModel.swift",
    "chars": 1684,
    "preview": "//\n//  CollectionCellViewModel.swift\n//  Demo\n//\n//  Created by zhuchao on 15/5/13.\n//  Copyright (c) 2015年 zhuchao. All"
  },
  {
    "path": "Demo/Demo/EncodeLoginScene.swift",
    "chars": 732,
    "preview": "//\n//  EncodeLoginScene.swift\n//  Demo\n//\n//  Created by zhuchao on 15/5/26.\n//  Copyright (c) 2015年 zhuchao. All rights"
  },
  {
    "path": "Demo/Demo/FeedRequest.swift",
    "chars": 435,
    "preview": "//\n//  FeedRequest.swift\n//  Demo\n//\n//  Created by zhuchao on 15/5/14.\n//  Copyright (c) 2015年 zhuchao. All rights rese"
  },
  {
    "path": "Demo/Demo/FlexScene.swift",
    "chars": 1303,
    "preview": "//\n//  FlexScene.swift\n//  Demo\n//\n//  Created by zhuchao on 15/10/14.\n//  Copyright © 2015年 zhuchao. All rights reserve"
  },
  {
    "path": "Demo/Demo/FlexXmlScene.swift",
    "chars": 377,
    "preview": "//\n//  FlexXmlScene.swift\n//  Demo\n//\n//  Created by zhuchao on 15/10/14.\n//  Copyright © 2015年 zhuchao. All rights rese"
  },
  {
    "path": "Demo/Demo/Images.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 585,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\""
  },
  {
    "path": "Demo/Demo/Info.plist",
    "chars": 1247,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Demo/Demo/LabelScene.swift",
    "chars": 989,
    "preview": "//\n//  LabelScene.swift\n//  Demo\n//\n//  Created by zhuchao on 15/5/18.\n//  Copyright (c) 2015年 zhuchao. All rights reser"
  },
  {
    "path": "Demo/Demo/LoginScene.swift",
    "chars": 904,
    "preview": "//\n//  ViewController.swift\n//  Demo\n//\n//  Created by zhuchao on 15/5/13.\n//  Copyright (c) 2015年 zhuchao. All rights r"
  },
  {
    "path": "Demo/Demo/MainLabelDeleage.swift",
    "chars": 398,
    "preview": "//\n//  MainLabelDeleage.swift\n//  Demo\n//\n//  Created by zhuchao on 15/5/17.\n//  Copyright (c) 2015年 zhuchao. All rights"
  },
  {
    "path": "Demo/Demo/MainScene.swift",
    "chars": 2497,
    "preview": "//\n//  MainScene.swift\n//  Demo\n//\n//  Created by zhuchao on 15/5/13.\n//  Copyright (c) 2015年 zhuchao. All rights reserv"
  },
  {
    "path": "Demo/Demo/MainSceneModel.swift",
    "chars": 3036,
    "preview": "//\n//  MainSsceneModel.swift\n//  Demo\n//\n//  Created by zhuchao on 15/5/13.\n//  Copyright (c) 2015年 zhuchao. All rights "
  },
  {
    "path": "Demo/Demo/url.plist",
    "chars": 525,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Demo/Demo/xml.bundle/CollectionScene.xml",
    "chars": 522,
    "preview": "<body>\n    <div id=\"collectionView\" align=\"0 0 0 0\" type=\"UICollectionView\" flow-layout=\"scroll-direction:Vertical;item-"
  },
  {
    "path": "Demo/Demo/xml.bundle/EncodeLoginScene.crypto",
    "chars": 2461,
    "preview": "VTWWEpHde9NHKxqWASruTqqmlAB2w6yrgF3k4/6aH5xLCWW09IBo0wCd/XDQTXFG\nH/fTwKRPrtiF85H9augC+XEcQ2BavK7sIbi99qwL0TaJOnmMoEt8n65"
  },
  {
    "path": "Demo/Demo/xml.bundle/FlexXmlScene.xml",
    "chars": 3389,
    "preview": "<body>\n    <div align=\"0 0 0 0\">\n        <div align=\"64 0 * 0\" height=\"100\"\n            justify-content=\"center\"\n       "
  },
  {
    "path": "Demo/Demo/xml.bundle/LabelHtml.xml",
    "chars": 2512,
    "preview": "<h1>\n    <a id=\"user-content-easyios-for-swift\" class=\"anchor\" href=\"#easyios-for-swift\" aria-hidden=\"true\"><span class="
  },
  {
    "path": "Demo/Demo/xml.bundle/LabelScene.xml",
    "chars": 606,
    "preview": "<style>\n    <!--支持css 样式设置,html中利用@的方式进行调用-->\n    .contentAlign{\n        edge:0 0 0 0;\n        left:0 root;\n        righ"
  },
  {
    "path": "Demo/Demo/xml.bundle/LoginScene.xml",
    "chars": 1784,
    "preview": "<style>\n    .contentAlign{\n        edge:0 0 0 0;\n        left:0 root;\n        right:0 root;\n    }\n    .inputStyle{\n     "
  },
  {
    "path": "Demo/Demo/xml.bundle/MainScene.xml",
    "chars": 984,
    "preview": "<body>\n    <div id=\"tableview\" align=\"64 0 0 0\" content-inset=\"{0,0,0,0}\" type=\"UITableView\"  estimated-row-height=\"100\""
  },
  {
    "path": "Demo/Demo.xcodeproj/project.pbxproj",
    "chars": 28937,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "Demo/Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 149,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Demo.xcodeproj\""
  },
  {
    "path": "Demo/Demo.xcworkspace/contents.xcworkspacedata",
    "chars": 222,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Demo.xcodeproj"
  },
  {
    "path": "Demo/DemoTests/DemoTests.swift",
    "chars": 884,
    "preview": "//\n//  DemoTests.swift\n//  DemoTests\n//\n//  Created by zhuchao on 15/5/13.\n//  Copyright (c) 2015年 zhuchao. All rights r"
  },
  {
    "path": "Demo/DemoTests/Info.plist",
    "chars": 733,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Demo/Podfile",
    "chars": 104,
    "preview": "platform :ios, '8.0'\nuse_frameworks!\npod \"EasyIOS-Swift\", :path => \"../\"\npod 'SVProgressHUD', '~> 1.1.3'"
  },
  {
    "path": "EasyIOS-Swift.podspec",
    "chars": 1707,
    "preview": "#\n# Be sure to run `pod lib lint EasyIOS-Swift.podspec' to ensure this is a\n# valid spec and remove all comments before "
  },
  {
    "path": "LICENSE",
    "chars": 1070,
    "preview": "Copyright (c) 2015 zhuchao <zhuchao@iosx.me>\n\nPermission is hereby granted, free of charge, to any person obtaining a co"
  },
  {
    "path": "Pod/Assets/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "Pod/Classes/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "Pod/Classes/Easy/Core/EZAction.swift",
    "chars": 9024,
    "preview": "//\n//  Action.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/25.\n//  Copyright (c) 2015年 zhuchao. All rights reserv"
  },
  {
    "path": "Pod/Classes/Easy/Core/EZCollectionView.swift",
    "chars": 434,
    "preview": "//\n//  EZCollectionView.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/26.\n//  Copyright (c) 2015年 zhuchao. All rig"
  },
  {
    "path": "Pod/Classes/Easy/Core/EZNavigationController.swift",
    "chars": 2060,
    "preview": "//\n//  EZNavigationController.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/24.\n//  Copyright (c) 2015年 zhuchao. A"
  },
  {
    "path": "Pod/Classes/Easy/Core/EZRequest.swift",
    "chars": 5227,
    "preview": "//\n//  Request.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/24.\n//  Copyright (c) 2015年 zhuchao. All rights reser"
  },
  {
    "path": "Pod/Classes/Easy/Core/EZScene.swift",
    "chars": 2943,
    "preview": "//\n//  Scene.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/22.\n//  Copyright (c) 2015年 zhuchao. All rights reserve"
  },
  {
    "path": "Pod/Classes/Easy/Core/EZSceneModel.swift",
    "chars": 199,
    "preview": "//\n//  SceneModel.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/26.\n//  Copyright (c) 2015年 zhuchao. All rights re"
  },
  {
    "path": "Pod/Classes/Easy/Core/EZTableView.swift",
    "chars": 419,
    "preview": "//\n//  EZTableView.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/26.\n//  Copyright (c) 2015年 zhuchao. All rights r"
  },
  {
    "path": "Pod/Classes/Easy/Core/EZViewModel.swift",
    "chars": 3586,
    "preview": "//\n//  EZViewModel.swift\n//  medical\n//\n//  Created by zhuchao on 15/5/11.\n//  Copyright (c) 2015年 zhuchao. All rights r"
  },
  {
    "path": "Pod/Classes/Easy/Lib/EZCoreDataManager.swift",
    "chars": 11079,
    "preview": "//\n//  EZCoreDataManager.swift\n//  medical\n//\n//  Created by zhuchao on 15/5/31.\n//  Copyright (c) 2015年 zhuchao. All ri"
  },
  {
    "path": "Pod/Classes/Easy/Lib/EZExtend+Array.swift",
    "chars": 595,
    "preview": "//\n//  EZExtend+Array.swift\n//  medical\n//\n//  Created by zhuchao on 15/5/1.\n//  Copyright (c) 2015年 zhuchao. All rights"
  },
  {
    "path": "Pod/Classes/Easy/Lib/EZExtend+Bond.swift",
    "chars": 9101,
    "preview": "//\n//  EZBond.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/27.\n//  Copyright (c) 2015年 zhuchao. All rights reserv"
  },
  {
    "path": "Pod/Classes/Easy/Lib/EZExtend+Dictionary.swift",
    "chars": 443,
    "preview": "//\n//  Dictionary+EZExtend.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/25.\n//  Copyright (c) 2015年 zhuchao. All "
  },
  {
    "path": "Pod/Classes/Easy/Lib/EZExtend+NSDate.swift",
    "chars": 440,
    "preview": "//\n//  EZExtend+NSDate.swift\n//  medical\n//\n//  Created by zhuchao on 15/5/9.\n//  Copyright (c) 2015年 zhuchao. All right"
  },
  {
    "path": "Pod/Classes/Easy/Lib/EZExtend+String.swift",
    "chars": 3532,
    "preview": "//\n//  EZExtend+String.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/28.\n//  Copyright (c) 2015年 zhuchao. All righ"
  },
  {
    "path": "Pod/Classes/Easy/Lib/EZExtend+UIAlertController.swift",
    "chars": 821,
    "preview": "//\n//  EZExtend+UIAlertController.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/28.\n//  Copyright (c) 2015年 zhucha"
  },
  {
    "path": "Pod/Classes/Easy/Lib/EZExtend+UIButton.swift",
    "chars": 2271,
    "preview": "//\n//  UIButton+EZExtend.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/22.\n//  Copyright (c) 2015年 zhuchao. All ri"
  },
  {
    "path": "Pod/Classes/Easy/Lib/EZExtend+UIFont.swift",
    "chars": 2323,
    "preview": "//\n//  EZExtend+UIFont.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/28.\n//  Copyright (c) 2015年 zhuchao. All righ"
  },
  {
    "path": "Pod/Classes/Easy/Lib/EZExtend+UIImage.swift",
    "chars": 1700,
    "preview": "//\n//  EZExtend+UIImage.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/28.\n//  Copyright (c) 2015年 zhuchao. All rig"
  },
  {
    "path": "Pod/Classes/Easy/Lib/EZExtend+UILabel.swift",
    "chars": 3372,
    "preview": "//\n//  EZExtend+UILabel.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/28.\n//  Copyright (c) 2015年 zhuchao. All rig"
  },
  {
    "path": "Pod/Classes/Easy/Lib/EZExtend+UIView.swift",
    "chars": 10457,
    "preview": "//\n//  EZExtend+UIView.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/28.\n//  Copyright (c) 2015年 zhuchao. All righ"
  },
  {
    "path": "Pod/Classes/Easy/Lib/EZExtend+UIViewController.swift",
    "chars": 1694,
    "preview": "//\n//  EZExtend+UIViewController.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/28.\n//  Copyright (c) 2015年 zhuchao"
  },
  {
    "path": "Pod/Classes/Easy/Lib/EZKit.swift",
    "chars": 6015,
    "preview": "//\n//  CEMKit.swift\n//  CEMKit-Swift\n//\n//  Created by Cem Olcay on 05/11/14.\n//  Copyright (c) 2014 Cem Olcay. All righ"
  },
  {
    "path": "Pod/Classes/Easy/Lib/EZPrintln.swift",
    "chars": 1332,
    "preview": "//\n//  EZPrintln.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/28.\n//  Copyright (c) 2015年 zhuchao. All rights res"
  },
  {
    "path": "Pod/Classes/Easy/Lib/EZSystemInfo.swift",
    "chars": 4197,
    "preview": "//\n//  EZSystemInfo.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/22.\n//  Copyright (c) 2015年 zhuchao. All rights "
  },
  {
    "path": "Pod/Classes/Easy/Lib/EZWatch.swift",
    "chars": 1291,
    "preview": "\n//  EZWatch.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/29.\n//  Copyright (c) 2015年 zhuchao. All rights reserve"
  },
  {
    "path": "Pod/Classes/Easy/Lib/EasyORM.swift",
    "chars": 13114,
    "preview": "//\n//  NSManagedObject+EZExtend.swift\n//  medical\n//\n//  Created by zhuchao on 15/5/30.\n//  Copyright (c) 2015年 zhuchao."
  },
  {
    "path": "Pod/Classes/Easy/Lib/NSData+EasyExtend.h",
    "chars": 355,
    "preview": "//\n//  NSData+EasyExtend.h\n//  fastSign\n//\n//  Created by EasyIOS on 14-4-10.\n//  Copyright (c) 2014年 zhuchao. All right"
  },
  {
    "path": "Pod/Classes/Easy/Lib/NSData+EasyExtend.m",
    "chars": 1442,
    "preview": "//\n//  NSData+EasyExtend.m\n//\n//  Created by EasyIOS on 14-4-10.\n//  Copyright (c) 2014年 zhuchao. All rights reserved.\n/"
  },
  {
    "path": "Pod/Classes/Easy/Lib/PullRefresh/EZInfiniteScrolling.swift",
    "chars": 7557,
    "preview": "//\n//  EZInfiniteScrolling.swift\n//  Demo\n//\n//  Created by zhuchao on 15/5/15.\n//  Copyright (c) 2015年 zhuchao. All rig"
  },
  {
    "path": "Pod/Classes/Easy/Lib/PullRefresh/EZPullToRefresh.swift",
    "chars": 6247,
    "preview": "//\n//  EZPullToRefresh.swift\n//  Demo\n//\n//  Created by zhuchao on 15/5/15.\n//  Copyright (c) 2015年 zhuchao. All rights "
  },
  {
    "path": "Pod/Classes/Easy/Lib/PullRefresh/PullFooter.swift",
    "chars": 5034,
    "preview": "//\n//  PullFooter.swift\n//  Demo\n//\n//  Created by zhuchao on 15/5/16.\n//  Copyright (c) 2015年 zhuchao. All rights reser"
  },
  {
    "path": "Pod/Classes/Easy/Lib/PullRefresh/PullHeader.swift",
    "chars": 6166,
    "preview": "//\n//  PullHeader.swift\n//  Demo\n//\n//  Created by zhuchao on 15/5/16.\n//  Copyright (c) 2015年 zhuchao. All rights reser"
  },
  {
    "path": "Pod/Classes/Extend/EUI/Defines.h",
    "chars": 9548,
    "preview": "//\n// GTMDefines.h\n//\n//  Copyright 2008 Google Inc.\n//\n//  Licensed under the Apache License, Version 2.0 (the \"License"
  },
  {
    "path": "Pod/Classes/Extend/EUI/DesEncrypt.h",
    "chars": 346,
    "preview": "//\n//  DesEncrypt.h\n//  medical\n//\n//  Created by zhuchao on 15/5/4.\n//  Copyright (c) 2015年 zhuchao. All rights reserve"
  },
  {
    "path": "Pod/Classes/Extend/EUI/DesEncrypt.m",
    "chars": 3404,
    "preview": "//\n//  DesEncrypt.m\n//  medical\n//\n//  Created by zhuchao on 15/5/4.\n//  Copyright (c) 2015年 zhuchao. All rights reserve"
  },
  {
    "path": "Pod/Classes/Extend/EUI/ENSObject.swift",
    "chars": 2194,
    "preview": "//\n//  ENSObject.swift\n//  Pods\n//\n//  Created by zhuchao on 15/7/21.\n//\n//\n\nimport Foundation\nimport JavaScriptCore\n\n@o"
  },
  {
    "path": "Pod/Classes/Extend/EUI/EUI+ButtonProperty.swift",
    "chars": 4148,
    "preview": "//\n//  EUI+ButtonProperty.swift\n//  medical\n//\n//  Created by zhuchao on 15/5/1.\n//  Copyright (c) 2015年 zhuchao. All ri"
  },
  {
    "path": "Pod/Classes/Extend/EUI/EUI+CollectionViewProperty.swift",
    "chars": 3289,
    "preview": "//\n//  EUI+CollectionViewProperty.swift\n//  medical\n//\n//  Created by zhuchao on 15/5/10.\n//  Copyright (c) 2015年 zhucha"
  },
  {
    "path": "Pod/Classes/Extend/EUI/EUI+ImageProperty.swift",
    "chars": 1091,
    "preview": "//\n//  EUI+ImageProperty.swift\n//  medical\n//\n//  Created by zhuchao on 15/5/1.\n//  Copyright (c) 2015年 zhuchao. All rig"
  },
  {
    "path": "Pod/Classes/Extend/EUI/EUI+LabelProperty.swift",
    "chars": 2474,
    "preview": "//\n//  EUI+LabelProperty.swift\n//  medical\n//\n//  Created by zhuchao on 15/5/1.\n//  Copyright (c) 2015年 zhuchao. All rig"
  },
  {
    "path": "Pod/Classes/Extend/EUI/EUI+ScrollViewProperty.swift",
    "chars": 3164,
    "preview": "//\n//  EUI+ScrollViewProperty.swift\n//  medical\n//\n//  Created by zhuchao on 15/5/2.\n//  Copyright (c) 2015年 zhuchao. Al"
  },
  {
    "path": "Pod/Classes/Extend/EUI/EUI+TableViewProperty.swift",
    "chars": 2635,
    "preview": "//\n//  EUI+TableViewProperty.swift\n//  medical\n//\n//  Created by zhuchao on 15/5/2.\n//  Copyright (c) 2015年 zhuchao. All"
  },
  {
    "path": "Pod/Classes/Extend/EUI/EUI+TextFieldProperty.swift",
    "chars": 2268,
    "preview": "//\n//  EUI+TextFieldProperty.swift\n//  medical\n//\n//  Created by zhuchao on 15/5/1.\n//  Copyright (c) 2015年 zhuchao. All"
  },
  {
    "path": "Pod/Classes/Extend/EUI/EUI+ViewProperty.swift",
    "chars": 11307,
    "preview": "//\n//  EUI+ViewProperty.swift\n//  medical\n//\n//  Created by zhuchao on 15/5/2.\n//  Copyright (c) 2015年 zhuchao. All righ"
  },
  {
    "path": "Pod/Classes/Extend/EUI/EUI.swift",
    "chars": 8386,
    "preview": "//\n//  EUI.swift\n//  medical\n//\n//  Created by zhuchao on 15/5/5.\n//  Copyright (c) 2015年 zhuchao. All rights reserved.\n"
  },
  {
    "path": "Pod/Classes/Extend/EUI/EUIExtend+UIView.swift",
    "chars": 22600,
    "preview": "//\n//  EUIExtend+UIView.swift\n//  medical\n//\n//  Created by zhuchao on 15/5/1.\n//  Copyright (c) 2015年 zhuchao. All righ"
  },
  {
    "path": "Pod/Classes/Extend/EUI/EUIKit.swift",
    "chars": 2015,
    "preview": "//\n//  EUIView.swift\n//  Pods\n//\n//  Created by zhuchao on 15/7/21.\n//\n//\n\nimport CoreImage\nimport UIKit\nimport JavaScri"
  },
  {
    "path": "Pod/Classes/Extend/EUI/EUIParse.swift",
    "chars": 6538,
    "preview": "//\n//  EZUI.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/30.\n//  Copyright (c) 2015年 zhuchao. All rights reserved"
  },
  {
    "path": "Pod/Classes/Extend/EUI/EUIProperty.swift",
    "chars": 2646,
    "preview": "//\n//  EUIProperty.swift\n//  medical\n//\n//  Created by zhuchao on 15/4/30.\n//  Copyright (c) 2015年 zhuchao. All rights r"
  },
  {
    "path": "Pod/Classes/Extend/EUI/EUScene.swift",
    "chars": 2077,
    "preview": "//\n//  EUScene.swift\n//  medical\n//\n//  Created by zhuchao on 15/5/6.\n//  Copyright (c) 2015年 zhuchao. All rights reserv"
  },
  {
    "path": "Pod/Classes/Extend/EUI/EZJSCore.swift",
    "chars": 3302,
    "preview": "import UIKit\nimport JavaScriptCore\n\n\n@objc protocol ConsoleExport:JSExport {\n    static func log(object:AnyObject?)\n}\n\n@"
  },
  {
    "path": "Pod/Classes/Extend/EUI/NSAttributedString+HTMLStyle.h",
    "chars": 5669,
    "preview": "//\n//  NSAttributedString+HTMLStyle.h\n//  QRContentMobilizer\n//\n//  Created by Wojciech Czekalski on 22.03.2014.\n//  Cop"
  },
  {
    "path": "Pod/Classes/Extend/EUI/NSAttributedString+HTMLStyle.m",
    "chars": 8853,
    "preview": "//\n//  NSAttributedString+HTMLStyle.m\n//  QRContentMobilizer\n//\n//  Created by Wojciech Czekalski on 22.03.2014.\n//  Cop"
  },
  {
    "path": "Pod/Classes/Extend/EUI/StringFormat.swift",
    "chars": 8731,
    "preview": "//\n//  StringFormat.swift\n//  Pods\n//\n//  Created by zhuchao on 15/10/15.\n//\n//\n\nimport Foundation\n\nextension String{\n  "
  },
  {
    "path": "Pod/Classes/Extend/EUI/SwiftTryCatch.h",
    "chars": 1528,
    "preview": "//\n//  SwiftTryCatch.h\n//\n//  Created by William Falcon on 10/10/14.\n//  Copyright (c) 2014 William Falcon. All rights r"
  },
  {
    "path": "Pod/Classes/Extend/EUI/SwiftTryCatch.m",
    "chars": 1770,
    "preview": "//\n//  SwiftTryCatch.h\n//\n//  Created by William Falcon on 10/10/14.\n//  Copyright (c) 2014 William Falcon. All rights r"
  },
  {
    "path": "Pod/Classes/Extend/EUI/UIColor+HTMLColors.h",
    "chars": 2759,
    "preview": "//\n//  UIColor+HTMLColors.h\n//\n//  Created by James Lawton on 12/9/12.\n//  Copyright (c) 2012 James Lawton. All rights r"
  },
  {
    "path": "Pod/Classes/Extend/EUI/UIColor+HTMLColors.m",
    "chars": 21704,
    "preview": "//\n//  UIColor+HTMLColors.m\n//\n//  Created by James Lawton on 12/9/12.\n//  Copyright (c) 2012 James Lawton. All rights r"
  },
  {
    "path": "Pod/Classes/Extend/FlexboxKit/FLEXBOXContainerView.h",
    "chars": 223,
    "preview": "//\n//  FLEXBOXContainerView.h\n//  FlexboxKit\n//\n//  Created by Alex Usbergo on 10/05/15.\n//  Copyright (c) 2015 Alex Usb"
  },
  {
    "path": "Pod/Classes/Extend/FlexboxKit/FLEXBOXContainerView.m",
    "chars": 477,
    "preview": "//\n//  FLEXBOXContainerView.m\n//  FlexboxKit\n//\n//  Created by Alex Usbergo on 10/05/15.\n//  Copyright (c) 2015 Alex Usb"
  },
  {
    "path": "Pod/Classes/Extend/FlexboxKit/FLEXBOXNode.h",
    "chars": 2685,
    "preview": "//\n//  FLEXBOXNode.h\n//  FlexboxKit\n//\n//  Created by Alex Usbergo on 09/05/15.\n//  Copyright (c) 2015 Alex Usbergo. All"
  },
  {
    "path": "Pod/Classes/Extend/FlexboxKit/FLEXBOXNode.m",
    "chars": 5127,
    "preview": "//\n//  FLEXBOXNode.m\n//  FlexboxKit\n//\n//  Created by Alex Usbergo on 09/05/15.\n//  Copyright (c) 2015 Alex Usbergo. All"
  },
  {
    "path": "Pod/Classes/Extend/FlexboxKit/FlexboxKit.h",
    "chars": 592,
    "preview": "//\n//  FlexboxKit.h\n//  FlexboxKit\n//\n//  Created by Alex Usbergo on 09/05/15.\n//  Copyright (c) 2015 Alex Usbergo. All "
  },
  {
    "path": "Pod/Classes/Extend/FlexboxKit/Layout.c",
    "chars": 42379,
    "preview": "/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style"
  },
  {
    "path": "Pod/Classes/Extend/FlexboxKit/Layout.h",
    "chars": 3753,
    "preview": "/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style"
  },
  {
    "path": "Pod/Classes/Extend/FlexboxKit/UIView+FLEXBOX.h",
    "chars": 4555,
    "preview": "//\n//  UIView+FLEXBOX.h\n//  FlexboxKit\n//\n//  Created by Alex Usbergo on 09/05/15.\n//  Copyright (c) 2015 Alex Usbergo. "
  },
  {
    "path": "Pod/Classes/Extend/FlexboxKit/UIView+FLEXBOX.m",
    "chars": 6569,
    "preview": "//\n//  UIView+FLEXBOX.m\n//  FlexboxKit\n//\n//  Created by Alex Usbergo on 09/05/15.\n//  Copyright (c) 2015 Alex Usbergo. "
  },
  {
    "path": "Pod/Classes/Extend/Pinyin/pinyin.h",
    "chars": 443,
    "preview": "/*\n *  pinyin.h\n *  Chinese Pinyin First Letter\n *\n *  Created by George on 4/21/10.\n *  Copyright 2010 RED/SAFI. All ri"
  },
  {
    "path": "Pod/Classes/Extend/Pinyin/pinyin.m",
    "chars": 24279,
    "preview": "/*\n *  pinyin.c\n *  Chinese Pinyin First Letter\n *\n *  Created by George on 4/21/10.\n *  Copyright 2010 RED/SAFI. All ri"
  },
  {
    "path": "Pod/Classes/Extend/SwiftRegex/Match.swift",
    "chars": 1343,
    "preview": "//\n//  Match.swift\n//  Cupertino\n//\n//  Created by William Kent on 2/19/15.\n//  Copyright (c) 2015 William Kent. All rig"
  },
  {
    "path": "Pod/Classes/Extend/SwiftRegex/Regex.swift",
    "chars": 7037,
    "preview": "//\n//  Regex.swift\n//  Cupertino\n//\n//  Created by William Kent on 2/19/15.\n//  Copyright (c) 2015 William Kent. All rig"
  },
  {
    "path": "Pod/Classes/Extend/URLManager/UIViewController+URLManage.h",
    "chars": 957,
    "preview": "//\n//  UIViewController+URLManage.h\n//  rssreader\n//\n//  Created by zhuchao on 15/2/11.\n//  Copyright (c) 2015年 zhuchao."
  },
  {
    "path": "Pod/Classes/Extend/URLManager/UIViewController+URLManage.m",
    "chars": 4951,
    "preview": "//\n//  UIViewController+URLManage.m\n//  rssreader\n//\n//  Created by zhuchao on 15/2/11.\n//  Copyright (c) 2015年 zhuchao."
  },
  {
    "path": "Pod/Classes/Extend/URLManager/URLManager.h",
    "chars": 1827,
    "preview": "//\n//  URLManager.h\n//  rssreader\n//\n//  Created by zhuchao on 15/3/6.\n//  Copyright (c) 2015年 zhuchao. All rights reser"
  },
  {
    "path": "Pod/Classes/Extend/URLManager/URLManager.m",
    "chars": 5925,
    "preview": "//\n//  URLManager.m\n//  rssreader\n//\n//  Created by zhuchao on 15/3/6.\n//  Copyright (c) 2015年 zhuchao. All rights reser"
  },
  {
    "path": "Pod/Classes/Extend/URLManager/URLNavigation.h",
    "chars": 2889,
    "preview": "//\n//  HKNavigation.h\n//  Hoko\n//\n//  Created by Hoko, S.A. on 23/07/14.\n//  Copyright (c) 2015 Hoko, S.A. All rights re"
  },
  {
    "path": "Pod/Classes/Extend/URLManager/URLNavigation.m",
    "chars": 5257,
    "preview": "//\n//  HKObserver.m\n//  Hoko\n//\n//  Created by Hoko, S.A. on 23/07/14.\n//  Copyright (c) 2015 Hoko, S.A. All rights rese"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/attribute.c",
    "chars": 1365,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/attribute.h",
    "chars": 1045,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/char_ref.c",
    "chars": 81373,
    "preview": "// Copyright 2011 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/char_ref.h",
    "chars": 2219,
    "preview": "// Copyright 2011 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/error.c",
    "chars": 9904,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/error.h",
    "chars": 7892,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/gumbo.h",
    "chars": 26305,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/insertion_mode.h",
    "chars": 1760,
    "preview": "// Copyright 2011 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/parser.c",
    "chars": 163420,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/parser.h",
    "chars": 2049,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/string_buffer.c",
    "chars": 3484,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/string_buffer.h",
    "chars": 2856,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/string_piece.c",
    "chars": 1563,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/string_piece.h",
    "chars": 1215,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/tag.c",
    "chars": 4032,
    "preview": "// Copyright 2011 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/token_type.h",
    "chars": 1088,
    "preview": "// Copyright 2011 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/tokenizer.c",
    "chars": 116839,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/tokenizer.h",
    "chars": 4624,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/tokenizer_states.h",
    "chars": 3737,
    "preview": "// Copyright 2011 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/utf8.c",
    "chars": 8982,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/utf8.h",
    "chars": 4699,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/util.c",
    "chars": 1791,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/util.h",
    "chars": 1975,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/vector.c",
    "chars": 3720,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/Gumbo/vector.h",
    "chars": 2391,
    "preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "Pod/Classes/Private/ObjectiveGumbo/NSString+OGString.h",
    "chars": 311,
    "preview": "//\n//  NSString+OGString.h\n//  Hacker News\n//\n//  Created by Thomas Denney on 30/08/2013.\n//  Copyright (c) 2013 Program"
  },
  {
    "path": "Pod/Classes/Private/ObjectiveGumbo/NSString+OGString.m",
    "chars": 713,
    "preview": "//\n//  NSString+OGString.m\n//  Hacker News\n//\n//  Created by Thomas Denney on 30/08/2013.\n//  Copyright (c) 2013 Program"
  },
  {
    "path": "Pod/Classes/Private/ObjectiveGumbo/OGDocument.h",
    "chars": 279,
    "preview": "//\n//  OGDocument.h\n//  ObjectiveGumbo\n//\n//  Copyright (c) 2013 Programming Thomas. All rights reserved.\n//\n\n#import \"O"
  },
  {
    "path": "Pod/Classes/Private/ObjectiveGumbo/OGDocument.m",
    "chars": 349,
    "preview": "//\n//  OGDocument.m\n//  ObjectiveGumbo\n//\n//  Copyright (c) 2013 Programming Thomas. All rights reserved.\n//\n\n#import \"O"
  },
  {
    "path": "Pod/Classes/Private/ObjectiveGumbo/OGElement.h",
    "chars": 414,
    "preview": "//\n//  OGElement.h\n//  ObjectiveGumbo\n//\n//  Copyright (c) 2013 Programming Thomas. All rights reserved.\n//\n\n#import \"OG"
  },
  {
    "path": "Pod/Classes/Private/ObjectiveGumbo/OGElement.m",
    "chars": 2869,
    "preview": "//\n//  OGElement.m\n//  ObjectiveGumbo\n//\n//  Copyright (c) 2013 Programming Thomas. All rights reserved.\n//\n\n#import \"OG"
  },
  {
    "path": "Pod/Classes/Private/ObjectiveGumbo/OGNode.h",
    "chars": 777,
    "preview": "//\n//  OGNode.h\n//  ObjectiveGumbo\n//\n//  Copyright (c) 2013 Programming Thomas. All rights reserved.\n//\n\n#import <Found"
  },
  {
    "path": "Pod/Classes/Private/ObjectiveGumbo/OGNode.m",
    "chars": 1817,
    "preview": "//\n//  OGNode.m\n//  ObjectiveGumbo\n//\n//  Copyright (c) 2013 Programming Thomas. All rights reserved.\n//\n\n#import \"OGNod"
  },
  {
    "path": "Pod/Classes/Private/ObjectiveGumbo/OGText.h",
    "chars": 352,
    "preview": "//\n//  OGText.h\n//  ObjectiveGumbo\n//\n//  Copyright (c) 2013 Programming Thomas. All rights reserved.\n//\n\n#import \"OGNod"
  },
  {
    "path": "Pod/Classes/Private/ObjectiveGumbo/OGText.m",
    "chars": 1109,
    "preview": "//\n//  OGText.m\n//  ObjectiveGumbo\n//\n//  Copyright (c) 2013 Programming Thomas. All rights reserved.\n//\n\n#import \"OGTex"
  },
  {
    "path": "Pod/Classes/Private/ObjectiveGumbo/OGUtility.h",
    "chars": 349,
    "preview": "//\n//  OGUtility.h\n//  Hacker News\n//\n//  Created by Thomas Denney on 30/08/2013.\n//  Copyright (c) 2013 Programming Tho"
  },
  {
    "path": "Pod/Classes/Private/ObjectiveGumbo/OGUtility.m",
    "chars": 6255,
    "preview": "//\n//  OGUtility.m\n//  Hacker News\n//\n//  Created by Thomas Denney on 30/08/2013.\n//  Copyright (c) 2013 Programming Tho"
  },
  {
    "path": "Pod/Classes/Private/ObjectiveGumbo/ObjectiveGumbo.h",
    "chars": 566,
    "preview": "//\n//  ObjectiveGumbo.h\n//  ObjectiveGumbo\n//\n//  Copyright (c) 2013 Programming Thomas. All rights reserved.\n//\n\n#impor"
  },
  {
    "path": "Pod/Classes/Private/ObjectiveGumbo/ObjectiveGumbo.m",
    "chars": 5007,
    "preview": "//\n//  ObjectiveGumbo.m\n//  ObjectiveGumbo\n//\n//  Copyright (c) 2013 Programming Thomas. All rights reserved.\n//\n\n#impor"
  },
  {
    "path": "README/Chinese.md",
    "chars": 6298,
    "preview": "\n![image](https://raw.githubusercontent.com/zhuchaowe/EasyIOS/gh-pages/images/logo.png)\n\nEasyIOS Swift 2.0版本新鲜出炉! \n====="
  },
  {
    "path": "README.md",
    "chars": 8228,
    "preview": "\n![image](https://raw.githubusercontent.com/zhuchaowe/EasyIOS/gh-pages/images/logo.png)\n\nEasyIOS For Swift 2.0\n=======\n\n"
  }
]

About this extraction

This page contains the full source code of the EasyIOS/EasyIOS-Swift GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 154 files (935.2 KB), approximately 265.0k tokens, and a symbol index with 443 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!