Merge pull request #3 from wrmswindmill/master

[iOS]Upload iOS playground
diff --git a/README.md b/README.md
index 47b56f3..a872725 100644
--- a/README.md
+++ b/README.md
@@ -11,4 +11,9 @@
 * In `playground/java/com.alibaba.weex/IndexActivity`, modify `CURRENT_IP` to your local IP
 * Click <img src="http://gtms04.alicdn.com/tps/i4/TB1wCcqMpXXXXakXpXX3G7tGXXX-34-44.png" height="16" > (`Run` button)
 
+### iOS
+* install `CocoaPods`.
+* Open `ios` directory, and then execute `pod install` in terminal.
+* Open `WeexDemo.xcworkspace` with Xcode.
+* Click <img src="http://gtms04.alicdn.com/tps/i4/TB1wCcqMpXXXXakXpXX3G7tGXXX-34-44.png" height="16" > (`Run` button)
 
diff --git a/ios/.gitignore b/ios/.gitignore
new file mode 100644
index 0000000..1d46736
--- /dev/null
+++ b/ios/.gitignore
@@ -0,0 +1,6 @@
+## Build generated
+build/
+DerivedData/
+
+# CocoaPods
+Pods/
diff --git a/ios/Podfile b/ios/Podfile
new file mode 100644
index 0000000..d5003ae
--- /dev/null
+++ b/ios/Podfile
@@ -0,0 +1,24 @@
+source 'https://github.com/CocoaPods/Specs.git'
+platform :ios, '9.0'
+#inhibit_all_warnings!
+
+def common
+    pod 'WeexSDK', :git => 'https://github.com/apache/incubator-weex.git'
+    pod 'WXDevtool','0.20.0'
+    pod 'SDWebImage', '3.7.5'
+    pod 'SDWebImage/WebP'
+    pod 'SocketRocket', '0.4.2'
+    pod 'ATSDK-Weex', '0.0.1',:configurations => ['Debug']
+    pod 'BindingX', '1.0.3'
+    
+    # WeexGcanvas is added by Weex Plugin, more info at https://market.dotwe.org/ext/list.htm
+    #pod 'WeexGcanvas'
+end
+
+target 'WeexDemo' do
+    common
+end
+
+target 'WeexUITestDemo' do
+    common
+end
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
new file mode 100644
index 0000000..5c61918
--- /dev/null
+++ b/ios/Podfile.lock
@@ -0,0 +1,84 @@
+PODS:
+  - ATSDK-Weex (0.0.1)
+  - BindingX (1.0.3):
+    - WeexPluginLoader
+    - WeexSDK
+  - libwebp (1.0.2):
+    - libwebp/core (= 1.0.2)
+    - libwebp/dec (= 1.0.2)
+    - libwebp/demux (= 1.0.2)
+    - libwebp/dsp (= 1.0.2)
+    - libwebp/enc (= 1.0.2)
+    - libwebp/mux (= 1.0.2)
+    - libwebp/utils (= 1.0.2)
+    - libwebp/webp (= 1.0.2)
+  - libwebp/core (1.0.2):
+    - libwebp/webp
+  - libwebp/dec (1.0.2):
+    - libwebp/core
+  - libwebp/demux (1.0.2):
+    - libwebp/core
+  - libwebp/dsp (1.0.2):
+    - libwebp/core
+  - libwebp/enc (1.0.2):
+    - libwebp/core
+  - libwebp/mux (1.0.2):
+    - libwebp/core
+  - libwebp/utils (1.0.2):
+    - libwebp/core
+  - libwebp/webp (1.0.2)
+  - SDWebImage (3.7.5):
+    - SDWebImage/Core (= 3.7.5)
+  - SDWebImage/Core (3.7.5)
+  - SDWebImage/WebP (3.7.5):
+    - libwebp
+    - SDWebImage/Core
+  - SocketRocket (0.4.2)
+  - WeexPluginLoader (0.0.1.9.1):
+    - WeexSDK
+  - WeexSDK (0.24.0)
+  - WXDevtool (0.20.0):
+    - SocketRocket
+    - WeexSDK
+
+DEPENDENCIES:
+  - ATSDK-Weex (= 0.0.1)
+  - BindingX (= 1.0.3)
+  - SDWebImage (= 3.7.5)
+  - SDWebImage/WebP
+  - SocketRocket (= 0.4.2)
+  - WeexSDK (from `https://github.com/apache/incubator-weex.git`)
+  - WXDevtool (= 0.20.0)
+
+SPEC REPOS:
+  https://github.com/cocoapods/specs.git:
+    - ATSDK-Weex
+    - BindingX
+    - libwebp
+    - SDWebImage
+    - SocketRocket
+    - WeexPluginLoader
+    - WXDevtool
+
+EXTERNAL SOURCES:
+  WeexSDK:
+    :git: https://github.com/apache/incubator-weex.git
+
+CHECKOUT OPTIONS:
+  WeexSDK:
+    :commit: 159ccdc2f80baea89c559d547b857dacf2203000
+    :git: https://github.com/apache/incubator-weex.git
+
+SPEC CHECKSUMS:
+  ATSDK-Weex: 1b27558f4336d77fb97704d34fc6ad1fd468592c
+  BindingX: b3c6c1c5dcd8e50277cfc5daad09d7010c227524
+  libwebp: b068a3bd7c45f7460f6715be7bed1a18fd5d6b48
+  SDWebImage: 69c6303e3348fba97e03f65d65d4fbc26740f461
+  SocketRocket: ffe08119b00ef982f6c37052a4705a057c8494ad
+  WeexPluginLoader: 85c1304f8ba29864e58531614a0acfeceef1b85c
+  WeexSDK: b04beeb0cf562a1467a943a2002f3e4e018ba55b
+  WXDevtool: 833dd3e835df1f5f278fc8865c865d48196bfdab
+
+PODFILE CHECKSUM: b30fb7b0bff70242f50cb3c7f45ac09caf08f211
+
+COCOAPODS: 1.7.3
diff --git a/ios/README.md b/ios/README.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ios/README.md
diff --git a/ios/WeexDemo.xcodeproj/project.pbxproj b/ios/WeexDemo.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..da9bbb2
--- /dev/null
+++ b/ios/WeexDemo.xcodeproj/project.pbxproj
@@ -0,0 +1,975 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 46;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		17036A5720FDF9AA0029AE3D /* WXApmGeneratorImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = 17036A5620FDF9AA0029AE3D /* WXApmGeneratorImpl.m */; };
+		17036A5A20FDF9DF0029AE3D /* WXApmImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = 17036A5920FDF9DF0029AE3D /* WXApmImpl.m */; };
+		17C1DB57206B675D000E0CEB /* DebugAnzlyzer.m in Sources */ = {isa = PBXBuildFile; fileRef = 17C1DB56206B675D000E0CEB /* DebugAnzlyzer.m */; };
+		2AE88A2C1C8544E6003329DE /* WXScannerVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AE88A2B1C8544E6003329DE /* WXScannerVC.m */; };
+		3375BEE821C74C5C003CAAB8 /* WXWebSocketDefaultImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = 3375BEE521C74C5C003CAAB8 /* WXWebSocketDefaultImpl.m */; };
+		3375BEE921C74C5C003CAAB8 /* SRWebSocket+Weex.m in Sources */ = {isa = PBXBuildFile; fileRef = 3375BEE721C74C5C003CAAB8 /* SRWebSocket+Weex.m */; };
+		564B94671DD9C65000441C8D /* WeexUITestDemo-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 564B94661DD9C65000441C8D /* WeexUITestDemo-Info.plist */; };
+		59EA0DA71D2E7D19004F904A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 59EA0DA61D2E7D19004F904A /* Images.xcassets */; };
+		7478481E1E0CD4910044500D /* WXSyncTestModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 7478481D1E0CD4910044500D /* WXSyncTestModule.m */; };
+		747DF6681E2F176A005C53A8 /* UIView+UIThreadCheck.m in Sources */ = {isa = PBXBuildFile; fileRef = 747DF6671E2F176A005C53A8 /* UIView+UIThreadCheck.m */; };
+		74CC79EB1C2B9E4700829368 /* UIViewController+WXDemoNaviBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 74CC79EA1C2B9E4700829368 /* UIViewController+WXDemoNaviBar.m */; };
+		775BEE801C1E8ECC008D1629 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 775BEE7F1C1E8ECC008D1629 /* main.m */; };
+		775BEE831C1E8ECC008D1629 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 775BEE821C1E8ECC008D1629 /* AppDelegate.m */; };
+		775BEE861C1E8ECC008D1629 /* WXDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 775BEE851C1E8ECC008D1629 /* WXDemoViewController.m */; };
+		775BEE8B1C1E8ECC008D1629 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 775BEE8A1C1E8ECC008D1629 /* Assets.xcassets */; };
+		775BEE991C1E8ECC008D1629 /* WeexDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 775BEE981C1E8ECC008D1629 /* WeexDemoTests.m */; };
+		84361D2F1CA10F8E00F43825 /* WXScannerVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AE88A2B1C8544E6003329DE /* WXScannerVC.m */; };
+		84361D331CA10F8E00F43825 /* WXDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 775BEE851C1E8ECC008D1629 /* WXDemoViewController.m */; };
+		84361D371CA10F8E00F43825 /* UIViewController+WXDemoNaviBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 74CC79EA1C2B9E4700829368 /* UIViewController+WXDemoNaviBar.m */; };
+		84361D381CA10F8E00F43825 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 775BEE821C1E8ECC008D1629 /* AppDelegate.m */; };
+		84361D3B1CA10F8E00F43825 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 775BEE7F1C1E8ECC008D1629 /* main.m */; };
+		84361D5B1CA10F8E00F43825 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 775BEE8A1C1E8ECC008D1629 /* Assets.xcassets */; };
+		846FC8DA1E1B853100949E7D /* WXSyncTestModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 7478481D1E0CD4910044500D /* WXSyncTestModule.m */; };
+		846FC8DB1E1B853600949E7D /* WXATViewHierarchyPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = DCABAFF21D029685001C8592 /* WXATViewHierarchyPlugin.m */; };
+		847CAF2B1F39BB6B00551725 /* UIView+UIThreadCheck.m in Sources */ = {isa = PBXBuildFile; fileRef = 747DF6671E2F176A005C53A8 /* UIView+UIThreadCheck.m */; };
+		847CAF2C1F39BB8A00551725 /* WXATLoggerPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = DCABAFF01D029685001C8592 /* WXATLoggerPlugin.m */; };
+		847CAF2D1F39BBB900551725 /* WXScannerHistoryVC.m in Sources */ = {isa = PBXBuildFile; fileRef = DC5B53681E8CED9400E02125 /* WXScannerHistoryVC.m */; };
+		847CAF2E1F39BBFB00551725 /* WXConfigCenterDefaultImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = DC20B8E51ECADA2500845F39 /* WXConfigCenterDefaultImpl.m */; };
+		847CAF311F39E3F100551725 /* WXExtModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 847CAF301F39E3F100551725 /* WXExtModule.m */; };
+		84D7CAC71CE3266C00D48D46 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7475ACA01CD8444A0044E96C /* libsqlite3.0.tbd */; };
+		8A0B5EFFF75BF82EA481983D /* libPods-WeexUITestDemo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E48C20F443AA337D1FE97622 /* libPods-WeexUITestDemo.a */; };
+		B83A6C5220FF16D50053BCEF /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B83A6C5120FF16D50053BCEF /* libc++.tbd */; };
+		C43CDA031F1C6E01005A6B03 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = C43CDA021F1C6E01005A6B03 /* libz.tbd */; };
+		C47B78D21F299E27001D3B0C /* WXExtendCallNativeTest.m in Sources */ = {isa = PBXBuildFile; fileRef = C47B78D11F299E27001D3B0C /* WXExtendCallNativeTest.m */; };
+		DC15A3C7200C505C009C8977 /* WXTitleBarModule.m in Sources */ = {isa = PBXBuildFile; fileRef = DC15A3C6200C505C009C8977 /* WXTitleBarModule.m */; };
+		DC15A3D0200E30FC009C8977 /* WXNavigationHandlerImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = DC15A3CE200E30FC009C8977 /* WXNavigationHandlerImpl.m */; };
+		DC20B8E61ECADA2500845F39 /* WXConfigCenterDefaultImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = DC20B8E51ECADA2500845F39 /* WXConfigCenterDefaultImpl.m */; };
+		DC5B53691E8CED9400E02125 /* WXScannerHistoryVC.m in Sources */ = {isa = PBXBuildFile; fileRef = DC5B53681E8CED9400E02125 /* WXScannerHistoryVC.m */; };
+		DC5E503E1D0D97130059F0EB /* weex.png in Resources */ = {isa = PBXBuildFile; fileRef = DC5E503C1D0D97130059F0EB /* weex.png */; };
+		DC5E503F1D0D97130059F0EB /* weex@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DC5E503D1D0D97130059F0EB /* weex@2x.png */; };
+		DC65C4FA1CEB032F00B2F84F /* bundlejs in Resources */ = {isa = PBXBuildFile; fileRef = DC65C4F91CEB032F00B2F84F /* bundlejs */; };
+		DC6DD9D21CFE9BC400549297 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7475ACA01CD8444A0044E96C /* libsqlite3.0.tbd */; };
+		DCA812FA1D0401500029BF62 /* WXEventModule.m in Sources */ = {isa = PBXBuildFile; fileRef = DCABB0001D02975E001C8592 /* WXEventModule.m */; };
+		DCA812FB1D0401570029BF62 /* WXImgLoaderDefaultImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = DCABAFFD1D029753001C8592 /* WXImgLoaderDefaultImpl.m */; };
+		DCABAFF31D029685001C8592 /* WXATLoggerPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = DCABAFF01D029685001C8592 /* WXATLoggerPlugin.m */; };
+		DCABAFF41D029685001C8592 /* WXATViewHierarchyPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = DCABAFF21D029685001C8592 /* WXATViewHierarchyPlugin.m */; };
+		DCABAFFE1D029753001C8592 /* WXImgLoaderDefaultImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = DCABAFFD1D029753001C8592 /* WXImgLoaderDefaultImpl.m */; };
+		DCABB0011D02975E001C8592 /* WXEventModule.m in Sources */ = {isa = PBXBuildFile; fileRef = DCABB0001D02975E001C8592 /* WXEventModule.m */; };
+		DCD286E01CF491AC00C601CA /* weex-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = DCD286DF1CF491AC00C601CA /* weex-icon.png */; };
+		EAEC716BE3E43DBC8494EC51 /* libPods-WeexDemo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7601607D735D7F8D88971230 /* libPods-WeexDemo.a */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		775BEE951C1E8ECC008D1629 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 775BEE731C1E8ECC008D1629 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 775BEE7A1C1E8ECC008D1629;
+			remoteInfo = WeexDemo;
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+		17036A5520FDF9AA0029AE3D /* WXApmGeneratorImpl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WXApmGeneratorImpl.h; path = extend/handler/WXApmGeneratorImpl.h; sourceTree = "<group>"; };
+		17036A5620FDF9AA0029AE3D /* WXApmGeneratorImpl.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = WXApmGeneratorImpl.m; path = extend/handler/WXApmGeneratorImpl.m; sourceTree = "<group>"; };
+		17036A5820FDF9DF0029AE3D /* WXApmImpl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WXApmImpl.h; path = extend/handler/WXApmImpl.h; sourceTree = "<group>"; };
+		17036A5920FDF9DF0029AE3D /* WXApmImpl.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = WXApmImpl.m; path = extend/handler/WXApmImpl.m; sourceTree = "<group>"; };
+		17C1DB55206B6729000E0CEB /* DebugAnalyzer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DebugAnalyzer.h; path = debug/DebugAnalyzer.h; sourceTree = "<group>"; };
+		17C1DB56206B675D000E0CEB /* DebugAnzlyzer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = DebugAnzlyzer.m; path = debug/DebugAnzlyzer.m; sourceTree = "<group>"; };
+		1888E2C5769382461DEDC97D /* Pods-WeexUITestDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WeexUITestDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-WeexUITestDemo/Pods-WeexUITestDemo.release.xcconfig"; sourceTree = "<group>"; };
+		2278B1B1FCE894EDAF9F0171 /* Pods-WeexUITestDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WeexUITestDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-WeexUITestDemo/Pods-WeexUITestDemo.debug.xcconfig"; sourceTree = "<group>"; };
+		22E4D2883CC56188A2CA9C13 /* Pods-WeexDemo.uitest.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WeexDemo.uitest.xcconfig"; path = "Pods/Target Support Files/Pods-WeexDemo/Pods-WeexDemo.uitest.xcconfig"; sourceTree = "<group>"; };
+		2AE88A2A1C8544E6003329DE /* WXScannerVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WXScannerVC.h; path = Scanner/WXScannerVC.h; sourceTree = "<group>"; };
+		2AE88A2B1C8544E6003329DE /* WXScannerVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WXScannerVC.m; path = Scanner/WXScannerVC.m; sourceTree = "<group>"; };
+		3375BEE421C74C5C003CAAB8 /* SRWebSocket+Weex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SRWebSocket+Weex.h"; sourceTree = "<group>"; };
+		3375BEE521C74C5C003CAAB8 /* WXWebSocketDefaultImpl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXWebSocketDefaultImpl.m; sourceTree = "<group>"; };
+		3375BEE621C74C5C003CAAB8 /* WXWebSocketDefaultImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXWebSocketDefaultImpl.h; sourceTree = "<group>"; };
+		3375BEE721C74C5C003CAAB8 /* SRWebSocket+Weex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "SRWebSocket+Weex.m"; sourceTree = "<group>"; };
+		564B94661DD9C65000441C8D /* WeexUITestDemo-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "WeexUITestDemo-Info.plist"; sourceTree = "<group>"; };
+		59EA0DA61D2E7D19004F904A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
+		5AF8846546DAC65CAC038806 /* Pods-WeexDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WeexDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-WeexDemo/Pods-WeexDemo.debug.xcconfig"; sourceTree = "<group>"; };
+		741DFE081DDDD519009B020F /* libstdc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libstdc++.tbd"; path = "usr/lib/libstdc++.tbd"; sourceTree = SDKROOT; };
+		7453E3641C9FA971001EB427 /* DemoDefine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoDefine.h; sourceTree = "<group>"; };
+		7475ACA01CD8444A0044E96C /* libsqlite3.0.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.0.tbd; path = usr/lib/libsqlite3.0.tbd; sourceTree = SDKROOT; };
+		7478481C1E0CD4910044500D /* WXSyncTestModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXSyncTestModule.h; sourceTree = "<group>"; };
+		7478481D1E0CD4910044500D /* WXSyncTestModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXSyncTestModule.m; sourceTree = "<group>"; };
+		747DF6661E2F176A005C53A8 /* UIView+UIThreadCheck.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+UIThreadCheck.h"; sourceTree = "<group>"; };
+		747DF6671E2F176A005C53A8 /* UIView+UIThreadCheck.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+UIThreadCheck.m"; sourceTree = "<group>"; };
+		74CC79E91C2B9E4700829368 /* UIViewController+WXDemoNaviBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+WXDemoNaviBar.h"; sourceTree = "<group>"; };
+		74CC79EA1C2B9E4700829368 /* UIViewController+WXDemoNaviBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+WXDemoNaviBar.m"; sourceTree = "<group>"; };
+		775BEE7B1C1E8ECC008D1629 /* WeexDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WeexDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		775BEE7F1C1E8ECC008D1629 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+		775BEE811C1E8ECC008D1629 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+		775BEE821C1E8ECC008D1629 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+		775BEE841C1E8ECC008D1629 /* WXDemoViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WXDemoViewController.h; sourceTree = "<group>"; };
+		775BEE851C1E8ECC008D1629 /* WXDemoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WXDemoViewController.m; sourceTree = "<group>"; };
+		775BEE8A1C1E8ECC008D1629 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+		775BEE8F1C1E8ECC008D1629 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		775BEE941C1E8ECC008D1629 /* WeexDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WeexDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+		775BEE981C1E8ECC008D1629 /* WeexDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WeexDemoTests.m; sourceTree = "<group>"; };
+		775BEE9A1C1E8ECC008D1629 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		84361D751CA10F8E00F43825 /* WeexUITestDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WeexUITestDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		847CAF2F1F39E3F100551725 /* WXExtModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXExtModule.h; sourceTree = "<group>"; };
+		847CAF301F39E3F100551725 /* WXExtModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXExtModule.m; sourceTree = "<group>"; };
+		9420131417A731ED089B0814 /* Pods-WeexDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WeexDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-WeexDemo/Pods-WeexDemo.release.xcconfig"; sourceTree = "<group>"; };
+		B83A6C5120FF16D50053BCEF /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
+		C43CDA021F1C6E01005A6B03 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
+		C47B78D01F299E27001D3B0C /* WXExtendCallNativeTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXExtendCallNativeTest.h; sourceTree = "<group>"; };
+		C47B78D11F299E27001D3B0C /* WXExtendCallNativeTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXExtendCallNativeTest.m; sourceTree = "<group>"; };
+		DC15A3C5200C505C009C8977 /* WXTitleBarModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WXTitleBarModule.h; path = extend/module/WXTitleBarModule.h; sourceTree = "<group>"; };
+		DC15A3C6200C505C009C8977 /* WXTitleBarModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = WXTitleBarModule.m; path = extend/module/WXTitleBarModule.m; sourceTree = "<group>"; };
+		DC15A3CE200E30FC009C8977 /* WXNavigationHandlerImpl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXNavigationHandlerImpl.m; sourceTree = "<group>"; };
+		DC15A3CF200E30FC009C8977 /* WXNavigationHandlerImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXNavigationHandlerImpl.h; sourceTree = "<group>"; };
+		DC20B8E41ECADA2500845F39 /* WXConfigCenterDefaultImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXConfigCenterDefaultImpl.h; sourceTree = "<group>"; };
+		DC20B8E51ECADA2500845F39 /* WXConfigCenterDefaultImpl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXConfigCenterDefaultImpl.m; sourceTree = "<group>"; };
+		DC5B53671E8CED9400E02125 /* WXScannerHistoryVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WXScannerHistoryVC.h; path = Scanner/WXScannerHistoryVC.h; sourceTree = "<group>"; };
+		DC5B53681E8CED9400E02125 /* WXScannerHistoryVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WXScannerHistoryVC.m; path = Scanner/WXScannerHistoryVC.m; sourceTree = "<group>"; };
+		DC5E503C1D0D97130059F0EB /* weex.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = weex.png; sourceTree = "<group>"; };
+		DC5E503D1D0D97130059F0EB /* weex@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "weex@2x.png"; sourceTree = "<group>"; };
+		DC65C4F91CEB032F00B2F84F /* bundlejs */ = {isa = PBXFileReference; lastKnownFileType = folder; path = bundlejs; sourceTree = "<group>"; };
+		DCABAFEF1D029685001C8592 /* WXATLoggerPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WXATLoggerPlugin.h; path = debug/WXATLoggerPlugin.h; sourceTree = "<group>"; };
+		DCABAFF01D029685001C8592 /* WXATLoggerPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WXATLoggerPlugin.m; path = debug/WXATLoggerPlugin.m; sourceTree = "<group>"; };
+		DCABAFF11D029685001C8592 /* WXATViewHierarchyPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WXATViewHierarchyPlugin.h; path = debug/WXATViewHierarchyPlugin.h; sourceTree = "<group>"; };
+		DCABAFF21D029685001C8592 /* WXATViewHierarchyPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WXATViewHierarchyPlugin.m; path = debug/WXATViewHierarchyPlugin.m; sourceTree = "<group>"; };
+		DCABAFF91D029748001C8592 /* WXSelectComponent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WXSelectComponent.h; path = extend/component/WXSelectComponent.h; sourceTree = "<group>"; };
+		DCABAFFA1D029748001C8592 /* WXSelectComponent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WXSelectComponent.m; path = extend/component/WXSelectComponent.m; sourceTree = "<group>"; };
+		DCABAFFC1D029753001C8592 /* WXImgLoaderDefaultImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WXImgLoaderDefaultImpl.h; path = extend/handler/WXImgLoaderDefaultImpl.h; sourceTree = "<group>"; };
+		DCABAFFD1D029753001C8592 /* WXImgLoaderDefaultImpl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WXImgLoaderDefaultImpl.m; path = extend/handler/WXImgLoaderDefaultImpl.m; sourceTree = "<group>"; };
+		DCABAFFF1D02975E001C8592 /* WXEventModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WXEventModule.h; path = extend/module/WXEventModule.h; sourceTree = "<group>"; };
+		DCABB0001D02975E001C8592 /* WXEventModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WXEventModule.m; path = extend/module/WXEventModule.m; sourceTree = "<group>"; };
+		DCD286DF1CF491AC00C601CA /* weex-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "weex-icon.png"; path = "WeexDemo/weex-icon.png"; sourceTree = "<group>"; };
+		E48C20F443AA337D1FE97622 /* libPods-WeexUITestDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-WeexUITestDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		775BEE781C1E8ECC008D1629 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				B83A6C5220FF16D50053BCEF /* libc++.tbd in Frameworks */,
+				C43CDA031F1C6E01005A6B03 /* libz.tbd in Frameworks */,
+				DC6DD9D21CFE9BC400549297 /* libsqlite3.0.tbd in Frameworks */,
+				EAEC716BE3E43DBC8494EC51 /* libPods-WeexDemo.a in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		775BEE911C1E8ECC008D1629 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		84361D3C1CA10F8E00F43825 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				84D7CAC71CE3266C00D48D46 /* libsqlite3.0.tbd in Frameworks */,
+				8A0B5EFFF75BF82EA481983D /* libPods-WeexUITestDemo.a in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		2AE88A291C8544D7003329DE /* scanner */ = {
+			isa = PBXGroup;
+			children = (
+				2AE88A2A1C8544E6003329DE /* WXScannerVC.h */,
+				2AE88A2B1C8544E6003329DE /* WXScannerVC.m */,
+				DC5B53671E8CED9400E02125 /* WXScannerHistoryVC.h */,
+				DC5B53681E8CED9400E02125 /* WXScannerHistoryVC.m */,
+			);
+			name = scanner;
+			sourceTree = "<group>";
+		};
+		327BB19797F63D5309FB91BF /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				B83A6C5120FF16D50053BCEF /* libc++.tbd */,
+				C43CDA021F1C6E01005A6B03 /* libz.tbd */,
+				741DFE081DDDD519009B020F /* libstdc++.tbd */,
+				7475ACA01CD8444A0044E96C /* libsqlite3.0.tbd */,
+				E48C20F443AA337D1FE97622 /* libPods-WeexUITestDemo.a */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		3375BEE321C74C5C003CAAB8 /* Websocket */ = {
+			isa = PBXGroup;
+			children = (
+				3375BEE421C74C5C003CAAB8 /* SRWebSocket+Weex.h */,
+				3375BEE521C74C5C003CAAB8 /* WXWebSocketDefaultImpl.m */,
+				3375BEE621C74C5C003CAAB8 /* WXWebSocketDefaultImpl.h */,
+				3375BEE721C74C5C003CAAB8 /* SRWebSocket+Weex.m */,
+			);
+			path = Websocket;
+			sourceTree = "<group>";
+		};
+		74CC79EC1C2B9FC600829368 /* Demo */ = {
+			isa = PBXGroup;
+			children = (
+				DCABAFF51D0296DB001C8592 /* extend */,
+				D5ADF0861C77133B00597CA6 /* Source */,
+			);
+			name = Demo;
+			sourceTree = "<group>";
+		};
+		775BEE721C1E8ECC008D1629 = {
+			isa = PBXGroup;
+			children = (
+				775BEE7D1C1E8ECC008D1629 /* WeexDemo */,
+				775BEE971C1E8ECC008D1629 /* WeexDemoTests */,
+				775BEE7C1C1E8ECC008D1629 /* Products */,
+				A9E45DD060512F73B9F51C03 /* Pods */,
+				327BB19797F63D5309FB91BF /* Frameworks */,
+				DC65C4421CEB006C00B2F84F /* resource */,
+				564B94661DD9C65000441C8D /* WeexUITestDemo-Info.plist */,
+			);
+			sourceTree = "<group>";
+		};
+		775BEE7C1C1E8ECC008D1629 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				775BEE7B1C1E8ECC008D1629 /* WeexDemo.app */,
+				775BEE941C1E8ECC008D1629 /* WeexDemoTests.xctest */,
+				84361D751CA10F8E00F43825 /* WeexUITestDemo.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		775BEE7D1C1E8ECC008D1629 /* WeexDemo */ = {
+			isa = PBXGroup;
+			children = (
+				74CC79EC1C2B9FC600829368 /* Demo */,
+				775BEE8A1C1E8ECC008D1629 /* Assets.xcassets */,
+				775BEE8F1C1E8ECC008D1629 /* Info.plist */,
+				59EA0DA61D2E7D19004F904A /* Images.xcassets */,
+				775BEE7E1C1E8ECC008D1629 /* Supporting Files */,
+			);
+			path = WeexDemo;
+			sourceTree = "<group>";
+		};
+		775BEE7E1C1E8ECC008D1629 /* Supporting Files */ = {
+			isa = PBXGroup;
+			children = (
+				775BEE7F1C1E8ECC008D1629 /* main.m */,
+			);
+			name = "Supporting Files";
+			sourceTree = "<group>";
+		};
+		775BEE971C1E8ECC008D1629 /* WeexDemoTests */ = {
+			isa = PBXGroup;
+			children = (
+				775BEE981C1E8ECC008D1629 /* WeexDemoTests.m */,
+				775BEE9A1C1E8ECC008D1629 /* Info.plist */,
+			);
+			path = WeexDemoTests;
+			sourceTree = "<group>";
+		};
+		A9E45DD060512F73B9F51C03 /* Pods */ = {
+			isa = PBXGroup;
+			children = (
+				5AF8846546DAC65CAC038806 /* Pods-WeexDemo.debug.xcconfig */,
+				9420131417A731ED089B0814 /* Pods-WeexDemo.release.xcconfig */,
+				22E4D2883CC56188A2CA9C13 /* Pods-WeexDemo.uitest.xcconfig */,
+				2278B1B1FCE894EDAF9F0171 /* Pods-WeexUITestDemo.debug.xcconfig */,
+				1888E2C5769382461DEDC97D /* Pods-WeexUITestDemo.release.xcconfig */,
+			);
+			name = Pods;
+			sourceTree = "<group>";
+		};
+		D5ADF0861C77133B00597CA6 /* Source */ = {
+			isa = PBXGroup;
+			children = (
+				2AE88A291C8544D7003329DE /* scanner */,
+				DCABAFED1D029642001C8592 /* debug */,
+				74CC79E91C2B9E4700829368 /* UIViewController+WXDemoNaviBar.h */,
+				74CC79EA1C2B9E4700829368 /* UIViewController+WXDemoNaviBar.m */,
+				775BEE811C1E8ECC008D1629 /* AppDelegate.h */,
+				775BEE821C1E8ECC008D1629 /* AppDelegate.m */,
+				775BEE841C1E8ECC008D1629 /* WXDemoViewController.h */,
+				775BEE851C1E8ECC008D1629 /* WXDemoViewController.m */,
+				747DF6661E2F176A005C53A8 /* UIView+UIThreadCheck.h */,
+				747DF6671E2F176A005C53A8 /* UIView+UIThreadCheck.m */,
+				7453E3641C9FA971001EB427 /* DemoDefine.h */,
+				C47B78D01F299E27001D3B0C /* WXExtendCallNativeTest.h */,
+				C47B78D11F299E27001D3B0C /* WXExtendCallNativeTest.m */,
+			);
+			name = Source;
+			sourceTree = "<group>";
+		};
+		DC65C4421CEB006C00B2F84F /* resource */ = {
+			isa = PBXGroup;
+			children = (
+				DCD286DF1CF491AC00C601CA /* weex-icon.png */,
+				DC5E503C1D0D97130059F0EB /* weex.png */,
+				DC5E503D1D0D97130059F0EB /* weex@2x.png */,
+				DC65C4F91CEB032F00B2F84F /* bundlejs */,
+			);
+			name = resource;
+			sourceTree = "<group>";
+		};
+		DCABAFED1D029642001C8592 /* debug */ = {
+			isa = PBXGroup;
+			children = (
+				DCABAFEF1D029685001C8592 /* WXATLoggerPlugin.h */,
+				DCABAFF01D029685001C8592 /* WXATLoggerPlugin.m */,
+				DCABAFF11D029685001C8592 /* WXATViewHierarchyPlugin.h */,
+				DCABAFF21D029685001C8592 /* WXATViewHierarchyPlugin.m */,
+				17C1DB55206B6729000E0CEB /* DebugAnalyzer.h */,
+				17C1DB56206B675D000E0CEB /* DebugAnzlyzer.m */,
+			);
+			name = debug;
+			sourceTree = "<group>";
+		};
+		DCABAFF51D0296DB001C8592 /* extend */ = {
+			isa = PBXGroup;
+			children = (
+				DCABAFF81D029716001C8592 /* component */,
+				DCABAFF71D0296E8001C8592 /* handler */,
+				DCABAFF61D0296E2001C8592 /* module */,
+			);
+			name = extend;
+			sourceTree = "<group>";
+		};
+		DCABAFF61D0296E2001C8592 /* module */ = {
+			isa = PBXGroup;
+			children = (
+				DCABAFFF1D02975E001C8592 /* WXEventModule.h */,
+				DCABB0001D02975E001C8592 /* WXEventModule.m */,
+				DC15A3C5200C505C009C8977 /* WXTitleBarModule.h */,
+				DC15A3C6200C505C009C8977 /* WXTitleBarModule.m */,
+				7478481C1E0CD4910044500D /* WXSyncTestModule.h */,
+				7478481D1E0CD4910044500D /* WXSyncTestModule.m */,
+				847CAF2F1F39E3F100551725 /* WXExtModule.h */,
+				847CAF301F39E3F100551725 /* WXExtModule.m */,
+			);
+			name = module;
+			sourceTree = "<group>";
+		};
+		DCABAFF71D0296E8001C8592 /* handler */ = {
+			isa = PBXGroup;
+			children = (
+				3375BEE321C74C5C003CAAB8 /* Websocket */,
+				DC15A3CF200E30FC009C8977 /* WXNavigationHandlerImpl.h */,
+				DC15A3CE200E30FC009C8977 /* WXNavigationHandlerImpl.m */,
+				DC20B8E41ECADA2500845F39 /* WXConfigCenterDefaultImpl.h */,
+				DC20B8E51ECADA2500845F39 /* WXConfigCenterDefaultImpl.m */,
+				DCABAFFC1D029753001C8592 /* WXImgLoaderDefaultImpl.h */,
+				DCABAFFD1D029753001C8592 /* WXImgLoaderDefaultImpl.m */,
+				17036A5520FDF9AA0029AE3D /* WXApmGeneratorImpl.h */,
+				17036A5620FDF9AA0029AE3D /* WXApmGeneratorImpl.m */,
+				17036A5820FDF9DF0029AE3D /* WXApmImpl.h */,
+				17036A5920FDF9DF0029AE3D /* WXApmImpl.m */,
+			);
+			name = handler;
+			sourceTree = "<group>";
+		};
+		DCABAFF81D029716001C8592 /* component */ = {
+			isa = PBXGroup;
+			children = (
+				DCABAFF91D029748001C8592 /* WXSelectComponent.h */,
+				DCABAFFA1D029748001C8592 /* WXSelectComponent.m */,
+			);
+			name = component;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		775BEE7A1C1E8ECC008D1629 /* WeexDemo */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 775BEEA81C1E8ECC008D1629 /* Build configuration list for PBXNativeTarget "WeexDemo" */;
+			buildPhases = (
+				B5825066F03BDD65A25F2701 /* [CP] Check Pods Manifest.lock */,
+				74CC7A221C2C13BF00829368 /* Start Samples */,
+				775BEE771C1E8ECC008D1629 /* Sources */,
+				775BEE781C1E8ECC008D1629 /* Frameworks */,
+				775BEE791C1E8ECC008D1629 /* Resources */,
+				C715566148067A7FFAB7797D /* [CP] Copy Pods Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = WeexDemo;
+			productName = WeexDemo;
+			productReference = 775BEE7B1C1E8ECC008D1629 /* WeexDemo.app */;
+			productType = "com.apple.product-type.application";
+		};
+		775BEE931C1E8ECC008D1629 /* WeexDemoTests */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 775BEEAB1C1E8ECC008D1629 /* Build configuration list for PBXNativeTarget "WeexDemoTests" */;
+			buildPhases = (
+				775BEE901C1E8ECC008D1629 /* Sources */,
+				775BEE911C1E8ECC008D1629 /* Frameworks */,
+				775BEE921C1E8ECC008D1629 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				775BEE961C1E8ECC008D1629 /* PBXTargetDependency */,
+			);
+			name = WeexDemoTests;
+			productName = WeexDemoTests;
+			productReference = 775BEE941C1E8ECC008D1629 /* WeexDemoTests.xctest */;
+			productType = "com.apple.product-type.bundle.unit-test";
+		};
+		84361D261CA10F8E00F43825 /* WeexUITestDemo */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 84361D711CA10F8E00F43825 /* Build configuration list for PBXNativeTarget "WeexUITestDemo" */;
+			buildPhases = (
+				84361D271CA10F8E00F43825 /* [CP] Check Pods Manifest.lock */,
+				84361D291CA10F8E00F43825 /* Sources */,
+				84361D3C1CA10F8E00F43825 /* Frameworks */,
+				84361D431CA10F8E00F43825 /* Resources */,
+				84361D6F1CA10F8E00F43825 /* [CP] Copy Pods Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = WeexUITestDemo;
+			productName = WeexDemo;
+			productReference = 84361D751CA10F8E00F43825 /* WeexUITestDemo.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		775BEE731C1E8ECC008D1629 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0710;
+				ORGANIZATIONNAME = taobao;
+				TargetAttributes = {
+					775BEE7A1C1E8ECC008D1629 = {
+						CreatedOnToolsVersion = 7.1.1;
+					};
+					775BEE931C1E8ECC008D1629 = {
+						CreatedOnToolsVersion = 7.1.1;
+						DevelopmentTeam = 445VCMGQD2;
+						TestTargetID = 775BEE7A1C1E8ECC008D1629;
+					};
+				};
+			};
+			buildConfigurationList = 775BEE761C1E8ECC008D1629 /* Build configuration list for PBXProject "WeexDemo" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				English,
+				en,
+				Base,
+			);
+			mainGroup = 775BEE721C1E8ECC008D1629;
+			productRefGroup = 775BEE7C1C1E8ECC008D1629 /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				775BEE7A1C1E8ECC008D1629 /* WeexDemo */,
+				775BEE931C1E8ECC008D1629 /* WeexDemoTests */,
+				84361D261CA10F8E00F43825 /* WeexUITestDemo */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		775BEE791C1E8ECC008D1629 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				DC5E503E1D0D97130059F0EB /* weex.png in Resources */,
+				DC5E503F1D0D97130059F0EB /* weex@2x.png in Resources */,
+				DCD286E01CF491AC00C601CA /* weex-icon.png in Resources */,
+				59EA0DA71D2E7D19004F904A /* Images.xcassets in Resources */,
+				564B94671DD9C65000441C8D /* WeexUITestDemo-Info.plist in Resources */,
+				DC65C4FA1CEB032F00B2F84F /* bundlejs in Resources */,
+				775BEE8B1C1E8ECC008D1629 /* Assets.xcassets in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		775BEE921C1E8ECC008D1629 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		84361D431CA10F8E00F43825 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				84361D5B1CA10F8E00F43825 /* Assets.xcassets in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		74CC7A221C2C13BF00829368 /* Start Samples */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			name = "Start Samples";
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "DEST=$CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH\n\nif [[ \"$CONFIGURATION\" = \"Debug\" && \"$PLATFORM_NAME\" != \"iphonesimulator\" ]]; then\nipconfig getifaddr en0 | awk '{printf(\"%s\",$0)}' > \"$DEST/localServer-ip.txt\"\nfi";
+		};
+		84361D271CA10F8E00F43825 /* [CP] Check Pods Manifest.lock */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+				"${PODS_ROOT}/Manifest.lock",
+			);
+			name = "[CP] Check Pods Manifest.lock";
+			outputPaths = (
+				"$(DERIVED_FILE_DIR)/Pods-WeexUITestDemo-checkManifestLockResult.txt",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			showEnvVarsInLog = 0;
+		};
+		84361D6F1CA10F8E00F43825 /* [CP] Copy Pods Resources */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-WeexUITestDemo/Pods-WeexUITestDemo-resources.sh",
+				"${PODS_ROOT}/ATSDK-Weex/ATSDK.framework/Versions/A/Resources/ATSDK.bundle",
+				"${PODS_ROOT}/ATSDK-Weex/ATSDK.framework/Versions/A/Resources/en.lproj",
+				"${PODS_ROOT}/ATSDK-Weex/ATSDK.framework/Versions/A/Resources/zh-Hans.lproj",
+				"${PODS_ROOT}/WeexSDK/pre-build/native-bundle-main.js",
+				"${PODS_ROOT}/WeexSDK/pre-build/weex-main-jsfm.js",
+				"${PODS_ROOT}/WeexSDK/pre-build/weex-polyfill.js",
+				"${PODS_ROOT}/WeexSDK/pre-build/weex-rax-api.js",
+				"${PODS_ROOT}/WeexSDK/ios/sdk/WeexSDK/Resources/wx_load_error@3x.png",
+			);
+			name = "[CP] Copy Pods Resources";
+			outputPaths = (
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ATSDK.bundle",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/en.lproj",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/zh-Hans.lproj",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/native-bundle-main.js",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/weex-main-jsfm.js",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/weex-polyfill.js",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/weex-rax-api.js",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/wx_load_error@3x.png",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-WeexUITestDemo/Pods-WeexUITestDemo-resources.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
+		B5825066F03BDD65A25F2701 /* [CP] Check Pods Manifest.lock */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+				"${PODS_ROOT}/Manifest.lock",
+			);
+			name = "[CP] Check Pods Manifest.lock";
+			outputPaths = (
+				"$(DERIVED_FILE_DIR)/Pods-WeexDemo-checkManifestLockResult.txt",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			showEnvVarsInLog = 0;
+		};
+		C715566148067A7FFAB7797D /* [CP] Copy Pods Resources */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-WeexDemo/Pods-WeexDemo-resources.sh",
+				"${PODS_ROOT}/ATSDK-Weex/ATSDK.framework/Versions/A/Resources/ATSDK.bundle",
+				"${PODS_ROOT}/ATSDK-Weex/ATSDK.framework/Versions/A/Resources/en.lproj",
+				"${PODS_ROOT}/ATSDK-Weex/ATSDK.framework/Versions/A/Resources/zh-Hans.lproj",
+				"${PODS_ROOT}/WeexSDK/pre-build/native-bundle-main.js",
+				"${PODS_ROOT}/WeexSDK/pre-build/weex-main-jsfm.js",
+				"${PODS_ROOT}/WeexSDK/pre-build/weex-polyfill.js",
+				"${PODS_ROOT}/WeexSDK/pre-build/weex-rax-api.js",
+				"${PODS_ROOT}/WeexSDK/ios/sdk/WeexSDK/Resources/wx_load_error@3x.png",
+			);
+			name = "[CP] Copy Pods Resources";
+			outputPaths = (
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ATSDK.bundle",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/en.lproj",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/zh-Hans.lproj",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/native-bundle-main.js",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/weex-main-jsfm.js",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/weex-polyfill.js",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/weex-rax-api.js",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/wx_load_error@3x.png",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-WeexDemo/Pods-WeexDemo-resources.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		775BEE771C1E8ECC008D1629 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				17C1DB57206B675D000E0CEB /* DebugAnzlyzer.m in Sources */,
+				DCABAFF31D029685001C8592 /* WXATLoggerPlugin.m in Sources */,
+				DC15A3D0200E30FC009C8977 /* WXNavigationHandlerImpl.m in Sources */,
+				3375BEE921C74C5C003CAAB8 /* SRWebSocket+Weex.m in Sources */,
+				2AE88A2C1C8544E6003329DE /* WXScannerVC.m in Sources */,
+				17036A5720FDF9AA0029AE3D /* WXApmGeneratorImpl.m in Sources */,
+				775BEE861C1E8ECC008D1629 /* WXDemoViewController.m in Sources */,
+				DC5B53691E8CED9400E02125 /* WXScannerHistoryVC.m in Sources */,
+				74CC79EB1C2B9E4700829368 /* UIViewController+WXDemoNaviBar.m in Sources */,
+				DCABB0011D02975E001C8592 /* WXEventModule.m in Sources */,
+				7478481E1E0CD4910044500D /* WXSyncTestModule.m in Sources */,
+				775BEE831C1E8ECC008D1629 /* AppDelegate.m in Sources */,
+				847CAF311F39E3F100551725 /* WXExtModule.m in Sources */,
+				DC15A3C7200C505C009C8977 /* WXTitleBarModule.m in Sources */,
+				17036A5A20FDF9DF0029AE3D /* WXApmImpl.m in Sources */,
+				DC20B8E61ECADA2500845F39 /* WXConfigCenterDefaultImpl.m in Sources */,
+				DCABAFF41D029685001C8592 /* WXATViewHierarchyPlugin.m in Sources */,
+				775BEE801C1E8ECC008D1629 /* main.m in Sources */,
+				DCABAFFE1D029753001C8592 /* WXImgLoaderDefaultImpl.m in Sources */,
+				747DF6681E2F176A005C53A8 /* UIView+UIThreadCheck.m in Sources */,
+				C47B78D21F299E27001D3B0C /* WXExtendCallNativeTest.m in Sources */,
+				3375BEE821C74C5C003CAAB8 /* WXWebSocketDefaultImpl.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		775BEE901C1E8ECC008D1629 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				775BEE991C1E8ECC008D1629 /* WeexDemoTests.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		84361D291CA10F8E00F43825 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				847CAF2D1F39BBB900551725 /* WXScannerHistoryVC.m in Sources */,
+				847CAF2C1F39BB8A00551725 /* WXATLoggerPlugin.m in Sources */,
+				84361D2F1CA10F8E00F43825 /* WXScannerVC.m in Sources */,
+				84361D331CA10F8E00F43825 /* WXDemoViewController.m in Sources */,
+				84361D371CA10F8E00F43825 /* UIViewController+WXDemoNaviBar.m in Sources */,
+				DCA812FA1D0401500029BF62 /* WXEventModule.m in Sources */,
+				846FC8DA1E1B853100949E7D /* WXSyncTestModule.m in Sources */,
+				84361D381CA10F8E00F43825 /* AppDelegate.m in Sources */,
+				847CAF2E1F39BBFB00551725 /* WXConfigCenterDefaultImpl.m in Sources */,
+				846FC8DB1E1B853600949E7D /* WXATViewHierarchyPlugin.m in Sources */,
+				84361D3B1CA10F8E00F43825 /* main.m in Sources */,
+				DCA812FB1D0401570029BF62 /* WXImgLoaderDefaultImpl.m in Sources */,
+				847CAF2B1F39BB6B00551725 /* UIView+UIThreadCheck.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		775BEE961C1E8ECC008D1629 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 775BEE7A1C1E8ECC008D1629 /* WeexDemo */;
+			targetProxy = 775BEE951C1E8ECC008D1629 /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+		775BEEA61C1E8ECC008D1629 /* 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 = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_GENERATE_TEST_COVERAGE_FILES = YES;
+				GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+				MTL_ENABLE_DEBUG_INFO = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Debug;
+		};
+		775BEEA71C1E8ECC008D1629 /* 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 = "iPhone Distribution";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
+				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 = 9.0;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		775BEEA91C1E8ECC008D1629 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 5AF8846546DAC65CAC038806 /* Pods-WeexDemo.debug.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				DEVELOPMENT_TEAM = "";
+				ENABLE_BITCODE = NO;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/WeexDemo",
+					"$(PROJECT_DIR)",
+				);
+				GCC_TREAT_WARNINGS_AS_ERRORS = NO;
+				INFOPLIST_FILE = WeexDemo/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+				OTHER_LDFLAGS = (
+					"$(inherited)",
+					"-licucore",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.taobao.WeexPlayground;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE = "";
+				TARGETED_DEVICE_FAMILY = 1;
+			};
+			name = Debug;
+		};
+		775BEEAA1C1E8ECC008D1629 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 9420131417A731ED089B0814 /* Pods-WeexDemo.release.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+				CODE_SIGN_IDENTITY = "iPhone Distribution";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
+				DEVELOPMENT_TEAM = "";
+				ENABLE_BITCODE = NO;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/WeexDemo",
+					"$(PROJECT_DIR)",
+				);
+				GCC_TREAT_WARNINGS_AS_ERRORS = NO;
+				INFOPLIST_FILE = WeexDemo/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+				OTHER_LDFLAGS = (
+					"$(inherited)",
+					"-licucore",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.taobao.WeexPlayground;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE = "";
+				TARGETED_DEVICE_FAMILY = 1;
+			};
+			name = Release;
+		};
+		775BEEAC1C1E8ECC008D1629 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				BUNDLE_LOADER = "$(TEST_HOST)";
+				INFOPLIST_FILE = WeexDemoTests/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = com.taobao.WeexDemoTests;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WeexDemo.app/WeexDemo";
+			};
+			name = Debug;
+		};
+		775BEEAD1C1E8ECC008D1629 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				BUNDLE_LOADER = "$(TEST_HOST)";
+				INFOPLIST_FILE = WeexDemoTests/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = com.taobao.WeexDemoTests;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WeexDemo.app/WeexDemo";
+			};
+			name = Release;
+		};
+		84361D721CA10F8E00F43825 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 2278B1B1FCE894EDAF9F0171 /* Pods-WeexUITestDemo.debug.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				ENABLE_BITCODE = NO;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/WeexDemo",
+					"$(PROJECT_DIR)",
+				);
+				GCC_GENERATE_TEST_COVERAGE_FILES = YES;
+				GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"$(inherited)",
+					"COCOAPODS=1",
+					"UITEST=1",
+				);
+				GCC_TREAT_WARNINGS_AS_ERRORS = NO;
+				INFOPLIST_FILE = "WeexUITestDemo-Info.plist";
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+				MODULE_NAME = NO;
+				OTHER_LDFLAGS = (
+					"$(inherited)",
+					"-licucore",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.taobao.WeexDemo.uitest;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE = "";
+			};
+			name = Debug;
+		};
+		84361D741CA10F8E00F43825 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 1888E2C5769382461DEDC97D /* Pods-WeexUITestDemo.release.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				ENABLE_BITCODE = NO;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/WeexDemo",
+					"$(PROJECT_DIR)",
+				);
+				GCC_GENERATE_TEST_COVERAGE_FILES = YES;
+				GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;
+				GCC_TREAT_WARNINGS_AS_ERRORS = NO;
+				INFOPLIST_FILE = "WeexUITestDemo-Info.plist";
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+				MODULE_NAME = NO;
+				OTHER_LDFLAGS = (
+					"$(inherited)",
+					"-licucore",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.taobao.WeexDemo.uitest;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE = "";
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		775BEE761C1E8ECC008D1629 /* Build configuration list for PBXProject "WeexDemo" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				775BEEA61C1E8ECC008D1629 /* Debug */,
+				775BEEA71C1E8ECC008D1629 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Debug;
+		};
+		775BEEA81C1E8ECC008D1629 /* Build configuration list for PBXNativeTarget "WeexDemo" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				775BEEA91C1E8ECC008D1629 /* Debug */,
+				775BEEAA1C1E8ECC008D1629 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Debug;
+		};
+		775BEEAB1C1E8ECC008D1629 /* Build configuration list for PBXNativeTarget "WeexDemoTests" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				775BEEAC1C1E8ECC008D1629 /* Debug */,
+				775BEEAD1C1E8ECC008D1629 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Debug;
+		};
+		84361D711CA10F8E00F43825 /* Build configuration list for PBXNativeTarget "WeexUITestDemo" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				84361D721CA10F8E00F43825 /* Debug */,
+				84361D741CA10F8E00F43825 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Debug;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 775BEE731C1E8ECC008D1629 /* Project object */;
+}
diff --git a/ios/WeexDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/WeexDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/ios/WeexDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:">
+   </FileRef>
+</Workspace>
diff --git a/ios/WeexDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/WeexDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/ios/WeexDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+<?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>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>
diff --git a/ios/WeexDemo.xcodeproj/project.xcworkspace/xcuserdata/wm.xcuserdatad/UserInterfaceState.xcuserstate b/ios/WeexDemo.xcodeproj/project.xcworkspace/xcuserdata/wm.xcuserdatad/UserInterfaceState.xcuserstate
new file mode 100644
index 0000000..d363914
--- /dev/null
+++ b/ios/WeexDemo.xcodeproj/project.xcworkspace/xcuserdata/wm.xcuserdatad/UserInterfaceState.xcuserstate
Binary files differ
diff --git a/ios/WeexDemo.xcodeproj/xcshareddata/xcschemes/WeexDemo.xcscheme b/ios/WeexDemo.xcodeproj/xcshareddata/xcschemes/WeexDemo.xcscheme
new file mode 100644
index 0000000..a33c31d
--- /dev/null
+++ b/ios/WeexDemo.xcodeproj/xcshareddata/xcschemes/WeexDemo.xcscheme
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "0710"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "775BEE7A1C1E8ECC008D1629"
+               BuildableName = "WeexDemo.app"
+               BlueprintName = "WeexDemo"
+               ReferencedContainer = "container:WeexDemo.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      codeCoverageEnabled = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "775BEE931C1E8ECC008D1629"
+               BuildableName = "WeexDemoTests.xctest"
+               BlueprintName = "WeexDemoTests"
+               ReferencedContainer = "container:WeexDemo.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "775BEE9E1C1E8ECC008D1629"
+               BuildableName = "WeexDemoUITests.xctest"
+               BlueprintName = "WeexDemoUITests"
+               ReferencedContainer = "container:WeexDemo.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "775BEE7A1C1E8ECC008D1629"
+            BuildableName = "WeexDemo.app"
+            BlueprintName = "WeexDemo"
+            ReferencedContainer = "container:WeexDemo.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "775BEE7A1C1E8ECC008D1629"
+            BuildableName = "WeexDemo.app"
+            BlueprintName = "WeexDemo"
+            ReferencedContainer = "container:WeexDemo.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+      <EnvironmentVariables>
+         <EnvironmentVariable
+            key = "OS_ACTIVITY_MODE"
+            value = "disable"
+            isEnabled = "NO">
+         </EnvironmentVariable>
+         <EnvironmentVariable
+            key = "JSC_logGC"
+            value = "1"
+            isEnabled = "NO">
+         </EnvironmentVariable>
+      </EnvironmentVariables>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "775BEE7A1C1E8ECC008D1629"
+            BuildableName = "WeexDemo.app"
+            BlueprintName = "WeexDemo"
+            ReferencedContainer = "container:WeexDemo.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/ios/WeexDemo.xcodeproj/xcshareddata/xcschemes/WeexUITestDemo.xcscheme b/ios/WeexDemo.xcodeproj/xcshareddata/xcschemes/WeexUITestDemo.xcscheme
new file mode 100644
index 0000000..6a68091
--- /dev/null
+++ b/ios/WeexDemo.xcodeproj/xcshareddata/xcschemes/WeexUITestDemo.xcscheme
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "0720"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "84361D261CA10F8E00F43825"
+               BuildableName = "WeexUITestDemo.app"
+               BlueprintName = "WeexUITestDemo"
+               ReferencedContainer = "container:WeexDemo.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+      </Testables>
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "84361D261CA10F8E00F43825"
+            BuildableName = "WeexUITestDemo.app"
+            BlueprintName = "WeexUITestDemo"
+            ReferencedContainer = "container:WeexDemo.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "84361D261CA10F8E00F43825"
+            BuildableName = "WeexUITestDemo.app"
+            BlueprintName = "WeexUITestDemo"
+            ReferencedContainer = "container:WeexDemo.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "84361D261CA10F8E00F43825"
+            BuildableName = "WeexUITestDemo.app"
+            BlueprintName = "WeexUITestDemo"
+            ReferencedContainer = "container:WeexDemo.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/ios/WeexDemo.xcworkspace/contents.xcworkspacedata b/ios/WeexDemo.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..599b710
--- /dev/null
+++ b/ios/WeexDemo.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "group:WeexDemo.xcodeproj">
+   </FileRef>
+   <FileRef
+      location = "group:Pods/Pods.xcodeproj">
+   </FileRef>
+</Workspace>
diff --git a/ios/WeexDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/WeexDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/ios/WeexDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+<?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>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>
diff --git a/ios/WeexDemo.xcworkspace/xcuserdata/wm.xcuserdatad/UserInterfaceState.xcuserstate b/ios/WeexDemo.xcworkspace/xcuserdata/wm.xcuserdatad/UserInterfaceState.xcuserstate
new file mode 100644
index 0000000..94cd2ee
--- /dev/null
+++ b/ios/WeexDemo.xcworkspace/xcuserdata/wm.xcuserdatad/UserInterfaceState.xcuserstate
Binary files differ
diff --git a/ios/WeexDemo/AppDelegate.h b/ios/WeexDemo/AppDelegate.h
new file mode 100644
index 0000000..14c0bef
--- /dev/null
+++ b/ios/WeexDemo/AppDelegate.h
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <UIKit/UIKit.h>
+
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate,UIAlertViewDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+@property (strong, nonatomic) NSString *latestVer;
+@property (assign, nonatomic) BOOL allowRotation;
+
+@end
diff --git a/ios/WeexDemo/AppDelegate.m b/ios/WeexDemo/AppDelegate.m
new file mode 100644
index 0000000..64aba4e
--- /dev/null
+++ b/ios/WeexDemo/AppDelegate.m
@@ -0,0 +1,290 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "AppDelegate.h"
+#import "WXDemoViewController.h"
+#import "UIViewController+WXDemoNaviBar.h"
+#import "WXEventModule.h"
+#import "WXImgLoaderDefaultImpl.h"
+#import "DemoDefine.h"
+#import "WXScannerVC.h"
+#import "WXScannerHistoryVC.h"
+#import "WXSyncTestModule.h"
+#import "WXExtModule.h"
+#import "UIView+UIThreadCheck.h"
+#import <WeexSDK/WeexSDK.h>
+#import <AVFoundation/AVFoundation.h>
+#import <ATSDK/ATManager.h>
+#import "WXConfigCenterProtocol.h"
+#import "WXConfigCenterDefaultImpl.h"
+#import "WXNavigationHandlerImpl.h"
+//#import "WXAnalyzerCenter.h"
+#import "WXApmGeneratorImpl.h"
+#import "WXWebSocketDefaultImpl.h"
+#import <WeexPluginLoader/WeexPluginLoader.h>
+
+#ifdef DEBUG
+#import "DebugAnalyzer.h"
+#endif
+
+@interface AppDelegate ()
+@end
+
+@implementation AppDelegate
+
+#pragma mark
+#pragma mark application
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
+    self.window.backgroundColor = [UIColor whiteColor];
+    
+    [self initWeexSDK];
+    
+    self.window.rootViewController = [[WXRootViewController alloc] initWithRootViewController:[self demoController]];
+    [self.window makeKeyAndVisible];
+    
+    [self startSplashScreen];
+    
+#if DEBUG
+    // check if there are any UI changes on main thread.
+    [UIView wx_checkUIThread];
+#endif
+    
+    return YES;
+}
+
+- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
+{
+    if (_allowRotation) {
+        return UIInterfaceOrientationMaskAllButUpsideDown;
+    }
+    else {
+        return UIInterfaceOrientationMaskPortrait;
+    }
+}
+
+-(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
+{
+    if ([shortcutItem.type isEqualToString:QRSCAN]) {
+        WXScannerVC * scanViewController = [[WXScannerVC alloc] init];
+        [(WXRootViewController*)self.window.rootViewController pushViewController:scanViewController animated:YES];
+    }
+    if ([shortcutItem.type isEqualToString:QRSCAN_HISTORY]) {
+        WXScannerHistoryVC *scannerHistoryVC = [WXScannerHistoryVC new];
+        [(WXRootViewController*)self.window.rootViewController pushViewController:scannerHistoryVC animated:YES];
+    }
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application
+{
+    
+#ifdef UITEST
+#if !TARGET_IPHONE_SIMULATOR
+    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
+    NSString *documentsDirectory = [paths objectAtIndex:0];
+    setenv("GCOV_PREFIX", [documentsDirectory cStringUsingEncoding:NSUTF8StringEncoding], 1);
+    setenv("GCOV_PREFIX_STRIP", "6", 1);
+#endif
+    extern void __gcov_flush(void);
+    __gcov_flush();
+#endif
+}
+
+- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
+{
+    NSString *newUrlStr = url.absoluteString;
+    if([url.scheme isEqualToString:@"wxpage"]) {
+        newUrlStr = [newUrlStr stringByReplacingOccurrencesOfString:@"wxpage://" withString:@"http://"];
+    }
+    UIViewController * viewController = [self demoController];
+    ((WXDemoViewController*)viewController).url = [NSURL URLWithString:newUrlStr];
+    [(WXRootViewController*)self.window.rootViewController pushViewController:viewController animated:YES];
+    return YES;
+}
+
+#pragma mark weex
+- (void)initWeexSDK
+{
+    [WXAppConfiguration setAppGroup:@"AliApp"];
+    [WXAppConfiguration setAppName:@"WeexDemo"];
+    [WXAppConfiguration setExternalUserAgent:@"ExternalUA"];
+    
+    [WXSDKEngine initSDKEnvironment];
+    
+    [WXSDKEngine registerHandler:[WXImgLoaderDefaultImpl new] withProtocol:@protocol(WXImgLoaderProtocol)];
+    [WXSDKEngine registerHandler:[WXEventModule new] withProtocol:@protocol(WXEventModuleProtocol)];
+    [WXSDKEngine registerHandler:[WXConfigCenterDefaultImpl new] withProtocol:@protocol(WXConfigCenterProtocol)];
+    [WXSDKEngine registerHandler:[WXNavigationHandlerImpl new] withProtocol:@protocol(WXNavigationProtocol)];
+    [WXSDKEngine registerHandler:[WXApmGeneratorImpl new] withProtocol:@protocol(WXApmGeneratorProtocol)];
+    [WXSDKEngine registerHandler:[WXWebSocketDefaultImpl new] withProtocol:@protocol(WXWebSocketHandler)];
+    
+    [WXSDKEngine registerComponent:@"select" withClass:NSClassFromString(@"WXSelectComponent")];
+    [WXSDKEngine registerModule:@"event" withClass:[WXEventModule class]];
+    [WXSDKEngine registerModule:@"syncTest" withClass:[WXSyncTestModule class]];
+    [WXSDKEngine registerModule:@"titleBar" withClass:NSClassFromString(@"WXTitleBarModule")];
+    [WXSDKEngine registerExtendCallNative:@"test" withClass:NSClassFromString(@"WXExtendCallNativeTest")];
+    [WXSDKEngine registerModule:@"ext" withClass:[WXExtModule class]];
+    [WPRegister registerPlugins];
+#ifdef DEBUG
+    [WXAnalyzerCenter addWxAnalyzer:[DebugAnalyzer new]];
+#endif
+    
+#if !(TARGET_IPHONE_SIMULATOR)
+    [self checkUpdate];
+#endif
+    
+#ifdef DEBUG
+    [self atAddPlugin];
+    [WXDebugTool setDebug:YES];
+    [WXLog setLogLevel:WXLogLevelLog];
+    
+    #ifndef UITEST
+        [[ATManager shareInstance] show];
+    #endif
+#else
+    [WXDebugTool setDebug:NO];
+    [WXLog setLogLevel:WXLogLevelError];
+#endif
+}
+
+- (UIViewController *)demoController
+{
+    UIViewController *demo = [[WXDemoViewController alloc] init];
+    ((WXDemoViewController *)demo).url = [NSURL URLWithString:BUNDLE_URL];
+    return demo;
+}
+
+#pragma mark 
+#pragma mark animation when startup
+
+- (void)startSplashScreen
+{
+    UIView* splashView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
+    splashView.backgroundColor = WEEX_COLOR;
+    
+    UIImageView *iconImageView = [UIImageView new];
+    UIImage *icon = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"weex-icon" ofType:@"png"]];
+    if ([icon respondsToSelector:@selector(imageWithRenderingMode:)]) {
+        iconImageView.image = [icon imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
+        iconImageView.tintColor = [UIColor whiteColor];
+    } else {
+        iconImageView.image = icon;
+    }
+    iconImageView.frame = CGRectMake(0, 0, 320, 320);
+    iconImageView.contentMode = UIViewContentModeScaleAspectFit;
+    iconImageView.center = splashView.center;
+    [splashView addSubview:iconImageView];
+    
+    [self.window addSubview:splashView];
+    
+    float animationDuration = 1.4;
+    CGFloat shrinkDuration = animationDuration * 0.3;
+    CGFloat growDuration = animationDuration * 0.7;
+    
+    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
+        [UIView animateWithDuration:shrinkDuration delay:1.0 usingSpringWithDamping:0.7f initialSpringVelocity:10 options:UIViewAnimationOptionCurveEaseInOut animations:^{
+            CGAffineTransform scaleTransform = CGAffineTransformMakeScale(0.75, 0.75);
+            iconImageView.transform = scaleTransform;
+        } completion:^(BOOL finished) {
+            [UIView animateWithDuration:growDuration animations:^{
+                CGAffineTransform scaleTransform = CGAffineTransformMakeScale(20, 20);
+                iconImageView.transform = scaleTransform;
+                splashView.alpha = 0;
+            } completion:^(BOOL finished) {
+                [splashView removeFromSuperview];
+            }];
+        }];
+    } else {
+        [UIView animateWithDuration:shrinkDuration delay:1.0 options:0 animations:^{
+            CGAffineTransform scaleTransform = CGAffineTransformMakeScale(0.75, 0.75);
+            iconImageView.transform = scaleTransform;
+        } completion:^(BOOL finished) {
+            [UIView animateWithDuration:growDuration animations:^{
+                CGAffineTransform scaleTransform = CGAffineTransformMakeScale(20, 20);
+                iconImageView.transform = scaleTransform;
+                splashView.alpha = 0;
+            } completion:^(BOOL finished) {
+                [splashView removeFromSuperview];
+            }];
+        }];
+    }
+}
+
+#pragma mark
+
+- (void)atAddPlugin {
+#if DEBUG
+    [[ATManager shareInstance] addPluginWithId:@"weex" andName:@"weex" andIconName:@"../weex" andEntry:@"" andArgs:@[@""]];
+    [[ATManager shareInstance] addSubPluginWithParentId:@"weex" andSubId:@"logger" andName:@"logger" andIconName:@"log" andEntry:@"WXATLoggerPlugin" andArgs:@[@""]];
+//    [[ATManager shareInstance] addSubPluginWithParentId:@"weex" andSubId:@"viewHierarchy" andName:@"hierarchy" andIconName:@"log" andEntry:@"WXATViewHierarchyPlugin" andArgs:@[@""]];
+    [[ATManager shareInstance] addSubPluginWithParentId:@"weex" andSubId:@"test2" andName:@"test" andIconName:@"at_arr_refresh" andEntry:@"" andArgs:@[]];
+    [[ATManager shareInstance] addSubPluginWithParentId:@"weex" andSubId:@"test3" andName:@"test" andIconName:@"at_arr_refresh" andEntry:@"" andArgs:@[]];
+#endif
+}
+
+- (void)checkUpdate {
+    __weak typeof(self) weakSelf = self;
+    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+        NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary];
+        NSString *currentVersion = [infoDic objectForKey:@"CFBundleShortVersionString"];
+        NSString *URL = @"http://itunes.apple.com/lookup?id=1130862662";
+        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
+        [request setURL:[NSURL URLWithString:URL]];
+        [request setHTTPMethod:@"POST"];
+        
+        NSHTTPURLResponse *urlResponse = nil;
+        NSError *error = nil;
+        NSData *recervedData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];
+        NSString *results = [[NSString alloc] initWithBytes:[recervedData bytes] length:[recervedData length] encoding:NSUTF8StringEncoding];
+        
+        NSDictionary *dic = [WXUtility objectFromJSON:results];
+        NSArray *infoArray = [dic objectForKey:@"results"];
+        
+        if ([infoArray count]) {
+            NSDictionary *releaseInfo = [infoArray objectAtIndex:0];
+            weakSelf.latestVer = [releaseInfo objectForKey:@"version"];
+            if ([weakSelf.latestVer floatValue] > [currentVersion floatValue]) {
+                if (![[NSUserDefaults standardUserDefaults] boolForKey: weakSelf.latestVer]) {
+                    [[NSUserDefaults standardUserDefaults] setBool:FALSE forKey:weakSelf.latestVer];
+                    dispatch_async(dispatch_get_main_queue(), ^{
+                        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"New Version" message:@"Will update to a new version" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"update", nil];
+                        [alert show];
+                    });
+                }
+            }
+        }
+    });
+}
+
+- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
+    switch (buttonIndex) {
+        case 0:
+            [[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:self.latestVer];
+            break;
+        case 1:
+            [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"itms-apps://itunes.apple.com/cn/app/weex-playground/id1130862662?mt=8"]];
+        default:
+            break;
+    }
+    [alertView dismissWithClickedButtonIndex:buttonIndex animated:YES];
+}
+
+@end
diff --git a/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/AppStoreIcon1024.png b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/AppStoreIcon1024.png
new file mode 100644
index 0000000..435f57b
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/AppStoreIcon1024.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..21cf59d
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,112 @@
+{
+  "images" : [
+    {
+      "idiom" : "iphone",
+      "size" : "20x20",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "20x20",
+      "scale" : "3x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "Icon-29@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "Icon-29@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "iphone",
+      "filename" : "Icon-40@2x-1.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "iphone",
+      "filename" : "Icon-40@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "60x60",
+      "idiom" : "iphone",
+      "filename" : "Icon-60@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "60x60",
+      "idiom" : "iphone",
+      "filename" : "Icon-60@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "20x20",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "20x20",
+      "scale" : "2x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "ipad",
+      "filename" : "Icon-29.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "ipad",
+      "filename" : "Icon-29@2x-1.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "ipad",
+      "filename" : "Icon-40.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "ipad",
+      "filename" : "Icon-40@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "76x76",
+      "idiom" : "ipad",
+      "filename" : "Icon-76.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "76x76",
+      "idiom" : "ipad",
+      "filename" : "Icon-76@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "83.5x83.5",
+      "idiom" : "ipad",
+      "filename" : "Icon-83.5@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "1024x1024",
+      "idiom" : "ios-marketing",
+      "filename" : "AppStoreIcon1024.png",
+      "scale" : "1x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file
diff --git a/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-29.png b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-29.png
new file mode 100644
index 0000000..fcadf69
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-29.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-29@2x-1.png b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-29@2x-1.png
new file mode 100644
index 0000000..594350e
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-29@2x-1.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-29@2x.png b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-29@2x.png
new file mode 100644
index 0000000..594350e
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-29@2x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-29@3x.png b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-29@3x.png
new file mode 100644
index 0000000..6b6635c
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-29@3x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-40.png b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-40.png
new file mode 100644
index 0000000..17ef490
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-40.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-1.png b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-1.png
new file mode 100644
index 0000000..f3641e9
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-1.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png
new file mode 100644
index 0000000..f3641e9
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png
new file mode 100644
index 0000000..2fa64a0
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png
new file mode 100644
index 0000000..2fa64a0
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png
new file mode 100644
index 0000000..6160662
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-76.png b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-76.png
new file mode 100644
index 0000000..85ede63
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-76.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png
new file mode 100644
index 0000000..c513d88
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png
new file mode 100644
index 0000000..7d77683
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/Contents.json b/ios/WeexDemo/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..da4a164
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file
diff --git a/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/Contents.json b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/Contents.json
new file mode 100644
index 0000000..b4bc73c
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/Contents.json
@@ -0,0 +1,88 @@
+{
+  "images" : [
+    {
+      "extent" : "full-screen",
+      "idiom" : "iphone",
+      "subtype" : "2688h",
+      "filename" : "iPhoneXMax@3x.png",
+      "minimum-system-version" : "12.0",
+      "orientation" : "portrait",
+      "scale" : "3x"
+    },
+    {
+      "extent" : "full-screen",
+      "idiom" : "iphone",
+      "subtype" : "1792h",
+      "filename" : "iPhoneXR@2x.png",
+      "minimum-system-version" : "12.0",
+      "orientation" : "portrait",
+      "scale" : "2x"
+    },
+    {
+      "extent" : "full-screen",
+      "idiom" : "iphone",
+      "subtype" : "2436h",
+      "filename" : "iPhoneX@3x.png",
+      "minimum-system-version" : "11.0",
+      "orientation" : "portrait",
+      "scale" : "3x"
+    },
+    {
+      "extent" : "full-screen",
+      "idiom" : "iphone",
+      "subtype" : "2436h",
+      "filename" : "iPhoneX-landscape.png",
+      "minimum-system-version" : "11.0",
+      "orientation" : "landscape",
+      "scale" : "3x"
+    },
+    {
+      "extent" : "full-screen",
+      "idiom" : "iphone",
+      "subtype" : "736h",
+      "filename" : "Retinal HD 5.5.png",
+      "minimum-system-version" : "8.0",
+      "orientation" : "portrait",
+      "scale" : "3x"
+    },
+    {
+      "extent" : "full-screen",
+      "idiom" : "iphone",
+      "subtype" : "736h",
+      "filename" : "iPhone5.5-landscape.png",
+      "minimum-system-version" : "8.0",
+      "orientation" : "landscape",
+      "scale" : "3x"
+    },
+    {
+      "extent" : "full-screen",
+      "idiom" : "iphone",
+      "subtype" : "667h",
+      "filename" : "Retinal HD 4.7.png",
+      "minimum-system-version" : "8.0",
+      "orientation" : "portrait",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "iphone",
+      "filename" : "Default@2x.png",
+      "extent" : "full-screen",
+      "minimum-system-version" : "7.0",
+      "scale" : "2x"
+    },
+    {
+      "extent" : "full-screen",
+      "idiom" : "iphone",
+      "subtype" : "retina4",
+      "filename" : "Default-568h@2x.png",
+      "minimum-system-version" : "7.0",
+      "orientation" : "portrait",
+      "scale" : "2x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file
diff --git a/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png
new file mode 100644
index 0000000..7e013e4
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/Default@2x.png b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/Default@2x.png
new file mode 100644
index 0000000..948f7a3
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/Default@2x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/Retinal HD 4.7.png b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/Retinal HD 4.7.png
new file mode 100644
index 0000000..95b95ea
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/Retinal HD 4.7.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/Retinal HD 5.5.png b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/Retinal HD 5.5.png
new file mode 100644
index 0000000..27dd969
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/Retinal HD 5.5.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/iPhone5.5-landscape.png b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/iPhone5.5-landscape.png
new file mode 100644
index 0000000..6eb5283
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/iPhone5.5-landscape.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/iPhoneX-landscape.png b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/iPhoneX-landscape.png
new file mode 100644
index 0000000..2b65d7c
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/iPhoneX-landscape.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/iPhoneX@3x.png b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/iPhoneX@3x.png
new file mode 100644
index 0000000..ddda19e
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/iPhoneX@3x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/iPhoneXMax@3x.png b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/iPhoneXMax@3x.png
new file mode 100644
index 0000000..64c3772
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/iPhoneXMax@3x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/iPhoneXR@2x.png b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/iPhoneXR@2x.png
new file mode 100644
index 0000000..9ecb99e
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/LaunchImage.launchimage/iPhoneXR@2x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/back.imageset/Contents.json b/ios/WeexDemo/Assets.xcassets/back.imageset/Contents.json
new file mode 100644
index 0000000..3bad3d0
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/back.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "back.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "back@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "back@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file
diff --git a/ios/WeexDemo/Assets.xcassets/back.imageset/back.png b/ios/WeexDemo/Assets.xcassets/back.imageset/back.png
new file mode 100644
index 0000000..1f3e073
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/back.imageset/back.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/back.imageset/back@2x.png b/ios/WeexDemo/Assets.xcassets/back.imageset/back@2x.png
new file mode 100644
index 0000000..76d0bf8
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/back.imageset/back@2x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/back.imageset/back@3x.png b/ios/WeexDemo/Assets.xcassets/back.imageset/back@3x.png
new file mode 100644
index 0000000..8180558
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/back.imageset/back@3x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/delete.imageset/Contents.json b/ios/WeexDemo/Assets.xcassets/delete.imageset/Contents.json
new file mode 100644
index 0000000..1231572
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/delete.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "delete.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "delete@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "delete@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file
diff --git a/ios/WeexDemo/Assets.xcassets/delete.imageset/delete.png b/ios/WeexDemo/Assets.xcassets/delete.imageset/delete.png
new file mode 100644
index 0000000..d7cc20a
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/delete.imageset/delete.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/delete.imageset/delete@2x.png b/ios/WeexDemo/Assets.xcassets/delete.imageset/delete@2x.png
new file mode 100644
index 0000000..63aa9cb
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/delete.imageset/delete@2x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/delete.imageset/delete@3x.png b/ios/WeexDemo/Assets.xcassets/delete.imageset/delete@3x.png
new file mode 100644
index 0000000..5963f9c
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/delete.imageset/delete@3x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/reload.imageset/Contents.json b/ios/WeexDemo/Assets.xcassets/reload.imageset/Contents.json
new file mode 100644
index 0000000..e2cd5af
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/reload.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "reload.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "reload@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "reload@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file
diff --git a/ios/WeexDemo/Assets.xcassets/reload.imageset/reload.png b/ios/WeexDemo/Assets.xcassets/reload.imageset/reload.png
new file mode 100644
index 0000000..1fd4bac
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/reload.imageset/reload.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/reload.imageset/reload@2x.png b/ios/WeexDemo/Assets.xcassets/reload.imageset/reload@2x.png
new file mode 100644
index 0000000..6e97235
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/reload.imageset/reload@2x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/reload.imageset/reload@3x.png b/ios/WeexDemo/Assets.xcassets/reload.imageset/reload@3x.png
new file mode 100644
index 0000000..ab75ee7
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/reload.imageset/reload@3x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/scan.imageset/Contents.json b/ios/WeexDemo/Assets.xcassets/scan.imageset/Contents.json
new file mode 100644
index 0000000..798ba85
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/scan.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "scan.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "scan@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "scan@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file
diff --git a/ios/WeexDemo/Assets.xcassets/scan.imageset/scan.png b/ios/WeexDemo/Assets.xcassets/scan.imageset/scan.png
new file mode 100644
index 0000000..6183105
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/scan.imageset/scan.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/scan.imageset/scan@2x.png b/ios/WeexDemo/Assets.xcassets/scan.imageset/scan@2x.png
new file mode 100644
index 0000000..43cf01d
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/scan.imageset/scan@2x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/scan.imageset/scan@3x.png b/ios/WeexDemo/Assets.xcassets/scan.imageset/scan@3x.png
new file mode 100644
index 0000000..76c7e0b
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/scan.imageset/scan@3x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/scan_history.imageset/Contents.json b/ios/WeexDemo/Assets.xcassets/scan_history.imageset/Contents.json
new file mode 100644
index 0000000..e972e4e
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/scan_history.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "history.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "history@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "history@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file
diff --git a/ios/WeexDemo/Assets.xcassets/scan_history.imageset/history.png b/ios/WeexDemo/Assets.xcassets/scan_history.imageset/history.png
new file mode 100644
index 0000000..48aac03
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/scan_history.imageset/history.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/scan_history.imageset/history@2x.png b/ios/WeexDemo/Assets.xcassets/scan_history.imageset/history@2x.png
new file mode 100644
index 0000000..dd94cb7
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/scan_history.imageset/history@2x.png
Binary files differ
diff --git a/ios/WeexDemo/Assets.xcassets/scan_history.imageset/history@3x.png b/ios/WeexDemo/Assets.xcassets/scan_history.imageset/history@3x.png
new file mode 100644
index 0000000..2d5f2b4
--- /dev/null
+++ b/ios/WeexDemo/Assets.xcassets/scan_history.imageset/history@3x.png
Binary files differ
diff --git a/ios/WeexDemo/DemoBaseViewController.h b/ios/WeexDemo/DemoBaseViewController.h
new file mode 100644
index 0000000..48d01e0
--- /dev/null
+++ b/ios/WeexDemo/DemoBaseViewController.h
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <UIKit/UIKit.h>
+
+@interface DemoBaseViewController : UIViewController
+
+@end
diff --git a/ios/WeexDemo/DemoBaseViewController.m b/ios/WeexDemo/DemoBaseViewController.m
new file mode 100644
index 0000000..edfb8a1
--- /dev/null
+++ b/ios/WeexDemo/DemoBaseViewController.m
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "DemoBaseViewController.h"
+#import "UIViewController+WXDemoNaviBar.h"
+
+@interface DemoBaseViewController ()
+
+@end
+
+@implementation DemoBaseViewController
+
+- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+    return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+}
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self setupNaviBar];
+}
+
+- (void)didReceiveMemoryWarning {
+    [super didReceiveMemoryWarning];
+    // Dispose of any resources that can be recreated.
+}
+
+@end
diff --git a/ios/WeexDemo/DemoDefine.h b/ios/WeexDemo/DemoDefine.h
new file mode 100644
index 0000000..04840bb
--- /dev/null
+++ b/ios/WeexDemo/DemoDefine.h
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <Foundation/Foundation.h>
+
+#define CURRENT_IP [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"localServer-ip" ofType:@".txt"] encoding:NSUTF8StringEncoding error:nil]
+
+#if TARGET_IPHONE_SIMULATOR
+    #define DEMO_HOST @"127.0.0.1"
+#else
+    #define DEMO_HOST CURRENT_IP
+#endif
+
+#define DEMO_URL(path) [NSString stringWithFormat:@"http://%@:12580/%s", DEMO_HOST, #path]
+
+#define HOME_URL [NSString stringWithFormat:@"http://%@:12580/examples/build/vue/index.js", DEMO_HOST]
+
+#define BUNDLE_URL [NSString stringWithFormat:@"file://%@/bundlejs/landing.weex.js",[NSBundle mainBundle].bundlePath]
+
+#define UITEST_HOME_URL @"http://test?_wx_tpl=http://localhost:12580/test/build/TC__Home.js"
+
+#define QRSCAN  @"com.taobao.WeexDemo.scan"
+#define QRSCAN_HISTORY  @"com.taobao.WeexDemo.scan.history"
+#define WEEX_COLOR [UIColor colorWithRed:0.27 green:0.71 blue:0.94 alpha:1]
+#define WX_SCANNER_HISTORY @"wx_scanner_history"
diff --git a/ios/WeexDemo/Images.xcassets/Brand Assets.launchimage/Contents.json b/ios/WeexDemo/Images.xcassets/Brand Assets.launchimage/Contents.json
new file mode 100644
index 0000000..e37b649
--- /dev/null
+++ b/ios/WeexDemo/Images.xcassets/Brand Assets.launchimage/Contents.json
@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "orientation" : "portrait",
+      "idiom" : "iphone",
+      "minimum-system-version" : "7.0",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "iphone",
+      "minimum-system-version" : "7.0",
+      "subtype" : "retina4",
+      "scale" : "2x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file
diff --git a/ios/WeexDemo/Info.plist b/ios/WeexDemo/Info.plist
new file mode 100644
index 0000000..49abc9a
--- /dev/null
+++ b/ios/WeexDemo/Info.plist
@@ -0,0 +1,94 @@
+<?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>CFBundleDisplayName</key>
+	<string>WeexPlayground</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>2.2</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleURLTypes</key>
+	<array>
+		<dict>
+			<key>CFBundleURLSchemes</key>
+			<array>
+				<string>wxpage</string>
+			</array>
+		</dict>
+	</array>
+	<key>CFBundleVersion</key>
+	<string>3</string>
+	<key>LSRequiresIPhoneOS</key>
+	<true/>
+	<key>NSAppTransportSecurity</key>
+	<dict>
+		<key>NSAllowsArbitraryLoads</key>
+		<true/>
+	</dict>
+	<key>NSCameraUsageDescription</key>
+	<string>$(PRODUCT_NAME) will access your camera,so that you can scan qr code to show your page</string>
+	<key>NSLocationWhenInUseUsageDescription</key>
+	<string>$(PRODUCT_NAME) will access your location, so that you can get current location where you are</string>
+	<key>NSPhotoLibraryAddUsageDescription</key>
+	<string>$(PRODUCT_NAME) needs access your photo Album, so that you can save image to your photo library.</string>
+	<key>NSPhotoLibraryUsageDescription</key>
+	<string>$(PRODUCT_NAME) needs access your photo Album,so that you can save image to your photo library.</string>
+	<key>UIApplicationShortcutItems</key>
+	<array>
+		<dict>
+			<key>UIApplicationShortcutItemIconFile</key>
+			<string>scan_history</string>
+			<key>UIApplicationShortcutItemSubtitle</key>
+			<string>history</string>
+			<key>UIApplicationShortcutItemTitle</key>
+			<string>Scan history</string>
+			<key>UIApplicationShortcutItemType</key>
+			<string>com.taobao.WeexDemo.scan.history</string>
+		</dict>
+		<dict>
+			<key>UIApplicationShortcutItemIconFile</key>
+			<string>scan</string>
+			<key>UIApplicationShortcutItemSubtitle</key>
+			<string>scan QR code</string>
+			<key>UIApplicationShortcutItemTitle</key>
+			<string>Scan QR</string>
+			<key>UIApplicationShortcutItemType</key>
+			<string>com.taobao.WeexDemo.scan</string>
+		</dict>
+	</array>
+	<key>UIRequiredDeviceCapabilities</key>
+	<array>
+		<string>armv7</string>
+	</array>
+	<key>UIStatusBarStyle</key>
+	<string>UIStatusBarStyleLightContent</string>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UISupportedInterfaceOrientations~ipad</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UIViewControllerBasedStatusBarAppearance</key>
+	<false/>
+</dict>
+</plist>
diff --git a/ios/WeexDemo/Scanner/WXScannerHistoryVC.h b/ios/WeexDemo/Scanner/WXScannerHistoryVC.h
new file mode 100644
index 0000000..2dee545
--- /dev/null
+++ b/ios/WeexDemo/Scanner/WXScannerHistoryVC.h
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <UIKit/UIKit.h>
+
+@interface WXScannerHistoryVC : UITableViewController<UIGestureRecognizerDelegate>
+
+@end
diff --git a/ios/WeexDemo/Scanner/WXScannerHistoryVC.m b/ios/WeexDemo/Scanner/WXScannerHistoryVC.m
new file mode 100644
index 0000000..b60c975
--- /dev/null
+++ b/ios/WeexDemo/Scanner/WXScannerHistoryVC.m
@@ -0,0 +1,225 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "WXScannerHistoryVC.h"
+#import "DemoDefine.h"
+#import "WXDemoViewController.h"
+#import "UIViewController+WXDemoNaviBar.h"
+#import <CoreText/CoreText.h>
+
+@interface WXScannerHistoryVC ()
+@property(nonatomic)NSMutableArray * scanner_history;
+@property(nonatomic)UIImageView * qrCodeImageView;
+@end
+
+@implementation WXScannerHistoryVC
+
+- (instancetype)init {
+    if (self = [super init]) {
+        _scanner_history = [[[NSUserDefaults standardUserDefaults] objectForKey:WX_SCANNER_HISTORY] mutableCopy];
+    }
+    return self;
+}
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    [self setupNaviBar];
+    UITapGestureRecognizer * tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleClick:)];
+    [self.tableView addGestureRecognizer:tapGestureRecognizer];
+    tapGestureRecognizer.delegate = self;
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadHistory) name:NSUserDefaultsDidChangeNotification object:nil];
+}
+
+- (void)dealloc {
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+#pragma mark - Table view data source
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+    return 1;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
+    return 88.0f;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return [_scanner_history count];
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"WX_SCANNER_HISTORY_CELL"];
+    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"WX_SCANNER_HISTORY_CELL" forIndexPath:indexPath];
+    if (!cell) {
+        cell = [UITableViewCell new];
+    }
+    UILongPressGestureRecognizer * longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
+    longPressGesture.minimumPressDuration = 1.0;
+    longPressGesture.delegate = self;
+    [cell addGestureRecognizer:longPressGesture];
+    NSMutableAttributedString * attributeString = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%ld %@",(long)indexPath.row+1,[_scanner_history objectAtIndex:indexPath.row]]];
+    [attributeString addAttribute:(NSString*)NSForegroundColorAttributeName value:(id)[UIColor redColor].CGColor range:NSMakeRange(0, 1)];
+    NSDictionary<NSString*, id> *attributes = @{
+                                               NSForegroundColorAttributeName:[UIColor redColor],
+                                               NSFontAttributeName: [UIFont boldSystemFontOfSize:25.0],
+                                               };
+    [attributeString addAttributes:attributes range:NSMakeRange(0, 2)];
+    cell.textLabel.attributedText = attributeString;
+    cell.textLabel.numberOfLines = 0;
+    
+    return cell;
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    NSString *urlStr = _scanner_history[indexPath.row];
+    if (urlStr) {
+        WXDemoViewController * demoVC = [WXDemoViewController new];
+        demoVC.url = [NSURL URLWithString:urlStr];
+        [self.navigationController pushViewController:demoVC animated:YES];
+    }
+}
+
+- (void)reloadHistory
+{
+    if ([_scanner_history count]) {
+        [_qrCodeImageView removeFromSuperview];
+        [_scanner_history removeAllObjects];
+        _scanner_history =  [[[NSUserDefaults standardUserDefaults] objectForKey:WX_SCANNER_HISTORY] mutableCopy];
+        [self.tableView reloadData];
+    }
+}
+
+- (void)handleClick:(UITapGestureRecognizer*)gestureRecognizer
+{
+    CGPoint clickPoint = [gestureRecognizer locationInView:self.tableView];
+    if (!CGRectContainsPoint(_qrCodeImageView.frame, clickPoint)) {
+        [_qrCodeImageView removeFromSuperview];
+    }
+}
+
+- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
+{
+    if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
+        if ([_qrCodeImageView superview]) {
+            return YES;
+        }
+    }
+    if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) {
+        return YES;
+    }
+    return NO;
+}
+
+- (void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
+{
+    if (gestureRecognizer.state != UIGestureRecognizerStateBegan) {
+        return ;
+    }
+    CGPoint pressPoint = [gestureRecognizer locationInView:self.tableView];
+    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:pressPoint];
+    if (indexPath == nil) {
+        return;
+    }
+    
+    NSString * url = _scanner_history[indexPath.row];
+    UIImage * qrCodeImage = [self getQRCodeWithData:url size:CGSizeMake(300, 300)];
+    _qrCodeImageView.contentMode = UIViewContentModeScaleAspectFill;
+    if (![_qrCodeImageView superview]) {
+        _qrCodeImageView = [[UIImageView alloc] initWithImage:qrCodeImage];
+        [_qrCodeImageView setCenter:self.view.center];
+        [self.view addSubview:_qrCodeImageView];
+    }else {
+        _qrCodeImageView.image = qrCodeImage;
+    }
+}
+
+- (UIImage*)getQRCodeWithData:(NSString*)url size:(CGSize)size {
+    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
+    [filter setDefaults];
+    NSString *info = url;
+    NSData *infoData = [info dataUsingEncoding:NSUTF8StringEncoding];
+    [filter setValue:infoData forKeyPath:@"inputMessage"];
+    
+    CIImage *outputImage = [filter outputImage];
+    CGRect extent = CGRectIntegral(outputImage.extent);
+    CGFloat scale = MIN(size.width/CGRectGetWidth(extent), size.width/CGRectGetHeight(extent));
+    
+    size_t width = CGRectGetWidth(extent) * scale;
+    size_t height = CGRectGetHeight(extent) * scale;
+    CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
+    CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
+    CIContext *context = [CIContext contextWithOptions:nil];
+    CGImageRef bitmapImage = [context createCGImage:outputImage fromRect:extent];
+    CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
+    CGContextScaleCTM(bitmapRef, scale, scale);
+    CGContextDrawImage(bitmapRef, extent, bitmapImage);
+    
+    CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
+    CGContextRelease(bitmapRef);
+    CGImageRelease(bitmapImage);
+    return [UIImage imageWithCGImage:scaledImage];
+}
+
+/*
+// Override to support conditional editing of the table view.
+- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
+    // Return NO if you do not want the specified item to be editable.
+    return YES;
+}
+*/
+
+/*
+// Override to support editing the table view.
+- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
+    if (editingStyle == UITableViewCellEditingStyleDelete) {
+        // Delete the row from the data source
+        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
+    } else if (editingStyle == UITableViewCellEditingStyleInsert) {
+        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
+    }   
+}
+*/
+
+/*
+// Override to support rearranging the table view.
+- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
+}
+*/
+
+/*
+// Override to support conditional rearranging of the table view.
+- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
+    // Return NO if you do not want the item to be re-orderable.
+    return YES;
+}
+*/
+
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end
diff --git a/ios/WeexDemo/Scanner/WXScannerVC.h b/ios/WeexDemo/Scanner/WXScannerVC.h
new file mode 100644
index 0000000..aff1805
--- /dev/null
+++ b/ios/WeexDemo/Scanner/WXScannerVC.h
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <UIKit/UIKit.h>
+#import <AVFoundation/AVFoundation.h>
+
+@interface WXScannerVC : UIViewController <AVCaptureMetadataOutputObjectsDelegate>
+
+@end
diff --git a/ios/WeexDemo/Scanner/WXScannerVC.m b/ios/WeexDemo/Scanner/WXScannerVC.m
new file mode 100644
index 0000000..01b3262
--- /dev/null
+++ b/ios/WeexDemo/Scanner/WXScannerVC.m
@@ -0,0 +1,242 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <WeexSDK/WeexSDK.h>
+#import "WXScannerVC.h"
+#import "AppDelegate.h"
+#import "UIViewController+WXDemoNaviBar.h"
+#import "WXDemoViewController.h"
+#import "WXDebugTool.h"
+#import "WXDevTool.h"
+#import <AudioToolbox/AudioToolbox.h>
+
+@interface WXScannerVC ()
+
+@property (nonatomic, strong) AVCaptureSession * session;
+@property (nonatomic, strong) AVCaptureVideoPreviewLayer *captureLayer;
+@property (nonatomic, strong) UIView *sanFrameView;
+
+@end
+
+@implementation WXScannerVC
+
+#pragma mark - lifeCircle
+
+- (void)dealloc {
+    [_captureLayer removeFromSuperlayer];
+}
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    self.edgesForExtendedLayout = UIRectEdgeNone;
+    
+#if !(TARGET_IPHONE_SIMULATOR)
+    self.session = [[AVCaptureSession alloc]init];
+    [_session setSessionPreset:AVCaptureSessionPresetHigh];
+    AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
+    AVCaptureDeviceInput * input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
+    AVCaptureMetadataOutput * output = [[AVCaptureMetadataOutput alloc]init];
+    if (output && input && device) {
+        [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
+        [_session addInput:input];
+        [_session addOutput:output];
+        output.metadataObjectTypes=@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];
+    }
+    
+    _captureLayer = [AVCaptureVideoPreviewLayer layerWithSession:_session];
+    _captureLayer.videoGravity=AVLayerVideoGravityResizeAspectFill;
+    _captureLayer.frame=self.view.layer.bounds;
+#endif
+}
+
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+    [self.navigationController setNavigationBarHidden:NO];
+    [self setupNaviBar];
+    [self.view.layer addSublayer:_captureLayer];
+    [_session startRunning];
+}
+
+- (void) viewDidDisappear:(BOOL)animated
+{
+    [super viewDidDisappear:animated];
+    
+    [_captureLayer removeFromSuperlayer];
+    [_session stopRunning];
+}
+
+- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
+{
+    [_captureLayer removeFromSuperlayer];
+    [_session stopRunning];
+    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
+    if (metadataObjects.count > 0) {
+        AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex: 0];
+        [self recordScannerHistory:metadataObject.stringValue];
+        [self openURL:metadataObject.stringValue];
+    }
+}
+
+- (void)openURL:(NSString*)URL
+{
+    NSString *transformURL = URL;
+    NSArray* elts = [URL componentsSeparatedByString:@"?"];
+    if (elts.count >= 2) {
+        NSArray *urls = [elts.lastObject componentsSeparatedByString:@"="];
+        for (NSString *param in urls) {
+            if ([param isEqualToString:@"_wx_tpl"]) {
+                transformURL = [[urls lastObject]  stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
+                break;
+            }
+        }
+    }
+    NSURL *url = [NSURL URLWithString:transformURL];
+    if ([self remoteDebug:url]) {
+        return;
+    }
+    [self jsReplace:url];
+    WXDemoViewController * controller = [[WXDemoViewController alloc] init];
+    controller.url = url;
+    controller.source = @"scan";
+    
+    NSMutableDictionary *queryDict = [NSMutableDictionary new];
+    if (WX_SYS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
+        NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
+        NSArray *queryItems = [components queryItems];
+    
+        for (NSURLQueryItem *item in queryItems)
+            [queryDict setObject:item.value forKey:item.name];
+    }else {
+        queryDict = [self queryWithURL:url];
+    }
+    NSString *wsport = queryDict[@"wsport"] ?: @"8082";
+    NSURL *socketURL = [NSURL URLWithString:[NSString stringWithFormat:@"ws://%@:%@", url.host, wsport]];
+    controller.hotReloadSocket = [[SRWebSocket alloc] initWithURL:socketURL protocols:@[@"echo-protocol"]];
+    controller.hotReloadSocket.delegate = controller;
+    [controller.hotReloadSocket open];
+    
+    [[self navigationController] pushViewController:controller animated:YES];
+}
+
+- (NSMutableDictionary*)queryWithURL:(NSURL *)url {
+    NSMutableDictionary * queryDic = nil;
+    if (![url query]) {
+        return queryDic;
+    }
+    queryDic = [NSMutableDictionary new];
+    NSArray* components = [[url query] componentsSeparatedByString:@"&"];
+    for (NSUInteger i = 0; i < [components count]; i ++) {
+        NSString * queryParam = [components objectAtIndex:i];
+        NSArray* component = [queryParam componentsSeparatedByString:@"="];
+        [queryDic setValue:component[1] forKey:component[0]];
+    }
+    
+    return  queryDic;
+}
+
+#pragma mark - Replace JS
+
+- (void)jsReplace:(NSURL *)url
+{
+    if ([[url host] isEqualToString:@"weex-remote-debugger"]){
+        NSString* path = [url path];
+        if ([path isEqualToString:@"/dynamic/replace/bundle"]){
+            for (NSString * param in [[url query] componentsSeparatedByString:@"&"]) {
+                NSArray* elts = [param componentsSeparatedByString:@"="];
+                if ([elts count] < 2) {
+                    continue;
+                }
+                if ([[elts firstObject] isEqualToString:@"bundle"]){
+                    [WXDebugTool setReplacedBundleJS:[NSURL URLWithString:[elts lastObject]]];
+                }
+            }
+        }
+        
+        if ([path isEqualToString:@"/dynamic/replace/framework"]){
+            for (NSString * param in [[url query] componentsSeparatedByString:@"&"]) {
+                NSArray* elts = [param componentsSeparatedByString:@"="];
+                if ([elts count] < 2) {
+                    continue;
+                }
+                if ([[elts firstObject] isEqualToString:@"framework"]){
+                    [WXDebugTool setReplacedJSFramework:[NSURL URLWithString:[elts lastObject]]];
+                }
+            }
+        }
+    }
+}
+
+#pragma mark Remote debug
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
+- (BOOL)remoteDebug:(NSURL *)url
+{
+    if ([url.scheme isEqualToString:@"ws"]) {
+        [WXSDKEngine connectDebugServer:url.absoluteString];
+        [WXSDKEngine initSDKEnvironment];
+        
+        return YES;
+    }
+    
+    NSString *query = url.query;
+    for (NSString *param in [query componentsSeparatedByString:@"&"]) {
+        NSArray *elts = [param componentsSeparatedByString:@"="];
+        if([elts count] < 2) continue;
+        if ([[elts firstObject] isEqualToString:@"_wx_debug"]) {
+            [WXDebugTool setDebug:YES];
+            [WXSDKEngine connectDebugServer:[[elts lastObject]  stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
+            if ([[[self.navigationController viewControllers] objectAtIndex:0] isKindOfClass:NSClassFromString(@"WXDemoViewController")]) {
+                WXDemoViewController * vc = (WXDemoViewController*)[[self.navigationController viewControllers] objectAtIndex:0];
+                [vc performSelector:NSSelectorFromString(@"loadRefreshCtl")];
+                [self.navigationController popToViewController:vc animated:NO];
+            }
+            return YES;
+        } else if ([[elts firstObject] isEqualToString:@"_wx_devtool"]) {
+            NSString *devToolURL = [[elts lastObject]  stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
+            [WXDevTool launchDevToolDebugWithUrl:devToolURL];
+            if ([[[self.navigationController viewControllers] objectAtIndex:0] isKindOfClass:NSClassFromString(@"WXDemoViewController")]) {
+                WXDemoViewController * vc = (WXDemoViewController*)[[self.navigationController viewControllers] objectAtIndex:0];
+                [self.navigationController popToViewController:vc animated:NO];
+            }
+            
+            return YES;
+        }
+    }
+    
+    return NO;
+}
+#pragma clang diagnostic pop
+
+- (void)recordScannerHistory:(NSString*)urlStr {
+    
+    NSMutableArray * scanner_history = [[[NSUserDefaults standardUserDefaults] objectForKey:WX_SCANNER_HISTORY] mutableCopy];
+    if (!scanner_history) {
+        scanner_history = [NSMutableArray new];
+    }
+    if ([scanner_history containsObject:urlStr]) {
+        [scanner_history removeObject:urlStr];
+    }
+    if ([scanner_history count] >= 7) {
+        [scanner_history removeLastObject];
+    }
+    [scanner_history insertObject:urlStr atIndex:0];
+    [[NSUserDefaults standardUserDefaults] setObject:scanner_history forKey:WX_SCANNER_HISTORY];
+}
+
+@end
diff --git a/ios/WeexDemo/UIView+UIThreadCheck.h b/ios/WeexDemo/UIView+UIThreadCheck.h
new file mode 100644
index 0000000..154b602
--- /dev/null
+++ b/ios/WeexDemo/UIView+UIThreadCheck.h
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <UIKit/UIKit.h>
+
+@interface UIView (UIThreadCheck)
+
++ (void)wx_checkUIThread;
+
+@end
diff --git a/ios/WeexDemo/UIView+UIThreadCheck.m b/ios/WeexDemo/UIView+UIThreadCheck.m
new file mode 100644
index 0000000..b8d4ed8
--- /dev/null
+++ b/ios/WeexDemo/UIView+UIThreadCheck.m
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "UIView+UIThreadCheck.h"
+#import <WeexSDK/NSObject+WXSwizzle.h>
+
+#define WXCheckUIThread() NSAssert([NSThread isMainThread], \
+@"You must change UI on main thread!")
+
+@implementation UIView (UIThreadCheck)
+
++ (void)wx_checkUIThread
+{
+    [self weex_swizzle:[self class] Method:@selector(setNeedsLayout) withMethod:@selector(wx_setNeedsLayout)];
+    [self weex_swizzle:[self class] Method:@selector(setNeedsDisplay) withMethod:@selector(wx_setNeedsDisplay)];
+    [self weex_swizzle:[self class] Method:@selector(setNeedsDisplayInRect:) withMethod:@selector(wx_setNeedsDisplayInRect:)];
+}
+
+- (void)wx_setNeedsLayout
+{
+    WXCheckUIThread();
+    [self wx_setNeedsLayout];
+}
+
+- (void)wx_setNeedsDisplay
+{
+    WXCheckUIThread();
+    [self wx_setNeedsDisplay];
+}
+
+- (void)wx_setNeedsDisplayInRect:(CGRect)rect
+{
+    WXCheckUIThread();
+    [self wx_setNeedsDisplayInRect:rect];
+}
+
+@end
diff --git a/ios/WeexDemo/UIViewController+WXDemoNaviBar.h b/ios/WeexDemo/UIViewController+WXDemoNaviBar.h
new file mode 100644
index 0000000..3ddbfd8
--- /dev/null
+++ b/ios/WeexDemo/UIViewController+WXDemoNaviBar.h
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <UIKit/UIKit.h>
+#import "DemoDefine.h"
+
+@interface UIViewController (WXDemoNaviBar) <UIGestureRecognizerDelegate>
+
+/**
+ *  back button click action
+ *  @param sender responder
+ */
+- (void)backButtonClicked:(id)sender;
+
+- (void)setupNaviBar;
+
+@end
+
diff --git a/ios/WeexDemo/UIViewController+WXDemoNaviBar.m b/ios/WeexDemo/UIViewController+WXDemoNaviBar.m
new file mode 100644
index 0000000..09b4105
--- /dev/null
+++ b/ios/WeexDemo/UIViewController+WXDemoNaviBar.m
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "UIViewController+WXDemoNaviBar.h"
+#import "WXScannerVC.h"
+#import "WXScannerHistoryVC.h"
+#import "WXDefine.h"
+#import <objc/runtime.h>
+
+@implementation UIViewController (WXDemoNaviBar)
+
+- (void)setupNaviBar
+{
+    UIScreenEdgePanGestureRecognizer *edgePanGestureRecognizer = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(edgePanGesture:)];
+    edgePanGestureRecognizer.delegate = self;
+    edgePanGestureRecognizer.edges = UIRectEdgeLeft;
+    [self.view addGestureRecognizer:edgePanGestureRecognizer];
+    
+    NSArray *ver = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
+    if ([[ver objectAtIndex:0] intValue] >= 7) {
+        // iOS 7.0 or later
+        self.navigationController.navigationBar.barTintColor = WEEX_COLOR;
+        self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
+        [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
+        self.navigationController.navigationBar.translucent = NO;
+    }
+    if (!self.navigationItem.leftBarButtonItem) {
+        UIBarButtonItem *leftItem;
+        if(![[self.navigationController.viewControllers objectAtIndex:0] isEqual:self]) {
+            leftItem = [self backButtonItem];
+        } else {
+            leftItem = [self leftBarButtonItem];
+        }
+        self.navigationItem.leftBarButtonItems = @[leftItem];
+    }
+    if ([self isKindOfClass:[WXScannerVC class]]) {
+        UIBarButtonItem *historyItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"scan_history"]
+                                                          style:UIBarButtonItemStylePlain
+                                                         target:self
+                                                         action:@selector(historyButtonClicked:)];
+        self.navigationItem.rightBarButtonItems = @[historyItem];
+    }
+    if([self isKindOfClass:[WXScannerHistoryVC class]]) {
+        UIBarButtonItem *historyItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"delete"]
+                                                                        style:UIBarButtonItemStylePlain
+                                                                       target:self
+                                                                       action:@selector(clearScannerHistory:)];
+        self.navigationItem.rightBarButtonItems = @[historyItem];
+    }
+}
+
+- (void)edgePanGesture:(UIScreenEdgePanGestureRecognizer*)edgePanGestureRecognizer
+{
+    [self.navigationController popViewControllerAnimated:YES];
+}
+
+#pragma mark- UIGestureRecognizerDelegate
+- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
+{
+    if (self.navigationController && [self.navigationController.viewControllers count] == 1) {
+        return NO;
+    }
+    return YES;
+}
+
+#pragma mark -
+#pragma mark - UIBarButtonItems
+
+- (UIBarButtonItem *)leftBarButtonItem
+{
+    UIBarButtonItem *leftItem = objc_getAssociatedObject(self, _cmd);
+    
+    if (!leftItem) {
+        leftItem = [[UIBarButtonItem alloc]
+                    initWithImage:[UIImage imageNamed:@"scan"]
+                     style:UIBarButtonItemStylePlain
+                    target:self
+                    action:@selector(scanQR:)];
+        leftItem.accessibilityHint = @"click to scan qr code";
+        leftItem.accessibilityValue = @"scan qr code";
+        objc_setAssociatedObject(self, _cmd, leftItem, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+    }
+    return leftItem;
+}
+
+- (UIBarButtonItem *)backButtonItem
+{
+    UIBarButtonItem *backButtonItem = objc_getAssociatedObject(self, _cmd);
+    if (!backButtonItem) {
+        backButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back"]
+                                                          style:UIBarButtonItemStylePlain
+                                                         target:self
+                                                         action:@selector(backButtonClicked:)];
+        objc_setAssociatedObject(self, _cmd, backButtonItem, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+    }
+    return backButtonItem;
+}
+
+#pragma mark -
+#pragma mark - UIBarButtonItem actions
+
+- (void)scanQR:(id)sender {
+    
+    WXScannerVC * scanViewController = [[WXScannerVC alloc] init];
+    [self.navigationController pushViewController:scanViewController animated:YES];
+}
+
+- (void)backButtonClicked:(id)sender {
+    
+    [self.navigationController popViewControllerAnimated:YES];
+}
+
+- (void)historyButtonClicked:(id)sender {
+    
+    [self.navigationController pushViewController:[WXScannerHistoryVC new] animated:YES];
+}
+
+- (void)clearScannerHistory:(id)sender {
+    [[NSUserDefaults standardUserDefaults] removeObjectForKey:WX_SCANNER_HISTORY];
+}
+
+@end
diff --git a/ios/WeexDemo/WXConfigCenterDefaultImpl.h b/ios/WeexDemo/WXConfigCenterDefaultImpl.h
new file mode 100644
index 0000000..2889a4a
--- /dev/null
+++ b/ios/WeexDemo/WXConfigCenterDefaultImpl.h
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import "WXConfigCenterProtocol.h"
+
+@interface WXConfigCenterDefaultImpl : NSObject<WXConfigCenterProtocol>
+
+@end
diff --git a/ios/WeexDemo/WXConfigCenterDefaultImpl.m b/ios/WeexDemo/WXConfigCenterDefaultImpl.m
new file mode 100644
index 0000000..d127edb
--- /dev/null
+++ b/ios/WeexDemo/WXConfigCenterDefaultImpl.m
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "WXConfigCenterDefaultImpl.h"
+
+@implementation WXConfigCenterDefaultImpl
+
+- (id)configForKey:(NSString *)key defaultValue:(id)defaultValue isDefault:(BOOL *)isDefault
+{
+    NSArray<NSString*>* keys = [key componentsSeparatedByString:@"."];
+    if ([keys[0] isEqualToString:@"iOS_weex_ext_config"] && [keys[1] isEqualToString:@"text_render_useCoreText"]){
+        return @YES;
+    }
+    if ([keys[0] isEqualToString:@"iOS_weex_ext_config"] && [keys[1] isEqualToString:@"slider_class_name"]){
+        return @"WXCycleSliderComponent";
+    }
+    if ([keys[0] isEqualToString:@"iOS_weex_prerender_config"] && [keys[1] isEqualToString:@"is_switch_on"]){
+        return @YES;
+    }
+    if ([keys[0] isEqualToString:@"iOS_weex_prerender_config"] && [keys[1] isEqualToString:@"cacheTime"]){
+        return @300000;
+    }
+    if ([keys[0] isEqualToString:@"iOS_weex_prerender_config"] && [keys[1] isEqualToString:@"max_cache_num"]){
+        return @2;
+    }
+    return defaultValue;
+}
+
+@end
diff --git a/ios/WeexDemo/WXDemoViewController.h b/ios/WeexDemo/WXDemoViewController.h
new file mode 100644
index 0000000..be2935d
--- /dev/null
+++ b/ios/WeexDemo/WXDemoViewController.h
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <UIKit/UIKit.h>
+#import <SRWebSocket.h>
+
+@interface WXDemoViewController : UIViewController<SRWebSocketDelegate>
+
+@property (nonatomic, strong) NSString *script;
+@property (nonatomic, strong) NSURL *url;
+@property (nonatomic, assign) BOOL showNavigationBar;
+@property (nonatomic, strong) SRWebSocket *hotReloadSocket;
+@property (nonatomic, strong) NSString *source;
+
+@end
+
diff --git a/ios/WeexDemo/WXDemoViewController.m b/ios/WeexDemo/WXDemoViewController.m
new file mode 100644
index 0000000..c3e321d
--- /dev/null
+++ b/ios/WeexDemo/WXDemoViewController.m
@@ -0,0 +1,348 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "WXDemoViewController.h"
+#import <WeexSDK/WXSDKInstance.h>
+#import <WeexSDK/WXSDKEngine.h>
+#import <WeexSDK/WXUtility.h>
+#import <WeexSDK/WXDebugTool.h>
+#import <WeexSDK/WXSDKManager.h>
+#import "UIViewController+WXDemoNaviBar.h"
+#import "DemoDefine.h"
+#import "WXPrerenderManager.h"
+#import "WXMonitor.h"
+#import "AppDelegate.h"
+
+@interface WXDemoViewController () <UIScrollViewDelegate, UIWebViewDelegate>
+@property (nonatomic, strong) WXSDKInstance *instance;
+@property (nonatomic, strong) UIView *weexView;
+
+@property (nonatomic, strong) NSArray *refreshList;
+@property (nonatomic, strong) NSArray *refreshList1;
+@property (nonatomic, strong) NSArray *refresh;
+@property (nonatomic) NSInteger count;
+
+@property (nonatomic, assign) CGFloat weexHeight;
+@property (nonatomic, weak) id<UIScrollViewDelegate> originalDelegate;
+
+@end
+
+@implementation WXDemoViewController
+
+- (instancetype)init
+{
+    if (self = [super init]) {
+    }
+    
+    return self;
+}
+
+- (void)setInterfaceOrientation:(UIDeviceOrientation)orientation
+{
+    if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
+        [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:orientation]
+                                    forKey:@"orientation"];
+    }
+}
+
+- (void)viewDidLoad
+{
+    [super viewDidLoad];
+    
+    self.view.backgroundColor = [UIColor whiteColor];
+    [self.view setClipsToBounds:YES];
+    
+    _showNavigationBar = NO;
+    [self.navigationController setNavigationBarHidden:_showNavigationBar];
+    _weexHeight = self.view.frame.size.height - CGRectGetMaxY(self.navigationController.navigationBar.frame);
+    
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationRefreshInstance:) name:@"RefreshInstance" object:nil];
+    [self render];
+}
+
+- (void)viewDidAppear:(BOOL)animated
+{
+    [super viewDidAppear:animated];
+    [self updateInstanceState:WeexInstanceAppear];
+    
+    AppDelegate* appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
+    appDelegate.allowRotation = NO;
+    [_instance isKeepingRawCssStyles:^(BOOL value) {
+        appDelegate.allowRotation = value;
+    }];
+}
+
+- (void)viewDidDisappear:(BOOL)animated
+{
+    [super viewDidDisappear:animated];
+    [_instance didDisappear];
+    [self updateInstanceState:WeexInstanceDisappear];
+}
+
+- (void)viewWillDisappear:(BOOL)animated
+{
+    [super viewWillDisappear:animated];
+    // restore to protrait
+    AppDelegate* appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
+    appDelegate.allowRotation = NO;
+    [self setInterfaceOrientation:UIDeviceOrientationPortrait];
+}
+
+- (void)viewWillAppear:(BOOL)animated
+{
+    [super viewWillAppear:animated];
+    [_instance willAppear];
+    [self setupNaviBar];
+    [self setupRightBarItem];
+    [self.navigationController setNavigationBarHidden:_showNavigationBar];
+}
+
+//TODO get height
+- (void)viewDidLayoutSubviews
+{
+    _weexHeight = [UIScreen mainScreen].bounds.size.height - CGRectGetMaxY(self.navigationController.navigationBar.frame);
+    UIEdgeInsets safeArea = UIEdgeInsetsZero;
+#ifdef __IPHONE_11_0
+    if (@available(iOS 11.0, *)) {
+        safeArea = self.view.safeAreaInsets;
+    } else {
+        // Fallback on earlier versions
+    }
+#endif
+    _instance.frame = CGRectMake(safeArea.left, safeArea.top, self.view.frame.size.width-safeArea.left-safeArea.right, _weexHeight-safeArea.top-safeArea.bottom);
+}
+
+- (void)didReceiveMemoryWarning {
+    [super didReceiveMemoryWarning];
+    // Dispose of any resources that can be recreated.
+}
+
+- (void)dealloc
+{
+    
+    [_instance destroyInstance];
+#ifdef DEBUG
+    [_instance forceGarbageCollection];
+#endif
+    
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+- (void)render
+{
+    CGFloat width = self.view.frame.size.width;
+//    if ([_url.absoluteString isEqualToString:HOME_URL]) {
+//        [self.navigationController setNavigationBarHidden:YES];
+//    }
+    [_instance destroyInstance];
+    _instance = [[WXSDKInstance alloc] init];
+    if([WXPrerenderManager isTaskExist:[self.url absoluteString]]){
+        _instance = [WXPrerenderManager instanceFromUrl:self.url.absoluteString];
+    }
+    
+    _instance.isMainContainerStack = YES;
+    _instance.viewController = self;
+    UIEdgeInsets safeArea = UIEdgeInsetsZero;
+    
+#ifdef __IPHONE_11_0
+    if (@available(iOS 11.0, *)) {
+        safeArea = self.view.safeAreaInsets;
+    } else {
+        // Fallback on earlier versions
+    }
+#endif
+    
+    _instance.frame = CGRectMake(self.view.frame.size.width-width, 0, width, _weexHeight-safeArea.bottom);
+    
+    __weak typeof(self) weakSelf = self;
+    _instance.onCreate = ^(UIView *view) {
+        [weakSelf.weexView removeFromSuperview];
+        weakSelf.weexView = view;
+        [weakSelf.view addSubview:weakSelf.weexView];
+        UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, weakSelf.weexView);
+    };
+    _instance.onFailed = ^(NSError *error) {
+        if ([[error domain] isEqualToString:@"1"]) {
+            dispatch_async(dispatch_get_main_queue(), ^{
+                NSMutableString *errMsg=[NSMutableString new];
+                [errMsg appendFormat:@"ErrorType:%@\n",[error domain]];
+                [errMsg appendFormat:@"ErrorCode:%ld\n",(long)[error code]];
+                [errMsg appendFormat:@"ErrorInfo:%@\n", [error userInfo]];
+                
+                UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"render failed" message:errMsg delegate:weakSelf cancelButtonTitle:nil otherButtonTitles:@"ok", nil];
+                [alertView show];
+            });
+        }
+    };
+    
+    __weak WXSDKInstance* theInstance = _instance;
+    _instance.renderFinish = ^(UIView *view) {
+         WXLogDebug(@"%@", @"Render Finish...");
+        [weakSelf updateInstanceState:WeexInstanceAppear];
+        
+        AppDelegate* appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
+        appDelegate.allowRotation = NO;
+        [theInstance isKeepingRawCssStyles:^(BOOL value) {
+            appDelegate.allowRotation = value;
+        }];
+    };
+    
+    _instance.updateFinish = ^(UIView *view) {
+        WXLogDebug(@"%@", @"Update Finish...");
+    };
+    if (!self.url) {
+        WXLogError(@"error: render url is nil");
+        return;
+    }
+    if([WXPrerenderManager isTaskExist:[self.url absoluteString]]){
+        WX_MONITOR_INSTANCE_PERF_START(WXPTJSDownload, _instance);
+        WX_MONITOR_INSTANCE_PERF_END(WXPTJSDownload, _instance);
+        WX_MONITOR_INSTANCE_PERF_START(WXPTFirstScreenRender, _instance);
+        WX_MONITOR_INSTANCE_PERF_START(WXPTAllRender, _instance);
+        [WXPrerenderManager renderFromCache:[self.url absoluteString]];
+        return;
+    }
+    _instance.viewController = self;
+    NSURL *URL = [self testURL: [self.url absoluteString]];
+    NSString *randomURL = [NSString stringWithFormat:@"%@%@random=%d",URL.absoluteString,URL.query?@"&":@"?",arc4random()];
+    [_instance renderWithURL:[NSURL URLWithString:randomURL] options:@{@"bundleUrl":URL.absoluteString} data:nil];
+    [self.navigationController.navigationBar setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                      [UIColor whiteColor], NSForegroundColorAttributeName, nil]];
+    if([_instance.pageName hasPrefix:@"http://dotwe.org"] || [_instance.pageName hasPrefix:@"https://dotwe.org"]) {
+        self.navigationItem.title = @"Weex Online Example";
+    } else {
+        self.navigationItem.title = _instance.pageName;
+    }
+}
+
+- (void)updateInstanceState:(WXState)state
+{
+    if (_instance && _instance.state != state) {
+        _instance.state = state;
+        
+        if (state == WeexInstanceAppear) {
+            [[WXSDKManager bridgeMgr] fireEvent:_instance.instanceId ref:WX_SDK_ROOT_REF type:@"viewappear" params:nil domChanges:nil];
+        }
+        else if (state == WeexInstanceDisappear) {
+            [[WXSDKManager bridgeMgr] fireEvent:_instance.instanceId ref:WX_SDK_ROOT_REF type:@"viewdisappear" params:nil domChanges:nil];
+        }
+    }
+}
+
+#pragma mark - refresh
+- (void)refreshWeex
+{
+    [self render];
+}
+
+#pragma mark - UIBarButtonItems
+
+- (void)setupRightBarItem
+{
+    if ([self.url.scheme hasPrefix:@"http"]) {
+        [self loadRefreshCtl];
+    }
+}
+
+- (void)loadRefreshCtl {
+    UIBarButtonItem *refreshButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"reload"] style:UIBarButtonItemStylePlain target:self action:@selector(refreshWeex)];
+    refreshButtonItem.accessibilityHint = @"click to reload curent page";
+    self.navigationItem.rightBarButtonItem = refreshButtonItem;
+}
+
+#pragma mark - websocket
+- (void)webSocketDidOpen:(SRWebSocket *)webSocket
+{
+    
+}
+
+- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message
+{
+    if ([@"refresh" isEqualToString:message]) {
+        [self render];
+    }
+}
+
+- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error
+{
+    
+}
+
+# pragma mark - orientation
+
+- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
+{
+    if (_instance) {
+        CGFloat w = [UIScreen mainScreen].bounds.size.width;
+        CGFloat h = [UIScreen mainScreen].bounds.size.height;
+        [_instance setPageRequiredWidth:w height:h];
+        [_instance reloadLayout];
+    }
+}
+
+#pragma mark - localBundle
+/*- (void)loadLocalBundle:(NSURL *)url
+{
+    NSURL * localPath = nil;
+    NSMutableArray * pathComponents = nil;
+    if (self.url) {
+        pathComponents =[NSMutableArray arrayWithArray:[url.absoluteString pathComponents]];
+        [pathComponents removeObjectsInRange:NSRangeFromString(@"0 3")];
+        [pathComponents replaceObjectAtIndex:0 withObject:@"bundlejs"];
+        
+        NSString *filePath = [NSString stringWithFormat:@"%@/%@",[NSBundle mainBundle].bundlePath,[pathComponents componentsJoinedByString:@"/"]];
+        localPath = [NSURL fileURLWithPath:filePath];
+    }else {
+        NSString *filePath = [NSString stringWithFormat:@"%@/bundlejs/index.js",[NSBundle mainBundle].bundlePath];
+        localPath = [NSURL fileURLWithPath:filePath];
+    }
+    
+    NSString *bundleUrl = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/bundlejs/",[NSBundle mainBundle].bundlePath]].absoluteString;
+     [_instance renderWithURL:localPath options:@{@"bundleUrl":bundleUrl} data:nil];
+}*/
+
+#pragma mark - load local device bundle
+- (NSURL*)testURL:(NSString*)url
+{
+    NSRange range = [url rangeOfString:@"_wx_tpl"];
+    if (range.location != NSNotFound) {
+        NSString *tmp = [url substringFromIndex:range.location];
+        NSUInteger start = [tmp rangeOfString:@"="].location;
+        NSUInteger end = [tmp rangeOfString:@"&"].location;
+        ++start;
+        if (end == NSNotFound) {
+            end = [tmp length] - start;
+        }
+        else {
+            end = end - start;
+        }
+        NSRange subRange;
+        subRange.location = start;
+        subRange.length = end;
+        url = [tmp substringWithRange:subRange];
+    }
+    return [NSURL URLWithString:url];
+}
+
+#pragma mark - notification
+- (void)notificationRefreshInstance:(NSNotification *)notification {
+    [self refreshWeex];
+}
+
+@end
diff --git a/ios/WeexDemo/WXExtModule.h b/ios/WeexDemo/WXExtModule.h
new file mode 100644
index 0000000..e440c58
--- /dev/null
+++ b/ios/WeexDemo/WXExtModule.h
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <Foundation/Foundation.h>
+
+#import <WeexSDK/WXModuleProtocol.h>
+
+@interface WXExtModule : NSObject <WXModuleProtocol>
+
+@end
diff --git a/ios/WeexDemo/WXExtModule.m b/ios/WeexDemo/WXExtModule.m
new file mode 100644
index 0000000..16b2e0a
--- /dev/null
+++ b/ios/WeexDemo/WXExtModule.m
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "WXExtModule.h"
+
+@implementation WXExtModule
+
+WX_EXPORT_METHOD(@selector(generateCover:))
+
+- (void)generateCover:(WXModuleKeepAliveCallback)callback
+{
+#if DEBUG
+#if !TARGET_IPHONE_SIMULATOR
+    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
+    NSString *documentsDirectory = [paths objectAtIndex:0];
+    setenv("GCOV_PREFIX", [documentsDirectory cStringUsingEncoding:NSUTF8StringEncoding], 1);
+    setenv("GCOV_PREFIX_STRIP", "6", 1);
+#endif
+    
+#if defined __cplusplus
+    extern "C" {
+#endif
+    extern void __gcov_flush(void);
+    __gcov_flush();
+#if defined __cplusplus
+    };
+#endif
+    
+    if (callback) {
+        NSDictionary * result = @{@"ok": @true};
+        callback(result,NO);
+    }
+#else
+    if (callback) {
+        NSDictionary * result = @{@"ok": @false,@"msg":@"only debug mode support"};
+        callback(result,NO);
+    }
+#endif
+}
+
+@end
diff --git a/ios/WeexDemo/WXExtendCallNativeTest.h b/ios/WeexDemo/WXExtendCallNativeTest.h
new file mode 100644
index 0000000..4671779
--- /dev/null
+++ b/ios/WeexDemo/WXExtendCallNativeTest.h
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import "WXExtendCallNativeProtocol.h"
+
+@interface WXExtendCallNativeTest : NSObject<WXExtendCallNativeProtocol>
+
+@end
diff --git a/ios/WeexDemo/WXExtendCallNativeTest.m b/ios/WeexDemo/WXExtendCallNativeTest.m
new file mode 100644
index 0000000..ba11caf
--- /dev/null
+++ b/ios/WeexDemo/WXExtendCallNativeTest.m
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "WXExtendCallNativeTest.h"
+
+@implementation WXExtendCallNativeTest
+
+#pragma mark -
+#pragma WXExtendCallNativeProtocol
+
++ (BOOL)checkParameters:(NSDictionary *)parameters
+{
+    if(!parameters || ![parameters isKindOfClass:[NSDictionary class]]){
+        return NO;
+    }
+    
+    if(!parameters[@"className"]){
+        return NO;
+    }
+    
+    return YES;
+}
+
+
++ (id)excuteCallNative:(NSDictionary *)parameters
+{
+    NSLog(@"weex test");
+    return @{@"value":@"test"};
+}
+
+@end
diff --git a/ios/WeexDemo/WXNavigationHandlerImpl.h b/ios/WeexDemo/WXNavigationHandlerImpl.h
new file mode 100644
index 0000000..bfd4020
--- /dev/null
+++ b/ios/WeexDemo/WXNavigationHandlerImpl.h
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import <WeexSDK/WXNavigationProtocol.h>
+
+@interface WXNavigationHandlerImpl : NSObject <WXNavigationProtocol>
+
+@end
diff --git a/ios/WeexDemo/WXNavigationHandlerImpl.m b/ios/WeexDemo/WXNavigationHandlerImpl.m
new file mode 100644
index 0000000..67b129c
--- /dev/null
+++ b/ios/WeexDemo/WXNavigationHandlerImpl.m
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <WeexSDK/WeexSDK.h>
+#import "WXNavigationHandlerImpl.h"
+#import "WXDemoViewController.h"
+
+@implementation WXNavigationHandlerImpl
+
+
+
+- (void)clearNavigationItemWithParam:(NSDictionary *)param position:(WXNavigationItemPosition)position completion:(WXNavigationResultBlock)block withContainer:(UIViewController *)container {
+    
+}
+
+- (id)navigationControllerOfContainer:(UIViewController *)container {
+    return container.navigationController;
+}
+
+- (void)popViewControllerWithParam:(NSDictionary *)param completion:(WXNavigationResultBlock)block withContainer:(UIViewController *)container {
+    BOOL animated = YES;
+    id obj = [param objectForKey:@"animated"];
+    if (obj) {
+        animated = [WXConvert BOOL:obj];
+    }
+    [container.navigationController popViewControllerAnimated:animated];
+}
+
+- (void)pushViewControllerWithParam:(NSDictionary *)param completion:(WXNavigationResultBlock)block withContainer:(UIViewController *)container {
+    BOOL animated = YES;
+    NSString *obj = [[param objectForKey:@"animated"] lowercaseString];
+    if (obj && [obj isEqualToString:@"false"]) {
+        animated = NO;
+    }
+    
+    WXDemoViewController *vc = [[WXDemoViewController alloc] init];
+    vc.url = [NSURL URLWithString:param[@"url"]];
+    vc.hidesBottomBarWhenPushed = YES;
+    [container.navigationController pushViewController:vc animated:animated];
+}
+
+- (void)setNavigationBackgroundColor:(UIColor *)backgroundColor withContainer:(UIViewController *)container {
+    
+}
+
+- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated withContainer:(UIViewController *)container {
+    if (![container isKindOfClass:[WXBaseViewController class]]) {
+        return;
+    }
+    
+    container.navigationController.navigationBarHidden = hidden;
+}
+
+- (void)setNavigationItemWithParam:(NSDictionary *)param position:(WXNavigationItemPosition)position completion:(WXNavigationResultBlock)block withContainer:(UIViewController *)container {
+    
+}
+
+@end
diff --git a/ios/WeexDemo/WXSyncTestModule.h b/ios/WeexDemo/WXSyncTestModule.h
new file mode 100644
index 0000000..254af6f
--- /dev/null
+++ b/ios/WeexDemo/WXSyncTestModule.h
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import <WeexSDK/WXModuleProtocol.h>
+
+@interface WXSyncTestModule : NSObject <WXModuleProtocol>
+
+@end
diff --git a/ios/WeexDemo/WXSyncTestModule.m b/ios/WeexDemo/WXSyncTestModule.m
new file mode 100644
index 0000000..784502d
--- /dev/null
+++ b/ios/WeexDemo/WXSyncTestModule.m
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "WXSyncTestModule.h"
+
+@implementation WXSyncTestModule
+
+WX_EXPORT_METHOD_SYNC(@selector(getString))
+WX_EXPORT_METHOD_SYNC(@selector(getNumber))
+WX_EXPORT_METHOD_SYNC(@selector(getArray))
+WX_EXPORT_METHOD_SYNC(@selector(getObject))
+
+- (NSString *)getString
+{
+    return @"testString";
+}
+
+- (NSUInteger)getNumber
+{
+    return 111111;
+}
+
+- (NSArray *)getArray
+{
+    return @[@(111111),@"testString",@"testString2"];
+}
+
+- (NSDictionary *)getObject
+{
+    return @{@"number":@(111111), @"string1":@"testString",@"string2":@"testString2"};
+}
+
+@end
diff --git a/ios/WeexDemo/Websocket/SRWebSocket+Weex.h b/ios/WeexDemo/Websocket/SRWebSocket+Weex.h
new file mode 100644
index 0000000..8bb36b5
--- /dev/null
+++ b/ios/WeexDemo/Websocket/SRWebSocket+Weex.h
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <SocketRocket/SRWebSocket.h>
+#import <WeexSDK/WXWebSocketHandler.h>
+#import <objc/runtime.h>
+
+@interface SRWebSocket (Weex)
+
+@property (nonatomic, copy) NSString *wx_Identifier;
+@property (nonatomic, weak) id<WXWebSocketDelegate> wx_WebSocketDelegate;
+
+@end
diff --git a/ios/WeexDemo/Websocket/SRWebSocket+Weex.m b/ios/WeexDemo/Websocket/SRWebSocket+Weex.m
new file mode 100644
index 0000000..afdbcfa
--- /dev/null
+++ b/ios/WeexDemo/Websocket/SRWebSocket+Weex.m
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "SRWebSocket+Weex.h"
+static char wx_IdentifierKey;
+static char wx_WebSocketDelegateKey;
+
+
+@implementation SRWebSocket (Weex)
+
+-(void)setWx_Identifier:(NSString *)wx_Identifier
+{
+    objc_setAssociatedObject(self, &wx_IdentifierKey, wx_Identifier, OBJC_ASSOCIATION_COPY);
+}
+
+-(NSString *)wx_Identifier
+{
+    return objc_getAssociatedObject(self, &wx_IdentifierKey);
+}
+
+-(void)setWx_WebSocketDelegate:(id<WXWebSocketDelegate>)wx_WebSocketDelegate
+{
+    objc_setAssociatedObject(self, &wx_WebSocketDelegateKey, wx_WebSocketDelegate, OBJC_ASSOCIATION_COPY);
+}
+
+-(NSString *)wx_WebSocketDelegate
+{
+    return objc_getAssociatedObject(self, &wx_WebSocketDelegateKey);
+}
+
+@end
diff --git a/ios/WeexDemo/Websocket/WXWebSocketDefaultImpl.h b/ios/WeexDemo/Websocket/WXWebSocketDefaultImpl.h
new file mode 100644
index 0000000..620e71a
--- /dev/null
+++ b/ios/WeexDemo/Websocket/WXWebSocketDefaultImpl.h
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import <WeexSDK/WXWebSocketHandler.h>
+
+@interface WXWebSocketDefaultImpl : NSObject<WXWebSocketHandler>
+
+@end
diff --git a/ios/WeexDemo/Websocket/WXWebSocketDefaultImpl.m b/ios/WeexDemo/Websocket/WXWebSocketDefaultImpl.m
new file mode 100644
index 0000000..60c9d34
--- /dev/null
+++ b/ios/WeexDemo/Websocket/WXWebSocketDefaultImpl.m
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "WXWebSocketDefaultImpl.h"
+#import <SocketRocket/SRWebSocket.h>
+#import "SRWebSocket+Weex.h"
+
+@interface WXWebSocketDefaultImpl()<SRWebSocketDelegate>
+
+@end
+
+@implementation WXWebSocketDefaultImpl
+{
+    NSMutableDictionary<NSString *, SRWebSocket *> *_webSockets;
+}
+
+#pragma mark - WXWebSocketHandler
+- (void)open:(NSString *)url protocol:(NSString *)protocol identifier:(NSString *)identifier withDelegate:(id<WXWebSocketDelegate>)delegate
+{
+    if(!_webSockets)
+    {
+        _webSockets = [NSMutableDictionary new];
+    }
+    if([_webSockets objectForKey:identifier]){
+        SRWebSocket *webSocket = [_webSockets objectForKey:identifier];
+        webSocket.delegate = nil;
+        [webSocket close];
+        
+    }
+    NSArray *protols;
+    if([protocol length]>0){
+       protols = [NSArray arrayWithObject:protocol];
+    }
+    SRWebSocket *webSocket = [[SRWebSocket alloc] initWithURL:[NSURL URLWithString:url] protocols:protols];
+    webSocket.delegate = self;
+    [webSocket open];
+    webSocket.wx_Identifier = identifier;
+    webSocket.wx_WebSocketDelegate = delegate;
+    [_webSockets setObject:webSocket forKey:identifier];
+}
+
+- (void)send:(id)identifier data:(NSString *)data
+{
+    SRWebSocket *webSocket = [_webSockets objectForKey:identifier];
+    if(webSocket) {
+        [webSocket send:data];
+    }
+}
+
+- (void)close:(NSString *)identifier
+{
+    SRWebSocket *webSocket = [_webSockets objectForKey:identifier];
+    if(webSocket) {
+        [webSocket close];
+    }
+}
+
+- (void)close:(NSString *)identifier code:(NSInteger)code reason:(NSString *)reason
+{
+    SRWebSocket *webSocket = [_webSockets objectForKey:identifier];
+    if(webSocket) {
+        [webSocket closeWithCode:code reason:reason];
+    }
+}
+
+- (void)clear:(NSString *)identifier
+{
+    SRWebSocket *webSocket = [_webSockets objectForKey:identifier];
+    if(webSocket) {
+        webSocket.delegate = nil;
+        [webSocket close];
+        [_webSockets removeObjectForKey:identifier];
+    }
+}
+
+#pragma mark -SRWebSocketDelegate
+- (void)webSocketDidOpen:(SRWebSocket *)webSocket;
+{
+    if (webSocket.wx_WebSocketDelegate && [webSocket.wx_WebSocketDelegate respondsToSelector:@selector(didOpen)]) {
+        [webSocket.wx_WebSocketDelegate didOpen];
+    }
+}
+
+- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;
+{
+    if (webSocket.wx_WebSocketDelegate && [webSocket.wx_WebSocketDelegate respondsToSelector:@selector(didFailWithError:)]) {
+        [webSocket.wx_WebSocketDelegate didFailWithError:error];
+    }
+}
+
+- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message;
+{
+    if (webSocket.wx_WebSocketDelegate && [webSocket.wx_WebSocketDelegate respondsToSelector:@selector(didReceiveMessage:)]) {
+        [webSocket.wx_WebSocketDelegate didReceiveMessage:message];
+    }
+}
+
+- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;
+{
+    if (webSocket.wx_WebSocketDelegate && [webSocket.wx_WebSocketDelegate respondsToSelector:@selector(didCloseWithCode:reason:wasClean:)]) {
+        [webSocket.wx_WebSocketDelegate didCloseWithCode:code reason:reason wasClean:wasClean];
+    }
+}
+@end
diff --git a/ios/WeexDemo/debug/DebugAnalyzer.h b/ios/WeexDemo/debug/DebugAnalyzer.h
new file mode 100644
index 0000000..99838d0
--- /dev/null
+++ b/ios/WeexDemo/debug/DebugAnalyzer.h
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <WeexSDK/WeexSDK.h>
+
+
+@interface DebugAnalyzer :NSObject<WXAnalyzerProtocol>
+@end
diff --git a/ios/WeexDemo/debug/DebugAnzlyzer.m b/ios/WeexDemo/debug/DebugAnzlyzer.m
new file mode 100644
index 0000000..0a84bb8
--- /dev/null
+++ b/ios/WeexDemo/debug/DebugAnzlyzer.m
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import <WeexSDK/WeexSDK.h>
+#import "DebugAnalyzer.h"
+
+
+@implementation DebugAnalyzer
+- (void)transfer:(NSDictionary *) value
+{
+    NSLog(@"DebugAnalyzer value : %@",value);
+}
+@end
diff --git a/ios/WeexDemo/debug/WXATLoggerPlugin.h b/ios/WeexDemo/debug/WXATLoggerPlugin.h
new file mode 100644
index 0000000..1bfbffa
--- /dev/null
+++ b/ios/WeexDemo/debug/WXATLoggerPlugin.h
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import <ATSDK/ATPluginProtocol.h>
+
+@interface WXATLoggerPlugin : NSObject<ATPluginProtocol>
+
+@end
diff --git a/ios/WeexDemo/debug/WXATLoggerPlugin.m b/ios/WeexDemo/debug/WXATLoggerPlugin.m
new file mode 100644
index 0000000..66eaf81
--- /dev/null
+++ b/ios/WeexDemo/debug/WXATLoggerPlugin.m
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "WXATLoggerPlugin.h"
+#import <WeexSDK/WXSDKEngine.h>
+
+@implementation WXATLoggerPlugin
+
+- (void)pluginDidLoadWithArgs:(NSArray *)args
+{
+  
+}
+
+- (void)pluginWillOpenInContainer:(UIViewController *)container withArg:(NSArray *)args
+{
+    NSURL *URL = [NSURL URLWithString:@"http://127.0.0.1:8687/launchDebugger"];
+    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
+    
+    NSURLSession *session = [NSURLSession sharedSession];
+    NSURLSessionDataTask *task = [session dataTaskWithRequest:request
+                                            completionHandler:
+                                  ^(NSData *data, NSURLResponse *response, NSError *error) {
+                                      // ...
+                                  }];
+    
+    [task resume];
+    
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        [WXSDKEngine connectDebugServer:@"ws://127.0.0.1:8687/debugger/0/renderer"];
+    });
+}
+
+- (void)pluginWillClose
+{
+    
+}
+
+- (void)pluginDidUnload
+{
+    
+}
+
+- (CGRect)wantReactArea
+{
+    return CGRectZero;
+}
+
+
+@end
diff --git a/ios/WeexDemo/debug/WXATViewHierarchyPlugin.h b/ios/WeexDemo/debug/WXATViewHierarchyPlugin.h
new file mode 100644
index 0000000..0609e42
--- /dev/null
+++ b/ios/WeexDemo/debug/WXATViewHierarchyPlugin.h
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+//#import <Foundation/Foundation.h>
+//#import <ATSDK/ATPluginProtocol.h>
+//
+//@interface WXATViewHierarchyPlugin : NSObject<ATPluginProtocol>
+//
+//@end
diff --git a/ios/WeexDemo/debug/WXATViewHierarchyPlugin.m b/ios/WeexDemo/debug/WXATViewHierarchyPlugin.m
new file mode 100644
index 0000000..6c5fa27
--- /dev/null
+++ b/ios/WeexDemo/debug/WXATViewHierarchyPlugin.m
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+//#import "WXATViewHierarchyPlugin.h"
+//#import <WeexSDK/WXViewHierarchy.h>
+//
+//@implementation WXATViewHierarchyPlugin
+//{
+//    WXViewHierarchy *_hierarchy;
+//}
+//
+//- (void)pluginDidLoadWithArgs:(NSArray *)args
+//{
+//    _hierarchy = [[WXViewHierarchy alloc] init];
+//    _hierarchy.hidden = YES;
+//}
+//
+//- (void)pluginWillOpenInContainer:(UIViewController *)container withArg:(NSArray *)args
+//{
+//    [_hierarchy show];
+//}
+//
+//- (void)pluginWillClose
+//{
+//    [_hierarchy hide];
+//}
+//
+//- (void)pluginDidUnload
+//{
+//    _hierarchy = nil;
+//}
+//
+//- (CGRect)wantReactArea
+//{
+//    return CGRectZero;
+//}
+//
+//@end
diff --git a/ios/WeexDemo/extend/component/WXSelectComponent.h b/ios/WeexDemo/extend/component/WXSelectComponent.h
new file mode 100644
index 0000000..a50bd5b
--- /dev/null
+++ b/ios/WeexDemo/extend/component/WXSelectComponent.h
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <UIKit/UIKit.h>
+#import <WeexSDK/WXComponent.h>
+
+@interface WXSelectComponent : WXComponent <UIPickerViewDataSource, UIPickerViewDelegate>
+
+@end
diff --git a/ios/WeexDemo/extend/component/WXSelectComponent.m b/ios/WeexDemo/extend/component/WXSelectComponent.m
new file mode 100644
index 0000000..20bb348
--- /dev/null
+++ b/ios/WeexDemo/extend/component/WXSelectComponent.m
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "WXSelectComponent.h"
+#import "WXUtility.h"
+#import "WXComponent+Events.h"
+
+@interface WXSelectComponent()
+
+@property (nonatomic, strong) UITapGestureRecognizer *tap;
+@property (nonatomic, strong) UIPickerView *pickerView;
+@property (nonatomic, strong) NSArray *options;
+@property (nonatomic, assign) NSInteger selectIndex;
+@property (nonatomic, assign) BOOL disabled;
+
+@end
+
+@implementation WXSelectComponent
+- (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance
+{
+    self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance];
+    if (self) {
+        _tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(popupPicker)];
+        _tap.delegate = self;
+        
+        if (attributes[@"options"]) {
+            _options = [attributes[@"options"] componentsSeparatedByString:@","];
+        }
+        if (attributes[@"selectIndex"]) {
+            _selectIndex = [attributes[@"selectIndex"] integerValue];
+        }
+        if (attributes[@"disabled"]) {
+            _disabled = [attributes[@"disabled"] boolValue];
+        }
+        
+        if (styles[@""]) {
+            // setting style when init
+        }
+        
+        UIWindow * window = [UIApplication sharedApplication].keyWindow;
+        CGSize windowSize = window.rootViewController.view.frame.size;
+        CGFloat pickerViewHeight = 200.0;
+        _pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, windowSize.width, pickerViewHeight)];
+        [_pickerView setBackgroundColor:[UIColor redColor]];
+        _pickerView.dataSource = self;
+        _pickerView.delegate = self;
+    }
+    
+    return self;
+}
+
+- (void)viewDidLoad
+{
+    [_pickerView selectRow:_selectIndex inComponent:0 animated:YES];
+    // show selected item
+    _pickerView.showsSelectionIndicator=YES;
+}
+
+- (void)viewWillUnload
+{
+}
+
+- (UIView *)loadView {
+    
+    return _pickerView;
+}
+
+- (void)updateAttributes:(NSDictionary *)attributes
+{
+    if (attributes[@"options"]) {
+        _options = [attributes[@"options"] componentsSeparatedByString:@","];
+    }
+    if (attributes[@"selectIndex"]) {
+        _selectIndex = [attributes[@"selectIndex"] integerValue];
+    }
+    if (attributes[@"disabled"]) {
+        _disabled = [attributes[@"disabled"] boolValue];
+    }
+    [_pickerView reloadAllComponents];
+}
+
+- (void)updateStyles:(NSDictionary *)styles
+{
+    
+}
+
+#pragma mark - action
+- (void)popupPicker
+{
+    if (_disabled)
+        return;
+    
+    [self fireEvent:@"focus" params:nil];
+}
+
+- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
+{
+    if (gestureRecognizer == _tap)
+        return YES;
+    
+    if (otherGestureRecognizer == _tap)
+        return YES;
+    
+    return [super gestureRecognizer:gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:otherGestureRecognizer];
+}
+
+#pragma mark - pickerView delegate
+- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
+    return 1;
+}
+
+
+- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
+    return [_options count];
+}
+
+- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
+    
+    return self.calculatedFrame.size.width;
+}
+
+- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
+{
+    [self fireEvent:@"change" params:@{@"index":[NSNumber numberWithInteger:row],
+                                       @"value":[_options objectAtIndex:row]}];
+}
+
+-(NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
+{
+    return [_options objectAtIndex:row];
+}
+
+@end
diff --git a/ios/WeexDemo/extend/handler/WXApmGeneratorImpl.h b/ios/WeexDemo/extend/handler/WXApmGeneratorImpl.h
new file mode 100644
index 0000000..c3255e5
--- /dev/null
+++ b/ios/WeexDemo/extend/handler/WXApmGeneratorImpl.h
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import "WXApmProtocol.h"
+
+@interface WXApmGeneratorImpl : NSObject <WXApmGeneratorProtocol>
+
+@end
diff --git a/ios/WeexDemo/extend/handler/WXApmGeneratorImpl.m b/ios/WeexDemo/extend/handler/WXApmGeneratorImpl.m
new file mode 100644
index 0000000..64c8e25
--- /dev/null
+++ b/ios/WeexDemo/extend/handler/WXApmGeneratorImpl.m
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "WXApmGeneratorImpl.h"
+#import "WXApmImpl.h"
+
+@implementation WXApmGeneratorImpl
+
+- (id<WXApmProtocol>)gengratorApmInstance:(NSString *) type
+{
+    id<WXApmProtocol> instance = [[WXApmImpl alloc] init];
+    return instance;
+}
+
+@end
diff --git a/ios/WeexDemo/extend/handler/WXApmImpl.h b/ios/WeexDemo/extend/handler/WXApmImpl.h
new file mode 100644
index 0000000..5af8752
--- /dev/null
+++ b/ios/WeexDemo/extend/handler/WXApmImpl.h
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import "WXApmProtocol.h"
+
+@interface WXApmImpl : NSObject <WXApmProtocol>
+
+@end
diff --git a/ios/WeexDemo/extend/handler/WXApmImpl.m b/ios/WeexDemo/extend/handler/WXApmImpl.m
new file mode 100644
index 0000000..214fb80
--- /dev/null
+++ b/ios/WeexDemo/extend/handler/WXApmImpl.m
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "WXApmImpl.h"
+#import "WXUtility.h"
+#import "WXComponentManager.h"
+
+@interface WXApmImpl()
+@property(nonatomic,strong) NSMutableDictionary<NSString*,NSNumber*>* stageMap;
+@property(nonatomic,strong) NSMutableDictionary<NSString*,id>* propertyMap;
+@property(nonatomic,strong) NSMutableDictionary<NSString*,NSNumber*>* statisticMap;
+@property(nonatomic,strong) NSMutableDictionary<NSString*,id>* eventMap;
+
+@end
+
+@implementation WXApmImpl
+
+- (instancetype)init
+{
+    self = [super init];
+    if (self) {
+        _stageMap = [[NSMutableDictionary alloc] init];
+        _propertyMap = [[NSMutableDictionary alloc] init];
+        _statisticMap = [[NSMutableDictionary alloc] init];
+        _eventMap = [[NSMutableDictionary alloc] init];
+    }
+    return self;
+}
+
+
+- (void) onStart:(NSString *)instanceId topic:(NSString *)topic
+{
+    
+}
+
+- (void) onEnd
+{
+    __weak typeof(self) weakSelf = self;
+    WXPerformBlockOnComponentThread(^{
+        [weakSelf _printApmInfo];
+    });
+    
+}
+
+- (void) onEvent:(NSString *)name withValue:(id)value
+{
+    __weak typeof(self) weakSelf = self;
+    WXPerformBlockOnComponentThread(^{
+        [weakSelf.eventMap setObject:value forKey:name];
+    });
+}
+
+- (void) onStage:(NSString *)name withValue:(long)timestamp
+{
+    __weak typeof(self) weakSelf = self;
+    WXPerformBlockOnComponentThread(^{
+         [weakSelf.stageMap setObject:[NSNumber numberWithLong:timestamp] forKey:name];
+    });
+}
+
+- (void) addProperty:(NSString *)name withValue:(id)value
+{
+    __weak typeof(self) weakSelf = self;
+    WXPerformBlockOnComponentThread(^{
+         [weakSelf.propertyMap setObject:value forKey:name];
+    });
+}
+
+- (void) addStatistic:(NSString *)name withValue:(double)value
+{
+    __weak typeof(self) weakSelf = self;
+    WXPerformBlockOnComponentThread(^{
+        [weakSelf.statisticMap setObject:[NSNumber numberWithDouble:value] forKey:name];
+    });
+}
+
+- (void) addBiz:(NSString *)bizID withValue:(NSDictionary *)properties
+{
+    
+}
+
+- (void) addBizAbTest:(NSString *)bizID withValue:(NSDictionary *)abTest
+{
+    
+}
+
+- (void) addBizStage:(NSString *)bizID withValue:(NSDictionary *)stage
+{
+    
+}
+
+- (void) onSubProcedureBegin:(NSString *)subProcedureName
+{
+    
+}
+
+- (void) onSubProcedureEndFailed:(NSString *)subProcedureName
+{
+    
+}
+
+- (void) onSubProcedureEndSucceed:(NSString *)subProcedureName
+{
+    
+}
+
+- (void)pauseApmRecord {
+    
+}
+
+
+- (void)resumeApmRecord {
+    
+}
+
+
+- (void) _printApmInfo
+{
+    NSDictionary* InfoMap = @{
+                              @"stage":self.stageMap,
+                              @"property":self.propertyMap,
+                              @"statistic":self.statisticMap,
+                              @"event":self.eventMap
+                              };
+    NSString* jsonStr = [WXUtility JSONString:InfoMap];
+    NSLog(@"wxApmForInstance: %@",jsonStr);
+    
+    NSNumber* stageRenderOrigin = self.stageMap[KEY_PAGE_STAGES_RENDER_ORGIGIN];
+    NSNumber* stageInteraction = self.stageMap[KEY_PAGE_STAGES_INTERACTION];
+    NSLog(@"wxApmForInstance interaction time: %lld", [stageInteraction longLongValue] - [stageRenderOrigin longLongValue]);
+}
+
+@end
diff --git a/ios/WeexDemo/extend/handler/WXImgLoaderDefaultImpl.h b/ios/WeexDemo/extend/handler/WXImgLoaderDefaultImpl.h
new file mode 100644
index 0000000..cfc354c
--- /dev/null
+++ b/ios/WeexDemo/extend/handler/WXImgLoaderDefaultImpl.h
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import <WeexSDK/WXImgLoaderProtocol.h>
+
+@interface WXImgLoaderDefaultImpl : NSObject<WXImgLoaderProtocol, WXModuleProtocol>
+@end
diff --git a/ios/WeexDemo/extend/handler/WXImgLoaderDefaultImpl.m b/ios/WeexDemo/extend/handler/WXImgLoaderDefaultImpl.m
new file mode 100644
index 0000000..13836b3
--- /dev/null
+++ b/ios/WeexDemo/extend/handler/WXImgLoaderDefaultImpl.m
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "WXImgLoaderDefaultImpl.h"
+#import <SDWebImage/UIImageView+WebCache.h>
+#import <WeexSDK/WXLog.h>
+#import <WeexSDK/WXSDKManager.h>
+
+#define MIN_IMAGE_WIDTH 36
+#define MIN_IMAGE_HEIGHT 36
+
+#if OS_OBJECT_USE_OBJC
+#undef  WXDispatchQueueRelease
+#undef  WXDispatchQueueSetterSementics
+#define WXDispatchQueueRelease(q)
+#define WXDispatchQueueSetterSementics strong
+#else
+#undef  WXDispatchQueueRelease
+#undef  WXDispatchQueueSetterSementics
+#define WXDispatchQueueRelease(q) (dispatch_release(q))
+#define WXDispatchQueueSetterSementics assign
+#endif
+
+@interface WXImgLoaderDefaultImpl()
+
+@property (WXDispatchQueueSetterSementics, nonatomic) dispatch_queue_t ioQueue;
+
+@end
+
+@implementation WXImgLoaderDefaultImpl
+
+#pragma mark -
+#pragma mark WXImgLoaderProtocol
+
+- (id<WXImageOperationProtocol>)downloadImageWithURL:(NSString *)url imageFrame:(CGRect)imageFrame userInfo:(NSDictionary *)userInfo completed:(void(^)(UIImage *image,  NSError *error, BOOL finished))completedBlock
+{
+    [self _recoredImgLoad:url options:userInfo];
+    if ([url hasPrefix:@"//"]) {
+        url = [@"http:" stringByAppendingString:url];
+    }
+    return (id<WXImageOperationProtocol>)[[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:url] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
+        
+    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
+        if (completedBlock) {
+            completedBlock(image, error, finished);
+        }
+        [self _recoredFinish:imageURL error:error loadOptions:userInfo];
+    }];
+}
+
+- (void)setImageViewWithURL:(UIImageView *)imageView url:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(NSDictionary *)options progress:(void (^)(NSInteger, NSInteger))progressBlock completed:(void (^)(UIImage *, NSError *, WXImageLoaderCacheType, NSURL *))completedBlock
+{
+    [self _recoredImgLoad:url.absoluteString options:options];
+    SDWebImageOptions sdWebimageOption = SDWebImageRetryFailed;
+    if (options && options[@"sdWebimageOption"]) {
+        [options[@"sdWebimageOption"] intValue];
+    }
+    
+    [imageView sd_setImageWithURL:url placeholderImage:placeholder options:sdWebimageOption progress:^(NSInteger receivedSize, NSInteger expectedSize) {
+        if (progressBlock) {
+            progressBlock(receivedSize, expectedSize);
+        }
+    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
+        if (completedBlock) {
+            completedBlock(image, error, (WXImageLoaderCacheType)cacheType, imageURL);
+        }
+        [self _recoredFinish:imageURL error:error loadOptions:options];
+    }];
+}
+
+- (void) _recoredImgLoad:(NSString *)url options:(NSDictionary *)options
+{
+    if (nil == url) {
+        return;
+    }
+    NSString* instanceId = [options objectForKey:@"instanceId"];
+    if (nil == instanceId) {
+        WXLogWarning(@"please set instanceId in userInfo,for url %@:",url);
+        return;
+    }
+    WXSDKInstance* instance =[WXSDKManager instanceForID:instanceId];
+    if (nil == instance) {
+        return;
+    }
+    [instance.apmInstance updateDiffStats:KEY_PAGE_STATS_IMG_LOAD_NUM withDiffValue:1];
+}
+
+- (void) _recoredFinish:(NSURL*)imgUrl error:(NSError*)error loadOptions:(NSDictionary*)options
+{
+    NSString* instanceId = [options objectForKey:@"instanceId"];
+    if (nil == instanceId) {
+        WXLogWarning(@"please set instanceId in userInfo,for url %@:",imgUrl.absoluteString);
+        return;
+    }
+    WXSDKInstance* instance =[WXSDKManager instanceForID:instanceId];
+    if (nil == instance) {
+        return;
+    }
+    bool loadSucceed = error == nil;
+    [instance.apmInstance actionImgLoadResult:loadSucceed withErrorCode:nil];
+}
+
+@end
diff --git a/ios/WeexDemo/extend/module/WXEventModule.h b/ios/WeexDemo/extend/module/WXEventModule.h
new file mode 100644
index 0000000..2fec4ec
--- /dev/null
+++ b/ios/WeexDemo/extend/module/WXEventModule.h
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import <WeexSDK/WXEventModuleProtocol.h>
+#import <WeexSDK/WXModuleProtocol.h>
+
+@interface WXEventModule : NSObject <WXEventModuleProtocol, WXModuleProtocol>
+
+@end
diff --git a/ios/WeexDemo/extend/module/WXEventModule.m b/ios/WeexDemo/extend/module/WXEventModule.m
new file mode 100644
index 0000000..1cebd62
--- /dev/null
+++ b/ios/WeexDemo/extend/module/WXEventModule.m
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "WXEventModule.h"
+#import "WXDemoViewController.h"
+#import "WXScannerVC.h"
+#import <WeexSDK/WeexSDK.h>
+
+@implementation WXEventModule
+
+@synthesize weexInstance;
+
+WX_EXPORT_METHOD(@selector(openURL:))
+
+WX_EXPORT_METHOD(@selector(fireNativeGlobalEvent:callback:))
+
+- (void)openURL:(NSString *)url
+{
+    NSString *newURL = url;
+    if ([url hasPrefix:@"//"]) {
+        newURL = [NSString stringWithFormat:@"http:%@", url];
+    } else if ([url hasPrefix:@"weex://go/scan"]){
+        WXScannerVC * sannerVC = [WXScannerVC new];
+        [[weexInstance.viewController navigationController] pushViewController:sannerVC animated:YES];
+        return;
+    } else if (![url hasPrefix:@"http"]) {
+        // relative path
+        newURL = [NSURL URLWithString:url relativeToURL:weexInstance.scriptURL].absoluteString;
+    }
+    
+    UIViewController *controller = [[WXDemoViewController alloc] init];
+    ((WXDemoViewController *)controller).url = [NSURL URLWithString:newURL];
+    
+    [[weexInstance.viewController navigationController] pushViewController:controller animated:YES];
+}
+
+
+/**
+ a test method for macaca case, you can fire globalEvent when download finish、device shaked and so on.
+ @param event event name
+ */
+- (void)fireNativeGlobalEvent:(NSString *)event callback:(WXKeepAliveCallback)callback
+{
+    [weexInstance fireGlobalEvent:event params:@{@"eventParam":@"eventValue"}];
+    if (callback) {
+        NSDictionary * result = @{@"ok": @true};
+        callback(result,false);
+    }
+}
+
+@end
+
diff --git a/ios/WeexDemo/extend/module/WXTitleBarModule.h b/ios/WeexDemo/extend/module/WXTitleBarModule.h
new file mode 100644
index 0000000..057c618
--- /dev/null
+++ b/ios/WeexDemo/extend/module/WXTitleBarModule.h
@@ -0,0 +1,14 @@
+//
+//  WXTitleBarModule.h
+//  WeexDemo
+//
+//  Created by zifan.zx on 2018/1/15.
+//  Copyright © 2018年 taobao. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <WeexSDK/WeexSDK.h>
+
+@interface WXTitleBarModule : NSObject<WXModuleProtocol>
+
+@end
diff --git a/ios/WeexDemo/extend/module/WXTitleBarModule.m b/ios/WeexDemo/extend/module/WXTitleBarModule.m
new file mode 100644
index 0000000..09c0182
--- /dev/null
+++ b/ios/WeexDemo/extend/module/WXTitleBarModule.m
@@ -0,0 +1,48 @@
+//
+//  WXTitleBarModule.m
+//  WeexDemo
+//
+//  Created by zifan.zx on 2018/1/15.
+//  Copyright © 2018年 taobao. All rights reserved.
+//
+
+#import "WXTitleBarModule.h"
+#import "WXDemoViewController.h"
+
+@implementation WXTitleBarModule
+@synthesize weexInstance;
+
+WX_EXPORT_METHOD(@selector(setTitle:))
+WX_EXPORT_METHOD(@selector(showTitleBar:))
+WX_EXPORT_METHOD(@selector(setStyle:))
+
+- (void)setTitle:(NSString*)title
+{
+    if (title) {
+        [weexInstance.viewController.navigationItem setTitle:title];
+    }
+}
+
+- (void)setStyle:(NSDictionary*)styles
+{
+    if (styles[@"backgroundColor"]) {
+        weexInstance.viewController.navigationController.navigationBar.barTintColor = [WXConvert UIColor:styles[@"backgroundColor"]];
+    }
+    if (styles[@"foregroundColor"]) {
+        weexInstance.viewController.navigationController.navigationBar.tintColor = [WXConvert UIColor:styles[@"foregroundColor"]];
+        [weexInstance.viewController.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[WXConvert UIColor:styles[@"foregroundColor"]]}];
+    }
+}
+
+- (void)dealloc
+{
+    weexInstance.viewController.navigationController.navigationBar.tintColor = [UIColor whiteColor];
+}
+
+- (void)showTitleBar:(bool)show
+{
+    [weexInstance.viewController.navigationController setNavigationBarHidden:!show];
+    ((WXDemoViewController*)weexInstance.viewController).showNavigationBar = !show;
+}
+
+@end
diff --git a/ios/WeexDemo/main.m b/ios/WeexDemo/main.m
new file mode 100644
index 0000000..f59fa14
--- /dev/null
+++ b/ios/WeexDemo/main.m
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <UIKit/UIKit.h>
+#import "AppDelegate.h"
+
+int main(int argc, char * argv[]) {
+    @autoreleasepool {
+        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+    }
+}
diff --git a/ios/WeexDemo/weex-icon.png b/ios/WeexDemo/weex-icon.png
new file mode 100644
index 0000000..396b78f
--- /dev/null
+++ b/ios/WeexDemo/weex-icon.png
Binary files differ
diff --git a/ios/WeexDemoTests/Info.plist b/ios/WeexDemoTests/Info.plist
new file mode 100644
index 0000000..57c21c9
--- /dev/null
+++ b/ios/WeexDemoTests/Info.plist
@@ -0,0 +1,28 @@
+<?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>NSLocationWhenInUseUsageDescription</key>
+	<string>$(PRODUCT_NAME) will access your location</string>
+	<key>NSCameraUsageDescription</key>
+	<string>$(PRODUCT_NAME) will access your camera</string>
+	<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>
diff --git a/ios/WeexDemoTests/WeexDemoTests.m b/ios/WeexDemoTests/WeexDemoTests.m
new file mode 100644
index 0000000..c143038
--- /dev/null
+++ b/ios/WeexDemoTests/WeexDemoTests.m
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <XCTest/XCTest.h>
+
+@interface WeexDemoTests : XCTestCase
+
+@end
+
+@implementation WeexDemoTests
+
+- (void)setUp {
+    [super setUp];
+    // Put setup code here. This method is called before the invocation of each test method in the class.
+}
+
+- (void)tearDown {
+    // Put teardown code here. This method is called after the invocation of each test method in the class.
+    [super tearDown];
+}
+
+- (void)testExample {
+    // This is an example of a functional test case.
+    // Use XCTAssert and related functions to verify your tests produce the correct results.
+}
+
+- (void)testPerformanceExample {
+    // This is an example of a performance test case.
+    [self measureBlock:^{
+        // Put the code you want to measure the time of here.
+    }];
+}
+
+@end
diff --git a/ios/WeexUITestDemo-Info.plist b/ios/WeexUITestDemo-Info.plist
new file mode 100644
index 0000000..42d0202
--- /dev/null
+++ b/ios/WeexUITestDemo-Info.plist
@@ -0,0 +1,52 @@
+<?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>99.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>10000</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>UIStatusBarStyle</key>
+	<string>UIStatusBarStyleLightContent</string>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+	</array>
+	<key>UISupportedInterfaceOrientations~ipad</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UIViewControllerBasedStatusBarAppearance</key>
+	<false/>
+</dict>
+</plist>
diff --git a/ios/WeexUITestDemoUITests/Info.plist b/ios/WeexUITestDemoUITests/Info.plist
new file mode 100644
index 0000000..ba72822
--- /dev/null
+++ b/ios/WeexUITestDemoUITests/Info.plist
@@ -0,0 +1,24 @@
+<?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>
diff --git a/ios/WeexUITestDemoUITests/WeexUITestDemoUITests.m b/ios/WeexUITestDemoUITests/WeexUITestDemoUITests.m
new file mode 100644
index 0000000..cbeca46
--- /dev/null
+++ b/ios/WeexUITestDemoUITests/WeexUITestDemoUITests.m
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <XCTest/XCTest.h>
+
+@interface WeexUITestDemoUITests : XCTestCase
+
+@end
+
+@implementation WeexUITestDemoUITests
+
+- (void)setUp {
+    [super setUp];
+    
+    // Put setup code here. This method is called before the invocation of each test method in the class.
+    
+    // In UI tests it is usually best to stop immediately when a failure occurs.
+    self.continueAfterFailure = NO;
+    // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
+    [[[XCUIApplication alloc] init] launch];
+    
+    // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
+}
+
+- (void)tearDown {
+    // Put teardown code here. This method is called after the invocation of each test method in the class.
+    [super tearDown];
+}
+
+- (void)testExample {
+    // Use recording to get started writing UI tests.
+    // Use XCTAssert and related functions to verify your tests produce the correct results.
+}
+
+@end
diff --git a/ios/bundlejs/about.weex.js b/ios/bundlejs/about.weex.js
new file mode 100644
index 0000000..c685047
--- /dev/null
+++ b/ios/bundlejs/about.weex.js
@@ -0,0 +1,3309 @@
+// { "framework": "Vue" }
+"use weex:vue";
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, {
+/******/ 				configurable: false,
+/******/ 				enumerable: true,
+/******/ 				get: getter
+/******/ 			});
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = 38);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+var global = module.exports = typeof window != 'undefined' && window.Math == Math
+  ? window : typeof self != 'undefined' && self.Math == Math ? self
+  // eslint-disable-next-line no-new-func
+  : Function('return this')();
+if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(10);
+var IE8_DOM_DEFINE = __webpack_require__(30);
+var toPrimitive = __webpack_require__(17);
+var dP = Object.defineProperty;
+
+exports.f = __webpack_require__(2) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
+  anObject(O);
+  P = toPrimitive(P, true);
+  anObject(Attributes);
+  if (IE8_DOM_DEFINE) try {
+    return dP(O, P, Attributes);
+  } catch (e) { /* empty */ }
+  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
+  if ('value' in Attributes) O[P] = Attributes.value;
+  return O;
+};
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// Thank's IE8 for his funny defineProperty
+module.exports = !__webpack_require__(11)(function () {
+  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports) {
+
+var hasOwnProperty = {}.hasOwnProperty;
+module.exports = function (it, key) {
+  return hasOwnProperty.call(it, key);
+};
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports) {
+
+var core = module.exports = { version: '2.5.7' };
+if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(1);
+var createDesc = __webpack_require__(12);
+module.exports = __webpack_require__(2) ? function (object, key, value) {
+  return dP.f(object, key, createDesc(1, value));
+} : function (object, key, value) {
+  object[key] = value;
+  return object;
+};
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// to indexed object, toObject with fallback for non-array-like ES3 strings
+var IObject = __webpack_require__(51);
+var defined = __webpack_require__(15);
+module.exports = function (it) {
+  return IObject(defined(it));
+};
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var store = __webpack_require__(21)('wks');
+var uid = __webpack_require__(13);
+var Symbol = __webpack_require__(0).Symbol;
+var USE_SYMBOL = typeof Symbol == 'function';
+
+var $exports = module.exports = function (name) {
+  return store[name] || (store[name] =
+    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
+};
+
+$exports.store = store;
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+  return typeof it === 'object' ? it !== null : typeof it === 'function';
+};
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports) {
+
+module.exports = true;
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+module.exports = function (it) {
+  if (!isObject(it)) throw TypeError(it + ' is not an object!');
+  return it;
+};
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports) {
+
+module.exports = function (exec) {
+  try {
+    return !!exec();
+  } catch (e) {
+    return true;
+  }
+};
+
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports) {
+
+module.exports = function (bitmap, value) {
+  return {
+    enumerable: !(bitmap & 1),
+    configurable: !(bitmap & 2),
+    writable: !(bitmap & 4),
+    value: value
+  };
+};
+
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports) {
+
+var id = 0;
+var px = Math.random();
+module.exports = function (key) {
+  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
+};
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports) {
+
+// 7.1.4 ToInteger
+var ceil = Math.ceil;
+var floor = Math.floor;
+module.exports = function (it) {
+  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+};
+
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports) {
+
+// 7.2.1 RequireObjectCoercible(argument)
+module.exports = function (it) {
+  if (it == undefined) throw TypeError("Can't call method on  " + it);
+  return it;
+};
+
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(4);
+var ctx = __webpack_require__(47);
+var hide = __webpack_require__(5);
+var has = __webpack_require__(3);
+var PROTOTYPE = 'prototype';
+
+var $export = function (type, name, source) {
+  var IS_FORCED = type & $export.F;
+  var IS_GLOBAL = type & $export.G;
+  var IS_STATIC = type & $export.S;
+  var IS_PROTO = type & $export.P;
+  var IS_BIND = type & $export.B;
+  var IS_WRAP = type & $export.W;
+  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
+  var expProto = exports[PROTOTYPE];
+  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];
+  var key, own, out;
+  if (IS_GLOBAL) source = name;
+  for (key in source) {
+    // contains in native
+    own = !IS_FORCED && target && target[key] !== undefined;
+    if (own && has(exports, key)) continue;
+    // export native or passed
+    out = own ? target[key] : source[key];
+    // prevent global pollution for namespaces
+    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
+    // bind timers to global for call from export context
+    : IS_BIND && own ? ctx(out, global)
+    // wrap global constructors for prevent change them in library
+    : IS_WRAP && target[key] == out ? (function (C) {
+      var F = function (a, b, c) {
+        if (this instanceof C) {
+          switch (arguments.length) {
+            case 0: return new C();
+            case 1: return new C(a);
+            case 2: return new C(a, b);
+          } return new C(a, b, c);
+        } return C.apply(this, arguments);
+      };
+      F[PROTOTYPE] = C[PROTOTYPE];
+      return F;
+    // make static versions for prototype methods
+    })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
+    // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
+    if (IS_PROTO) {
+      (exports.virtual || (exports.virtual = {}))[key] = out;
+      // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
+      if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);
+    }
+  }
+};
+// type bitmap
+$export.F = 1;   // forced
+$export.G = 2;   // global
+$export.S = 4;   // static
+$export.P = 8;   // proto
+$export.B = 16;  // bind
+$export.W = 32;  // wrap
+$export.U = 64;  // safe
+$export.R = 128; // real proto method for `library`
+module.exports = $export;
+
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.1 ToPrimitive(input [, PreferredType])
+var isObject = __webpack_require__(8);
+// instead of the ES6 spec version, we didn't implement @@toPrimitive case
+// and the second argument - flag - preferred type is a string
+module.exports = function (it, S) {
+  if (!isObject(it)) return it;
+  var fn, val;
+  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
+  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+  throw TypeError("Can't convert object to primitive value");
+};
+
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports) {
+
+module.exports = {};
+
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.14 / 15.2.3.14 Object.keys(O)
+var $keys = __webpack_require__(34);
+var enumBugKeys = __webpack_require__(22);
+
+module.exports = Object.keys || function keys(O) {
+  return $keys(O, enumBugKeys);
+};
+
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var shared = __webpack_require__(21)('keys');
+var uid = __webpack_require__(13);
+module.exports = function (key) {
+  return shared[key] || (shared[key] = uid(key));
+};
+
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(4);
+var global = __webpack_require__(0);
+var SHARED = '__core-js_shared__';
+var store = global[SHARED] || (global[SHARED] = {});
+
+(module.exports = function (key, value) {
+  return store[key] || (store[key] = value !== undefined ? value : {});
+})('versions', []).push({
+  version: core.version,
+  mode: __webpack_require__(9) ? 'pure' : 'global',
+  copyright: '© 2018 Denis Pushkarev (zloirock.ru)'
+});
+
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports) {
+
+// IE 8- don't enum bug keys
+module.exports = (
+  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
+).split(',');
+
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var def = __webpack_require__(1).f;
+var has = __webpack_require__(3);
+var TAG = __webpack_require__(7)('toStringTag');
+
+module.exports = function (it, tag, stat) {
+  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
+};
+
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {
+
+exports.f = __webpack_require__(7);
+
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(4);
+var LIBRARY = __webpack_require__(9);
+var wksExt = __webpack_require__(24);
+var defineProperty = __webpack_require__(1).f;
+module.exports = function (name) {
+  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
+  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
+};
+
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports) {
+
+exports.f = {}.propertyIsEnumerable;
+
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.fetchNews = exports.fetchDoodle = exports.readAbout = exports.saveAbout = exports.fetchAbout = exports.readGuide = exports.saveGuide = exports.fetchGuide = exports.readExamples = exports.saveExamples = exports.fetchExamples = undefined;
+
+var _stringify = __webpack_require__(41);
+
+var _stringify2 = _interopRequireDefault(_stringify);
+
+var _typeof2 = __webpack_require__(28);
+
+var _typeof3 = _interopRequireDefault(_typeof2);
+
+exports.createLink = createLink;
+exports.createURL = createURL;
+exports.i18n = i18n;
+exports.parseLanguage = parseLanguage;
+exports.setLanguage = setLanguage;
+exports.clearStorageLanguage = clearStorageLanguage;
+exports.getStorageLanguage = getStorageLanguage;
+exports.getSystemLanguage = getSystemLanguage;
+exports.getLanguage = getLanguage;
+exports.jumpTo = jumpTo;
+exports.viewSource = viewSource;
+exports.setTitleBar = setTitleBar;
+exports.fetchData = fetchData;
+exports.saveData = saveData;
+exports.readData = readData;
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var stream = weex.requireModule('stream');
+var storage = weex.requireModule('storage');
+var navigator = weex.requireModule('navigator');
+
+var encoder = typeof encodeURIComponent === 'function' ? encodeURIComponent : typeof encodeURI === 'function' ? encodeURI : function (x) {
+  return x;
+};
+
+function encodeParams(params) {
+  if (!params || (typeof params === 'undefined' ? 'undefined' : (0, _typeof3.default)(params)) !== 'object') {
+    return '';
+  }
+  var array = [];
+  for (var key in params) {
+    if (typeof params[key] === 'string') {
+      array.push(encoder(key) + '=' + encoder(params[key]));
+    }
+  }
+  return array.join('&');
+}
+
+function createLink(name) {
+  var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+  var args = [];
+  for (var key in params) {
+    if (typeof params[key] === 'string') {
+      args.push(encoder(key) + '=' + encoder(params[key]));
+    }
+  }
+  if (WXEnvironment.platform === 'Web') {
+    args.unshift('page=' + name + '.web.js');
+    return '/?' + args.join('&');
+  }
+  var base = getBaseURL();
+  return '' + base + name + '.weex.js' + (args.length ? '?' + args.join('&') : '');
+}
+
+function createURL(hash, params) {
+  if (WXEnvironment.platform === 'Web') {
+    return 'http://dotwe.org/raw/htmlVue/' + hash;
+  }
+  var url = 'http://dotwe.org/raw/dist/' + hash + '.bundle.wx';
+  var paramString = encodeParams(params);
+  if (WXEnvironment.appName === 'TB') {
+    return url + '?_wx_tpl=' + url + '&' + paramString;
+  }
+  if (WXEnvironment.appName === 'WXSample') {
+    return url + '?' + paramString;
+  }
+  return url + '?wx_weex=true&' + paramString;
+}
+
+function getBaseURL() {
+  var bundleUrl = weex.config.bundleUrl;
+  var isAndroidAssets = bundleUrl.indexOf('your_current_IP') >= 0 || bundleUrl.indexOf('file://assets/') >= 0;
+  var isiOSAssets = bundleUrl.indexOf('file:///') >= 0 && bundleUrl.indexOf('WeexDemo.app') > 0;
+  if (isAndroidAssets) {
+    return 'file://assets/';
+  } else if (isiOSAssets) {
+    // file:///var/mobile/Containers/Bundle/Application/{id}/WeexDemo.app/
+    // file:///Users/{user}/Library/Developer/CoreSimulator/Devices/{id}/data/Containers/Bundle/Application/{id}/WeexDemo.app/
+    return bundleUrl.substring(0, bundleUrl.lastIndexOf('/') + 1);
+  }
+  return '';
+}
+
+function i18n(text, language) {
+  if (typeof text === 'string') {
+    return text;
+  }
+  if (Object.prototype.toString.call(text) === '[object Object]') {
+    var lang = this && this.language || language || 'en';
+    return text[lang];
+  }
+}
+
+var supportedLanguageRE = /(en|zh)\_?\w*/i;
+function parseLanguage(language) {
+  var match = supportedLanguageRE.exec(language + '');
+  if (match && match[1]) {
+    return match[1];
+  }
+  return '';
+}
+
+function setLanguage(language) {
+  var lang = parseLanguage(language);
+  if (lang) {
+    storage.setItem('WEEX_PLAYGROUND_LANGUAGE', lang);
+  }
+}
+
+function clearStorageLanguage() {
+  storage.removeItem('WEEX_PLAYGROUND_LANGUAGE');
+}
+
+function getStorageLanguage(done) {
+  var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+  if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+    return;
+  }
+  try {
+    storage.getItem('WEEX_PLAYGROUND_LANGUAGE', function (event) {
+      if (event.result === 'success') {
+        var lang = parseLanguage(event.data);
+        lang ? done(lang) : fail();
+      } else {
+        fail(event);
+      }
+    });
+  } catch (err) {
+    fail(err);
+  }
+}
+
+function getSystemLanguage(done) {
+  var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+  if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+    return;
+  }
+  if (WXEnvironment.platform.toLowerCase() === 'web') {
+    var lang = parseLanguage(window.navigator.language);
+    lang ? done(lang) : fail();
+  } else {
+    try {
+      var locale = weex.requireModule('locale') || weex.requireModule('local');
+      var useSync = false;
+      var resSync = locale.getLanguage(function (language) {
+        var lang = parseLanguage(language);
+        if (lang) {
+          useSync || done(lang);
+        } else {
+          fail();
+        }
+      });
+      var langSync = parseLanguage(resSync);
+      if (langSync) {
+        useSync = true;
+        done(langSync);
+      } else {
+        fail();
+      }
+    } catch (e) {
+      fail(e);
+    }
+  }
+}
+
+var languageRE = /.+[\?\&]{1}language=([\d\w]+)[\?\&]?.*/i;
+function getLanguage() {
+  var done = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
+
+  var match = languageRE.exec(weex.config.bundleUrl || '');
+  var lang = parseLanguage(match && match[1]);
+  if (lang) {
+    done(lang);
+  } else {
+    getStorageLanguage(done, function () {
+      getSystemLanguage(done, function () {
+        done('en');
+      });
+    });
+  }
+}
+
+function jumpTo(url, title, lang) {
+  getLanguage(function (language) {
+    storage.setItem('CURRENT_DOCUMENT_URL', i18n(url, lang || language));
+    navigator.push({
+      url: createURL('bf0305c14b511b24a4e616f53926432b', { language: language, title: i18n(title, lang || language) })
+    });
+  });
+}
+
+function viewSource(hash) {
+  getLanguage(function (language) {
+    navigator.push({
+      url: createURL('f6ce29faf686eabc38b410bf4828fa5a', { hash: hash, language: language })
+    });
+  });
+}
+
+function setTitleBar(options) {
+  var language = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en';
+
+  if (Object.prototype.toString.apply(options) !== '[object Object]') {
+    return;
+  }
+  var titleBar = weex.requireModule('titleBar');
+  if (options.color || options.backgroundColor) {
+    try {
+      titleBar.setStyle({
+        foregroundColor: options.color || '#FFFFFF',
+        backgroundColor: options.backgroundColor || '#00B4FF'
+      });
+    } catch (e) {}
+  }
+  var title = i18n(options.title, language);
+  if (title) {
+    try {
+      titleBar.setTitle(title);
+    } catch (e) {}
+  }
+}
+
+var storageKeys = {
+  doodle: 'WEEX_PLAYGROUND_APP_DOODLE',
+  guide: 'WEEX_PLAYGROUND_APP_GUIDE',
+  examples: 'WEEX_PLAYGROUND_APP_EXAMPLES',
+  news: 'WEEX_PLAYGROUND_APP_NEWS',
+  about: 'WEEX_PLAYGROUND_APP_ABOUT'
+};
+function fetchData(name) {
+  var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+  var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+  try {
+    stream.fetch({
+      url: 'http://dotwe.org/query/weex-playground-app',
+      method: 'post',
+      headers: {
+        'Content-Type': 'application/x-www-form-urlencoded'
+      },
+      type: 'json',
+      body: 'name=' + name
+    }, function (res) {
+      if (res.ok && res.data && res.data.success) {
+        done(res.data);
+      } else {
+        fail(res);
+      }
+    });
+  } catch (err) {
+    fail(err);
+  }
+}
+function saveData(name, result) {
+  var key = storageKeys[name];
+  if (!key) return;
+  if (result && (typeof result === 'undefined' ? 'undefined' : (0, _typeof3.default)(result)) === 'object') {
+    result.timestamp = Date.now();
+    storage.setItem(key, (0, _stringify2.default)(result));
+  }
+}
+function readData(name) {
+  var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+  var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+  var key = storageKeys[name];
+  if (!key) return fail();
+  try {
+    storage.getItem(key, function (event) {
+      if (event.result === 'success') {
+        var result = JSON.parse(event.data);
+        if (result && Array.isArray(result[name])) {
+          return done(result[name]);
+        }
+      }
+      fail(event);
+    });
+  } catch (e) {
+    fail(e);
+  }
+}
+
+var fetchExamples = exports.fetchExamples = function fetchExamples() {
+  for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+    args[_key] = arguments[_key];
+  }
+
+  return fetchData.apply(undefined, ['examples'].concat(args));
+};
+var saveExamples = exports.saveExamples = function saveExamples() {
+  for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+    args[_key2] = arguments[_key2];
+  }
+
+  return saveData.apply(undefined, ['examples'].concat(args));
+};
+var readExamples = exports.readExamples = function readExamples() {
+  for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+    args[_key3] = arguments[_key3];
+  }
+
+  return readData.apply(undefined, ['examples'].concat(args));
+};
+
+var fetchGuide = exports.fetchGuide = function fetchGuide() {
+  for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+    args[_key4] = arguments[_key4];
+  }
+
+  return fetchData.apply(undefined, ['guide'].concat(args));
+};
+var saveGuide = exports.saveGuide = function saveGuide() {
+  for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
+    args[_key5] = arguments[_key5];
+  }
+
+  return saveData.apply(undefined, ['guide'].concat(args));
+};
+var readGuide = exports.readGuide = function readGuide() {
+  for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
+    args[_key6] = arguments[_key6];
+  }
+
+  return readData.apply(undefined, ['guide'].concat(args));
+};
+
+var fetchAbout = exports.fetchAbout = function fetchAbout() {
+  for (var _len7 = arguments.length, args = Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
+    args[_key7] = arguments[_key7];
+  }
+
+  return fetchData.apply(undefined, ['about'].concat(args));
+};
+var saveAbout = exports.saveAbout = function saveAbout() {
+  for (var _len8 = arguments.length, args = Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
+    args[_key8] = arguments[_key8];
+  }
+
+  return saveData.apply(undefined, ['about'].concat(args));
+};
+var readAbout = exports.readAbout = function readAbout() {
+  for (var _len9 = arguments.length, args = Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
+    args[_key9] = arguments[_key9];
+  }
+
+  return readData.apply(undefined, ['about'].concat(args));
+};
+
+var fetchDoodle = exports.fetchDoodle = function fetchDoodle() {
+  for (var _len10 = arguments.length, args = Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
+    args[_key10] = arguments[_key10];
+  }
+
+  return fetchData.apply(undefined, ['doodle'].concat(args));
+};
+var fetchNews = exports.fetchNews = function fetchNews() {
+  for (var _len11 = arguments.length, args = Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
+    args[_key11] = arguments[_key11];
+  }
+
+  return fetchData.apply(undefined, ['news'].concat(args));
+};
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = true;
+
+var _iterator = __webpack_require__(43);
+
+var _iterator2 = _interopRequireDefault(_iterator);
+
+var _symbol = __webpack_require__(62);
+
+var _symbol2 = _interopRequireDefault(_symbol);
+
+var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
+  return typeof obj === "undefined" ? "undefined" : _typeof(obj);
+} : function (obj) {
+  return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
+};
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var LIBRARY = __webpack_require__(9);
+var $export = __webpack_require__(16);
+var redefine = __webpack_require__(32);
+var hide = __webpack_require__(5);
+var Iterators = __webpack_require__(18);
+var $iterCreate = __webpack_require__(49);
+var setToStringTag = __webpack_require__(23);
+var getPrototypeOf = __webpack_require__(56);
+var ITERATOR = __webpack_require__(7)('iterator');
+var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
+var FF_ITERATOR = '@@iterator';
+var KEYS = 'keys';
+var VALUES = 'values';
+
+var returnThis = function () { return this; };
+
+module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
+  $iterCreate(Constructor, NAME, next);
+  var getMethod = function (kind) {
+    if (!BUGGY && kind in proto) return proto[kind];
+    switch (kind) {
+      case KEYS: return function keys() { return new Constructor(this, kind); };
+      case VALUES: return function values() { return new Constructor(this, kind); };
+    } return function entries() { return new Constructor(this, kind); };
+  };
+  var TAG = NAME + ' Iterator';
+  var DEF_VALUES = DEFAULT == VALUES;
+  var VALUES_BUG = false;
+  var proto = Base.prototype;
+  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
+  var $default = $native || getMethod(DEFAULT);
+  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
+  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
+  var methods, key, IteratorPrototype;
+  // Fix native
+  if ($anyNative) {
+    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
+    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
+      // Set @@toStringTag to native iterators
+      setToStringTag(IteratorPrototype, TAG, true);
+      // fix for some old engines
+      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
+    }
+  }
+  // fix Array#{values, @@iterator}.name in V8 / FF
+  if (DEF_VALUES && $native && $native.name !== VALUES) {
+    VALUES_BUG = true;
+    $default = function values() { return $native.call(this); };
+  }
+  // Define iterator
+  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
+    hide(proto, ITERATOR, $default);
+  }
+  // Plug for library
+  Iterators[NAME] = $default;
+  Iterators[TAG] = returnThis;
+  if (DEFAULT) {
+    methods = {
+      values: DEF_VALUES ? $default : getMethod(VALUES),
+      keys: IS_SET ? $default : getMethod(KEYS),
+      entries: $entries
+    };
+    if (FORCED) for (key in methods) {
+      if (!(key in proto)) redefine(proto, key, methods[key]);
+    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
+  }
+  return methods;
+};
+
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = !__webpack_require__(2) && !__webpack_require__(11)(function () {
+  return Object.defineProperty(__webpack_require__(31)('div'), 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+var document = __webpack_require__(0).document;
+// typeof document.createElement is 'object' in old IE
+var is = isObject(document) && isObject(document.createElement);
+module.exports = function (it) {
+  return is ? document.createElement(it) : {};
+};
+
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(5);
+
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
+var anObject = __webpack_require__(10);
+var dPs = __webpack_require__(50);
+var enumBugKeys = __webpack_require__(22);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+var Empty = function () { /* empty */ };
+var PROTOTYPE = 'prototype';
+
+// Create object with fake `null` prototype: use iframe Object with cleared prototype
+var createDict = function () {
+  // Thrash, waste and sodomy: IE GC bug
+  var iframe = __webpack_require__(31)('iframe');
+  var i = enumBugKeys.length;
+  var lt = '<';
+  var gt = '>';
+  var iframeDocument;
+  iframe.style.display = 'none';
+  __webpack_require__(55).appendChild(iframe);
+  iframe.src = 'javascript:'; // eslint-disable-line no-script-url
+  // createDict = iframe.contentWindow.Object;
+  // html.removeChild(iframe);
+  iframeDocument = iframe.contentWindow.document;
+  iframeDocument.open();
+  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
+  iframeDocument.close();
+  createDict = iframeDocument.F;
+  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];
+  return createDict();
+};
+
+module.exports = Object.create || function create(O, Properties) {
+  var result;
+  if (O !== null) {
+    Empty[PROTOTYPE] = anObject(O);
+    result = new Empty();
+    Empty[PROTOTYPE] = null;
+    // add "__proto__" for Object.getPrototypeOf polyfill
+    result[IE_PROTO] = O;
+  } else result = createDict();
+  return Properties === undefined ? result : dPs(result, Properties);
+};
+
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var has = __webpack_require__(3);
+var toIObject = __webpack_require__(6);
+var arrayIndexOf = __webpack_require__(52)(false);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+
+module.exports = function (object, names) {
+  var O = toIObject(object);
+  var i = 0;
+  var result = [];
+  var key;
+  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);
+  // Don't enum bug & hidden keys
+  while (names.length > i) if (has(O, key = names[i++])) {
+    ~arrayIndexOf(result, key) || result.push(key);
+  }
+  return result;
+};
+
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports) {
+
+var toString = {}.toString;
+
+module.exports = function (it) {
+  return toString.call(it).slice(8, -1);
+};
+
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports) {
+
+exports.f = Object.getOwnPropertySymbols;
+
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
+var $keys = __webpack_require__(34);
+var hiddenKeys = __webpack_require__(22).concat('length', 'prototype');
+
+exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+  return $keys(O, hiddenKeys);
+};
+
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+__webpack_require__(39);
+
+var _About = __webpack_require__(73);
+
+var _About2 = _interopRequireDefault(_About);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// show title bar
+try {
+  var titleBar = weex.requireModule('titleBar');
+  titleBar.showTitleBar(true);
+} catch (e) {}
+
+_About2.default.el = '#root';
+new Vue(_About2.default);
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _mixin = __webpack_require__(40);
+
+var _mixin2 = _interopRequireDefault(_mixin);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// use shared mixins
+Vue.mixin(_mixin2.default);
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _index = __webpack_require__(27);
+
+var utils = _interopRequireWildcard(_index);
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+var storage = weex.requireModule('storage');
+
+exports.default = {
+  filters: {
+    i18n: utils.i18n,
+    url: utils.createURL,
+    link: utils.createLink
+  },
+  methods: {
+    createLink: utils.createLink,
+    createURL: utils.createURL,
+    i18n: utils.i18n,
+    getLanguage: utils.getLanguage,
+    fetchData: utils.fetchData,
+    saveData: utils.saveData,
+    readData: utils.readData,
+    jumpTo: utils.jumpTo
+  },
+  created: function created() {
+    var _this = this;
+
+    // get and set language
+    utils.getLanguage(function (language) {
+      _this.language = language;
+      utils.setTitleBar(_this.navigationBarOptions, language);
+    });
+
+    // listen to the language change event
+    var channel = new BroadcastChannel('language');
+    channel.onmessage = function (event) {
+      if (event.data && event.data.language) {
+        _this.language = event.data.language;
+      }
+    };
+  },
+  beforeDestroy: function beforeDestroy() {
+    storage.removeItem('CURRENT_DOCUMENT_URL');
+    storage.removeItem('CURRENT_SOURCE_HASH');
+  }
+};
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(42), __esModule: true };
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(4);
+var $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify });
+module.exports = function stringify(it) { // eslint-disable-line no-unused-vars
+  return $JSON.stringify.apply($JSON, arguments);
+};
+
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(44), __esModule: true };
+
+/***/ }),
+/* 44 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(45);
+__webpack_require__(58);
+module.exports = __webpack_require__(24).f('iterator');
+
+
+/***/ }),
+/* 45 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $at = __webpack_require__(46)(true);
+
+// 21.1.3.27 String.prototype[@@iterator]()
+__webpack_require__(29)(String, 'String', function (iterated) {
+  this._t = String(iterated); // target
+  this._i = 0;                // next index
+// 21.1.5.2.1 %StringIteratorPrototype%.next()
+}, function () {
+  var O = this._t;
+  var index = this._i;
+  var point;
+  if (index >= O.length) return { value: undefined, done: true };
+  point = $at(O, index);
+  this._i += point.length;
+  return { value: point, done: false };
+});
+
+
+/***/ }),
+/* 46 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(14);
+var defined = __webpack_require__(15);
+// true  -> String#at
+// false -> String#codePointAt
+module.exports = function (TO_STRING) {
+  return function (that, pos) {
+    var s = String(defined(that));
+    var i = toInteger(pos);
+    var l = s.length;
+    var a, b;
+    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
+    a = s.charCodeAt(i);
+    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
+      ? TO_STRING ? s.charAt(i) : a
+      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
+  };
+};
+
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// optional / simple context binding
+var aFunction = __webpack_require__(48);
+module.exports = function (fn, that, length) {
+  aFunction(fn);
+  if (that === undefined) return fn;
+  switch (length) {
+    case 1: return function (a) {
+      return fn.call(that, a);
+    };
+    case 2: return function (a, b) {
+      return fn.call(that, a, b);
+    };
+    case 3: return function (a, b, c) {
+      return fn.call(that, a, b, c);
+    };
+  }
+  return function (/* ...args */) {
+    return fn.apply(that, arguments);
+  };
+};
+
+
+/***/ }),
+/* 48 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+  if (typeof it != 'function') throw TypeError(it + ' is not a function!');
+  return it;
+};
+
+
+/***/ }),
+/* 49 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var create = __webpack_require__(33);
+var descriptor = __webpack_require__(12);
+var setToStringTag = __webpack_require__(23);
+var IteratorPrototype = {};
+
+// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
+__webpack_require__(5)(IteratorPrototype, __webpack_require__(7)('iterator'), function () { return this; });
+
+module.exports = function (Constructor, NAME, next) {
+  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
+  setToStringTag(Constructor, NAME + ' Iterator');
+};
+
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(1);
+var anObject = __webpack_require__(10);
+var getKeys = __webpack_require__(19);
+
+module.exports = __webpack_require__(2) ? Object.defineProperties : function defineProperties(O, Properties) {
+  anObject(O);
+  var keys = getKeys(Properties);
+  var length = keys.length;
+  var i = 0;
+  var P;
+  while (length > i) dP.f(O, P = keys[i++], Properties[P]);
+  return O;
+};
+
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for non-array-like ES3 and non-enumerable old V8 strings
+var cof = __webpack_require__(35);
+// eslint-disable-next-line no-prototype-builtins
+module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
+  return cof(it) == 'String' ? it.split('') : Object(it);
+};
+
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// false -> Array#indexOf
+// true  -> Array#includes
+var toIObject = __webpack_require__(6);
+var toLength = __webpack_require__(53);
+var toAbsoluteIndex = __webpack_require__(54);
+module.exports = function (IS_INCLUDES) {
+  return function ($this, el, fromIndex) {
+    var O = toIObject($this);
+    var length = toLength(O.length);
+    var index = toAbsoluteIndex(fromIndex, length);
+    var value;
+    // Array#includes uses SameValueZero equality algorithm
+    // eslint-disable-next-line no-self-compare
+    if (IS_INCLUDES && el != el) while (length > index) {
+      value = O[index++];
+      // eslint-disable-next-line no-self-compare
+      if (value != value) return true;
+    // Array#indexOf ignores holes, Array#includes - not
+    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
+      if (O[index] === el) return IS_INCLUDES || index || 0;
+    } return !IS_INCLUDES && -1;
+  };
+};
+
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.15 ToLength
+var toInteger = __webpack_require__(14);
+var min = Math.min;
+module.exports = function (it) {
+  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
+};
+
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(14);
+var max = Math.max;
+var min = Math.min;
+module.exports = function (index, length) {
+  index = toInteger(index);
+  return index < 0 ? max(index + length, 0) : min(index, length);
+};
+
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var document = __webpack_require__(0).document;
+module.exports = document && document.documentElement;
+
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
+var has = __webpack_require__(3);
+var toObject = __webpack_require__(57);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+var ObjectProto = Object.prototype;
+
+module.exports = Object.getPrototypeOf || function (O) {
+  O = toObject(O);
+  if (has(O, IE_PROTO)) return O[IE_PROTO];
+  if (typeof O.constructor == 'function' && O instanceof O.constructor) {
+    return O.constructor.prototype;
+  } return O instanceof Object ? ObjectProto : null;
+};
+
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.13 ToObject(argument)
+var defined = __webpack_require__(15);
+module.exports = function (it) {
+  return Object(defined(it));
+};
+
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(59);
+var global = __webpack_require__(0);
+var hide = __webpack_require__(5);
+var Iterators = __webpack_require__(18);
+var TO_STRING_TAG = __webpack_require__(7)('toStringTag');
+
+var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +
+  'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +
+  'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +
+  'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +
+  'TextTrackList,TouchList').split(',');
+
+for (var i = 0; i < DOMIterables.length; i++) {
+  var NAME = DOMIterables[i];
+  var Collection = global[NAME];
+  var proto = Collection && Collection.prototype;
+  if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
+  Iterators[NAME] = Iterators.Array;
+}
+
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var addToUnscopables = __webpack_require__(60);
+var step = __webpack_require__(61);
+var Iterators = __webpack_require__(18);
+var toIObject = __webpack_require__(6);
+
+// 22.1.3.4 Array.prototype.entries()
+// 22.1.3.13 Array.prototype.keys()
+// 22.1.3.29 Array.prototype.values()
+// 22.1.3.30 Array.prototype[@@iterator]()
+module.exports = __webpack_require__(29)(Array, 'Array', function (iterated, kind) {
+  this._t = toIObject(iterated); // target
+  this._i = 0;                   // next index
+  this._k = kind;                // kind
+// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
+}, function () {
+  var O = this._t;
+  var kind = this._k;
+  var index = this._i++;
+  if (!O || index >= O.length) {
+    this._t = undefined;
+    return step(1);
+  }
+  if (kind == 'keys') return step(0, index);
+  if (kind == 'values') return step(0, O[index]);
+  return step(0, [index, O[index]]);
+}, 'values');
+
+// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
+Iterators.Arguments = Iterators.Array;
+
+addToUnscopables('keys');
+addToUnscopables('values');
+addToUnscopables('entries');
+
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports) {
+
+module.exports = function () { /* empty */ };
+
+
+/***/ }),
+/* 61 */
+/***/ (function(module, exports) {
+
+module.exports = function (done, value) {
+  return { value: value, done: !!done };
+};
+
+
+/***/ }),
+/* 62 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(63), __esModule: true };
+
+/***/ }),
+/* 63 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(64);
+__webpack_require__(70);
+__webpack_require__(71);
+__webpack_require__(72);
+module.exports = __webpack_require__(4).Symbol;
+
+
+/***/ }),
+/* 64 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// ECMAScript 6 symbols shim
+var global = __webpack_require__(0);
+var has = __webpack_require__(3);
+var DESCRIPTORS = __webpack_require__(2);
+var $export = __webpack_require__(16);
+var redefine = __webpack_require__(32);
+var META = __webpack_require__(65).KEY;
+var $fails = __webpack_require__(11);
+var shared = __webpack_require__(21);
+var setToStringTag = __webpack_require__(23);
+var uid = __webpack_require__(13);
+var wks = __webpack_require__(7);
+var wksExt = __webpack_require__(24);
+var wksDefine = __webpack_require__(25);
+var enumKeys = __webpack_require__(66);
+var isArray = __webpack_require__(67);
+var anObject = __webpack_require__(10);
+var isObject = __webpack_require__(8);
+var toIObject = __webpack_require__(6);
+var toPrimitive = __webpack_require__(17);
+var createDesc = __webpack_require__(12);
+var _create = __webpack_require__(33);
+var gOPNExt = __webpack_require__(68);
+var $GOPD = __webpack_require__(69);
+var $DP = __webpack_require__(1);
+var $keys = __webpack_require__(19);
+var gOPD = $GOPD.f;
+var dP = $DP.f;
+var gOPN = gOPNExt.f;
+var $Symbol = global.Symbol;
+var $JSON = global.JSON;
+var _stringify = $JSON && $JSON.stringify;
+var PROTOTYPE = 'prototype';
+var HIDDEN = wks('_hidden');
+var TO_PRIMITIVE = wks('toPrimitive');
+var isEnum = {}.propertyIsEnumerable;
+var SymbolRegistry = shared('symbol-registry');
+var AllSymbols = shared('symbols');
+var OPSymbols = shared('op-symbols');
+var ObjectProto = Object[PROTOTYPE];
+var USE_NATIVE = typeof $Symbol == 'function';
+var QObject = global.QObject;
+// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
+var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
+
+// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
+var setSymbolDesc = DESCRIPTORS && $fails(function () {
+  return _create(dP({}, 'a', {
+    get: function () { return dP(this, 'a', { value: 7 }).a; }
+  })).a != 7;
+}) ? function (it, key, D) {
+  var protoDesc = gOPD(ObjectProto, key);
+  if (protoDesc) delete ObjectProto[key];
+  dP(it, key, D);
+  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
+} : dP;
+
+var wrap = function (tag) {
+  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
+  sym._k = tag;
+  return sym;
+};
+
+var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {
+  return typeof it == 'symbol';
+} : function (it) {
+  return it instanceof $Symbol;
+};
+
+var $defineProperty = function defineProperty(it, key, D) {
+  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
+  anObject(it);
+  key = toPrimitive(key, true);
+  anObject(D);
+  if (has(AllSymbols, key)) {
+    if (!D.enumerable) {
+      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
+      it[HIDDEN][key] = true;
+    } else {
+      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
+      D = _create(D, { enumerable: createDesc(0, false) });
+    } return setSymbolDesc(it, key, D);
+  } return dP(it, key, D);
+};
+var $defineProperties = function defineProperties(it, P) {
+  anObject(it);
+  var keys = enumKeys(P = toIObject(P));
+  var i = 0;
+  var l = keys.length;
+  var key;
+  while (l > i) $defineProperty(it, key = keys[i++], P[key]);
+  return it;
+};
+var $create = function create(it, P) {
+  return P === undefined ? _create(it) : $defineProperties(_create(it), P);
+};
+var $propertyIsEnumerable = function propertyIsEnumerable(key) {
+  var E = isEnum.call(this, key = toPrimitive(key, true));
+  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
+  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
+};
+var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
+  it = toIObject(it);
+  key = toPrimitive(key, true);
+  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
+  var D = gOPD(it, key);
+  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
+  return D;
+};
+var $getOwnPropertyNames = function getOwnPropertyNames(it) {
+  var names = gOPN(toIObject(it));
+  var result = [];
+  var i = 0;
+  var key;
+  while (names.length > i) {
+    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
+  } return result;
+};
+var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
+  var IS_OP = it === ObjectProto;
+  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
+  var result = [];
+  var i = 0;
+  var key;
+  while (names.length > i) {
+    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
+  } return result;
+};
+
+// 19.4.1.1 Symbol([description])
+if (!USE_NATIVE) {
+  $Symbol = function Symbol() {
+    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
+    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
+    var $set = function (value) {
+      if (this === ObjectProto) $set.call(OPSymbols, value);
+      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+      setSymbolDesc(this, tag, createDesc(1, value));
+    };
+    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
+    return wrap(tag);
+  };
+  redefine($Symbol[PROTOTYPE], 'toString', function toString() {
+    return this._k;
+  });
+
+  $GOPD.f = $getOwnPropertyDescriptor;
+  $DP.f = $defineProperty;
+  __webpack_require__(37).f = gOPNExt.f = $getOwnPropertyNames;
+  __webpack_require__(26).f = $propertyIsEnumerable;
+  __webpack_require__(36).f = $getOwnPropertySymbols;
+
+  if (DESCRIPTORS && !__webpack_require__(9)) {
+    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
+  }
+
+  wksExt.f = function (name) {
+    return wrap(wks(name));
+  };
+}
+
+$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });
+
+for (var es6Symbols = (
+  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
+  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
+).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);
+
+for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);
+
+$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
+  // 19.4.2.1 Symbol.for(key)
+  'for': function (key) {
+    return has(SymbolRegistry, key += '')
+      ? SymbolRegistry[key]
+      : SymbolRegistry[key] = $Symbol(key);
+  },
+  // 19.4.2.5 Symbol.keyFor(sym)
+  keyFor: function keyFor(sym) {
+    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
+    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
+  },
+  useSetter: function () { setter = true; },
+  useSimple: function () { setter = false; }
+});
+
+$export($export.S + $export.F * !USE_NATIVE, 'Object', {
+  // 19.1.2.2 Object.create(O [, Properties])
+  create: $create,
+  // 19.1.2.4 Object.defineProperty(O, P, Attributes)
+  defineProperty: $defineProperty,
+  // 19.1.2.3 Object.defineProperties(O, Properties)
+  defineProperties: $defineProperties,
+  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
+  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
+  // 19.1.2.7 Object.getOwnPropertyNames(O)
+  getOwnPropertyNames: $getOwnPropertyNames,
+  // 19.1.2.8 Object.getOwnPropertySymbols(O)
+  getOwnPropertySymbols: $getOwnPropertySymbols
+});
+
+// 24.3.2 JSON.stringify(value [, replacer [, space]])
+$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
+  var S = $Symbol();
+  // MS Edge converts symbol values to JSON as {}
+  // WebKit converts symbol values to JSON as null
+  // V8 throws on boxed symbols
+  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
+})), 'JSON', {
+  stringify: function stringify(it) {
+    var args = [it];
+    var i = 1;
+    var replacer, $replacer;
+    while (arguments.length > i) args.push(arguments[i++]);
+    $replacer = replacer = args[1];
+    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
+    if (!isArray(replacer)) replacer = function (key, value) {
+      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
+      if (!isSymbol(value)) return value;
+    };
+    args[1] = replacer;
+    return _stringify.apply($JSON, args);
+  }
+});
+
+// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
+$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(5)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
+// 19.4.3.5 Symbol.prototype[@@toStringTag]
+setToStringTag($Symbol, 'Symbol');
+// 20.2.1.9 Math[@@toStringTag]
+setToStringTag(Math, 'Math', true);
+// 24.3.3 JSON[@@toStringTag]
+setToStringTag(global.JSON, 'JSON', true);
+
+
+/***/ }),
+/* 65 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var META = __webpack_require__(13)('meta');
+var isObject = __webpack_require__(8);
+var has = __webpack_require__(3);
+var setDesc = __webpack_require__(1).f;
+var id = 0;
+var isExtensible = Object.isExtensible || function () {
+  return true;
+};
+var FREEZE = !__webpack_require__(11)(function () {
+  return isExtensible(Object.preventExtensions({}));
+});
+var setMeta = function (it) {
+  setDesc(it, META, { value: {
+    i: 'O' + ++id, // object ID
+    w: {}          // weak collections IDs
+  } });
+};
+var fastKey = function (it, create) {
+  // return primitive with prefix
+  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+  if (!has(it, META)) {
+    // can't set metadata to uncaught frozen object
+    if (!isExtensible(it)) return 'F';
+    // not necessary to add metadata
+    if (!create) return 'E';
+    // add missing metadata
+    setMeta(it);
+  // return object ID
+  } return it[META].i;
+};
+var getWeak = function (it, create) {
+  if (!has(it, META)) {
+    // can't set metadata to uncaught frozen object
+    if (!isExtensible(it)) return true;
+    // not necessary to add metadata
+    if (!create) return false;
+    // add missing metadata
+    setMeta(it);
+  // return hash weak collections IDs
+  } return it[META].w;
+};
+// add metadata on freeze-family methods calling
+var onFreeze = function (it) {
+  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
+  return it;
+};
+var meta = module.exports = {
+  KEY: META,
+  NEED: false,
+  fastKey: fastKey,
+  getWeak: getWeak,
+  onFreeze: onFreeze
+};
+
+
+/***/ }),
+/* 66 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// all enumerable object keys, includes symbols
+var getKeys = __webpack_require__(19);
+var gOPS = __webpack_require__(36);
+var pIE = __webpack_require__(26);
+module.exports = function (it) {
+  var result = getKeys(it);
+  var getSymbols = gOPS.f;
+  if (getSymbols) {
+    var symbols = getSymbols(it);
+    var isEnum = pIE.f;
+    var i = 0;
+    var key;
+    while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
+  } return result;
+};
+
+
+/***/ }),
+/* 67 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.2.2 IsArray(argument)
+var cof = __webpack_require__(35);
+module.exports = Array.isArray || function isArray(arg) {
+  return cof(arg) == 'Array';
+};
+
+
+/***/ }),
+/* 68 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
+var toIObject = __webpack_require__(6);
+var gOPN = __webpack_require__(37).f;
+var toString = {}.toString;
+
+var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
+  ? Object.getOwnPropertyNames(window) : [];
+
+var getWindowNames = function (it) {
+  try {
+    return gOPN(it);
+  } catch (e) {
+    return windowNames.slice();
+  }
+};
+
+module.exports.f = function getOwnPropertyNames(it) {
+  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
+};
+
+
+/***/ }),
+/* 69 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var pIE = __webpack_require__(26);
+var createDesc = __webpack_require__(12);
+var toIObject = __webpack_require__(6);
+var toPrimitive = __webpack_require__(17);
+var has = __webpack_require__(3);
+var IE8_DOM_DEFINE = __webpack_require__(30);
+var gOPD = Object.getOwnPropertyDescriptor;
+
+exports.f = __webpack_require__(2) ? gOPD : function getOwnPropertyDescriptor(O, P) {
+  O = toIObject(O);
+  P = toPrimitive(P, true);
+  if (IE8_DOM_DEFINE) try {
+    return gOPD(O, P);
+  } catch (e) { /* empty */ }
+  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
+};
+
+
+/***/ }),
+/* 70 */
+/***/ (function(module, exports) {
+
+
+
+/***/ }),
+/* 71 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(25)('asyncIterator');
+
+
+/***/ }),
+/* 72 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(25)('observable');
+
+
+/***/ }),
+/* 73 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(74)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(75)
+
+/* template */
+var __vue_template__ = __webpack_require__(86)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+  typeof __vue_exports__.default === "object" ||
+  typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+  __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/pages/about/About.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-13681c5e"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+  for (var name in module) {
+    __vue_options__.style[name] = module[name]
+  }
+})
+if (typeof __register_static_styles__ === "function") {
+  __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 74 */
+/***/ (function(module, exports) {
+
+module.exports = {
+  "list": {
+    "backgroundColor": "#F5F5F5"
+  },
+  "item": {
+    "paddingTop": "30",
+    "paddingBottom": "30",
+    "paddingLeft": "60",
+    "paddingRight": "40",
+    "borderBottomWidth": "1",
+    "borderBottomStyle": "solid",
+    "borderBottomColor": "#E6E6E6",
+    "backgroundColor": "#FFFFFF",
+    "flexDirection": "row",
+    "justifyContent": "space-between",
+    "alignItems": "center"
+  },
+  "item-1": {
+    "borderTopWidth": "1",
+    "borderTopStyle": "solid",
+    "borderTopColor": "#E6E6E6"
+  },
+  "item-title": {
+    "fontSize": "42",
+    "color": "#606060"
+  },
+  "item-value": {
+    "fontSize": "36",
+    "color": "#999999"
+  },
+  "arrow-icon": {
+    "width": "22",
+    "height": "36"
+  },
+  "copyright": {
+    "marginTop": "50",
+    "paddingBottom": "20"
+  },
+  "copyright-text": {
+    "fontSize": "22",
+    "color": "#A0A0A0",
+    "textAlign": "center"
+  }
+}
+
+/***/ }),
+/* 75 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _utils = __webpack_require__(27);
+
+var utils = _interopRequireWildcard(_utils);
+
+var _mock = __webpack_require__(76);
+
+var _AppInfoCard = __webpack_require__(82);
+
+var _AppInfoCard2 = _interopRequireDefault(_AppInfoCard);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+var picker = weex.requireModule('picker'); //
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+var channel = new BroadcastChannel('language');
+exports.default = {
+  components: { AppInfoCard: _AppInfoCard2.default },
+  data: function data() {
+    return {
+      language: 'en',
+      followSystemLanguage: true,
+      navigationBarOptions: {
+        title: {
+          zh: '关于 Weex',
+          en: 'About Weex'
+        }
+      },
+      dict: {
+        FOLLOW_SYSTEM: { en: 'Follow System', zh: '跟随系统' },
+        LANGUAGE: { en: 'Language', zh: '语言' }
+      },
+      aboutApp: _mock.aboutApp
+    };
+  },
+
+  watch: {
+    language: function language() {
+      channel.postMessage({ language: this.language });
+    }
+  },
+  computed: {
+    languageName: function languageName() {
+      if (this.followSystemLanguage) {
+        return this.i18n(this.dict.FOLLOW_SYSTEM);
+      }
+      return this.i18n({ en: 'English', zh: '简体中文' });
+    }
+  },
+  created: function created() {
+    var _this = this;
+
+    utils.readAbout(function (about) {
+      _this.aboutApp = about;
+    });
+    utils.getStorageLanguage(function (lang) {
+      return _this.followSystemLanguage = false;
+    }, function () {
+      return _this.followSystemLanguage = true;
+    });
+  },
+
+  methods: {
+    chooseLanguage: function chooseLanguage() {
+      var _this2 = this;
+
+      var options = ['', 'en', 'zh'];
+      var index = this.followSystemLanguage ? 0 : options.indexOf(this.language);
+      picker.pick({
+        index: index,
+        items: [this.i18n(this.dict.FOLLOW_SYSTEM), 'English', '中文']
+      }, function (_ref) {
+        var result = _ref.result,
+            data = _ref.data;
+
+        if (result === 'success') {
+          var select = options[data];
+          if (select) {
+            _this2.followSystemLanguage = false;
+            _this2.language = select;
+            utils.setLanguage(select);
+          } else {
+            _this2.followSystemLanguage = true;
+            utils.clearStorageLanguage();
+            utils.getSystemLanguage(function (lang) {
+              _this2.language = lang;
+            }, function (error) {
+              _this2.language = 'en';
+            });
+          }
+        }
+      });
+    }
+  }
+};
+
+/***/ }),
+/* 76 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.aboutApp = exports.guideLessons = undefined;
+
+var _sliders = __webpack_require__(77);
+
+var _sliders2 = _interopRequireDefault(_sliders);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var guideLessons = exports.guideLessons = _sliders2.default;
+
+var aboutApp = exports.aboutApp = [{
+  title: { en: 'Weex Official Website', zh: 'Weex 官方网站' },
+  link: {
+    en: 'http://weex-project.io/',
+    zh: 'http://weex-project.io/cn/'
+  }
+}, {
+  title: { en: 'Apache Software Foundation', zh: 'Apache 软件基金会' },
+  link: 'http://www.apache.org/'
+}, {
+  title: { en: 'Who is using Weex', zh: '谁在使用 Weex' },
+  link: {
+    en: 'http://weex-project.io/who-is-using-weex.html',
+    zh: 'http://weex-project.io/cn/who-is-using-weex.html'
+  }
+}, {
+  title: { en: 'Contribution', zh: '参与贡献' },
+  link: {
+    en: 'http://weex-project.io/guide/contributing.html',
+    zh: 'http://weex-project.io/cn/guide/contributing.html'
+  }
+}, {
+  title: { en: 'Release Note', zh: '版本变更' },
+  link: {
+    en: 'http://weex-project.io/releasenote.html',
+    zh: 'http://weex-project.io/cn/releasenote.html'
+  }
+}, {
+  title: { en: 'FAQ', zh: '常见问题' },
+  link: {
+    en: 'http://weex-project.io/faq.html',
+    zh: 'http://weex-project.io/cn/faq.html'
+  }
+}];
+
+/***/ }),
+/* 77 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _defineProperty2 = __webpack_require__(78);
+
+var _defineProperty3 = _interopRequireDefault(_defineProperty2);
+
+var _ref, _ref2, _ref3;
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = [{
+  subject: 'weex',
+  mainColor: '#00B4FF',
+  title: { zh: '学习 Weex', en: 'Learn Weex' },
+  poster: 'https://gw.alicdn.com/tfs/TB1.8Vdl9_I8KJjy0FoXXaFnVXa-3799-1615.png',
+  posterBg: '#E5F7FF',
+  posterStyle: {
+    width: '650px',
+    height: '304px'
+  },
+  copyright: {
+    zh: '来自 http://weex-project.io/cn/',
+    en: 'From http://weex-project.io/'
+  },
+  lessons: [{
+    title: {
+      zh: '快速入门',
+      en: 'Getting Started'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/guide/index.html',
+      en: 'http://weex-project.io/guide/index.html'
+    }
+  }, {
+    title: {
+      zh: '工作原理',
+      en: 'How it Works'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/wiki/index.html',
+      en: 'http://weex-project.io/wiki/index.html'
+    }
+  }, {
+    title: {
+      zh: 'Weex 中的前端框架',
+      en: 'Front-end Frameworks'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/guide/front-end-frameworks.html',
+      en: 'http://weex-project.io/guide/front-end-frameworks.html'
+    }
+  }, {
+    title: {
+      zh: '在 Weex 中使用 Vue.js',
+      en: 'Use Vue.js on Weex'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/guide/use-vue.html',
+      en: 'http://weex-project.io/guide/use-vue.html'
+    }
+  }, {
+    title: {
+      zh: '与 Web 平台的差异',
+      en: 'Platform difference with Web'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/wiki/platform-difference.html',
+      en: 'http://weex-project.io/wiki/platform-difference.html'
+    }
+  }, {
+    title: {
+      zh: '集成 Weex 到已有应用',
+      en: 'Integrate to Your App'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/guide/integrate-to-your-app.html',
+      en: 'http://weex-project.io/guide/integrate-to-your-app.html'
+    }
+  }, {
+    title: {
+      zh: '搭建开发环境',
+      en: 'Set Up Dev Environment'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/guide/set-up-env.html',
+      en: 'http://weex-project.io/guide/set-up-env.html'
+    }
+  }, {
+    title: {
+      zh: '通用样式',
+      en: 'Common Styles'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/wiki/common-styles.html',
+      en: 'http://weex-project.io/wiki/common-styles.html'
+    }
+  }, {
+    title: {
+      zh: '通用事件',
+      en: 'Common Events'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/wiki/common-events.html',
+      en: 'http://weex-project.io/wiki/common-events.html'
+    }
+  }, {
+    title: {
+      zh: 'Weex 实例变量',
+      en: 'The "weex" Variable'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/references/weex-variable.html',
+      en: 'http://weex-project.io/references/weex-variable.html'
+    }
+  }, {
+    title: {
+      zh: '内置组件',
+      en: 'Built-in Components'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/references/components/index.html',
+      en: 'http://weex-project.io/references/components/index.html'
+    }
+  }, {
+    title: {
+      zh: '内置模块',
+      en: 'Built-in Modules'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/references/modules/index.html',
+      en: 'http://weex-project.io/references/modules/index.html'
+    }
+  }, {
+    title: {
+      zh: '扩展 Android 组件/模块',
+      en: 'Extend Android'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/guide/extend-android.html',
+      en: 'http://weex-project.io/guide/extend-android.html'
+    }
+  }, {
+    title: {
+      zh: '扩展 iOS 组件/模块',
+      en: 'Extend iOS'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/guide/extend-ios.html',
+      en: 'http://weex-project.io/guide/extend-ios.html'
+    }
+  }, {
+    title: {
+      zh: '使用 weex-toolkit',
+      en: 'Use weex-toolkit'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/tools/toolkit.html',
+      en: 'http://weex-project.io/tools/toolkit.html'
+    }
+  }, {
+    title: {
+      zh: '如何参与贡献',
+      en: 'How to Contribute'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/contributing.html',
+      en: 'http://weex-project.io/contributing.html'
+    }
+  }]
+}, (_ref = {
+  subject: 'vue',
+  mainColor: '#42b983',
+  title: { zh: '学习 Vue.js', en: 'Learn Vue.js' },
+  poster: 'https://gw.alicdn.com/tfs/TB1J_uKcMMPMeJjy1XdXXasrXXa-400-400.png',
+  posterBg: '#E7FBF2',
+  posterStyle: {
+    width: '300px',
+    height: '300px'
+  }
+}, (0, _defineProperty3.default)(_ref, 'title', {
+  zh: '学习 Vue.js',
+  en: 'Learn Vue.js'
+}), (0, _defineProperty3.default)(_ref, 'copyright', {
+  zh: '来自 https://cn.vuejs.org/',
+  en: 'From https://vuejs.org/'
+}), (0, _defineProperty3.default)(_ref, 'lessons', [{
+  title: {
+    zh: 'Vue.js 是什么?',
+    en: 'What is Vue.js ?'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/index.html',
+    en: 'https://vuejs.org/v2/guide/index.html'
+  }
+}, {
+  title: {
+    zh: '单文件组件',
+    en: 'Single File Components'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/single-file-components.html',
+    en: 'https://vuejs.org/v2/guide/single-file-components.html'
+  }
+}, {
+  title: {
+    zh: '模板语法',
+    en: 'Template Syntax'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/syntax.html',
+    en: 'https://vuejs.org/v2/guide/syntax.html'
+  }
+}, {
+  title: {
+    zh: 'Class 与 Style 绑定',
+    en: 'Class and Style Bindings'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/class-and-style.html',
+    en: 'https://vuejs.org/v2/guide/class-and-style.html'
+  }
+}, {
+  title: {
+    zh: '条件渲染',
+    en: 'Conditional Rendering'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/conditional.html',
+    en: 'https://vuejs.org/v2/guide/conditional.html'
+  }
+}, {
+  title: {
+    zh: '列表渲染',
+    en: 'List Rendering'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/list.html',
+    en: 'https://vuejs.org/v2/guide/list.html'
+  }
+}, {
+  title: {
+    zh: '事件处理',
+    en: 'Event Handling'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/events.html',
+    en: 'https://vuejs.org/v2/guide/events.html'
+  }
+}, {
+  title: {
+    zh: '表单输入绑定',
+    en: 'Form Input Bindings'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/forms.html',
+    en: 'https://vuejs.org/v2/guide/forms.html'
+  }
+}, {
+  title: {
+    zh: 'Vue 实例',
+    en: 'The Vue Instance'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/instance.html',
+    en: 'https://vuejs.org/v2/guide/instance.html'
+  }
+}, {
+  title: {
+    zh: '在 Weex 中使用 Vue.js',
+    en: 'Use Vue.js on Weex'
+  },
+  docLink: {
+    zh: 'http://weex-project.io/cn/guide/use-vue.html',
+    en: 'http://weex-project.io/guide/use-vue.html'
+  }
+}, {
+  title: {
+    zh: '混合(mixins)',
+    en: 'Mixins'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/mixins.html',
+    en: 'https://vuejs.org/v2/guide/mixins.html'
+  }
+}, {
+  title: {
+    zh: '过滤器(filters)',
+    en: 'Filters'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/filters.html',
+    en: 'https://vuejs.org/v2/guide/filters.html'
+  }
+}, {
+  title: {
+    zh: '插件(plugins)',
+    en: 'Plugins'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/plugins.html',
+    en: 'https://vuejs.org/v2/guide/plugins.html'
+  }
+}, {
+  title: {
+    zh: '自定义指令',
+    en: 'Custom Directives'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/custom-directive.html',
+    en: 'https://vuejs.org/v2/guide/custom-directive.html'
+  }
+}, {
+  title: {
+    zh: '状态管理',
+    en: 'State Management'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/state-management.html',
+    en: 'https://vuejs.org/v2/guide/state-management.html'
+  }
+}, {
+  title: {
+    zh: '深入响应式原理',
+    en: 'Reactivity in Depth'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/reactivity.html',
+    en: 'https://vuejs.org/v2/guide/reactivity.html'
+  }
+}, {
+  title: {
+    zh: '渲染函数',
+    en: 'Render Functions'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/render-function.html',
+    en: 'https://vuejs.org/v2/guide/render-function.html'
+  }
+}, {
+  title: {
+    zh: 'TypeScript 支持',
+    en: 'TypeScript Support'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/typescript.html',
+    en: 'https://vuejs.org/v2/guide/typescript.html'
+  }
+}, {
+  title: 'API',
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/api/',
+    en: 'https://vuejs.org/v2/api/'
+  }
+}]), _ref), (_ref2 = {
+  subject: 'javascript',
+  mainColor: '#F7BD2A',
+  title: { zh: '学习 Javascript', en: 'Learn Javascript' },
+  poster: 'https://gw.alicdn.com/tfs/TB1bT98hMoQMeJjy0FpXXcTxpXa-1500-700.png',
+  posterBg: '#FAF3EB',
+  posterStyle: {
+    width: '750px',
+    height: '350px'
+  }
+}, (0, _defineProperty3.default)(_ref2, 'title', {
+  zh: '学习 Javascript',
+  en: 'Learn Javascript'
+}), (0, _defineProperty3.default)(_ref2, 'copyright', {
+  zh: '来自 MDN (Mozilla Developer Network)',
+  en: 'From MDN (Mozilla Developer Network)'
+}), (0, _defineProperty3.default)(_ref2, 'lessons', [{
+  title: {
+    zh: '什么是 Javascript ?',
+    en: 'What is Javascript ?'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/What_is_JavaScript',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/What_is_JavaScript'
+  }
+}, {
+  title: {
+    zh: 'JavaScript基础',
+    en: 'JavaScript basics'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/Getting_started_with_the_web/JavaScript_basics',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/Getting_started_with_the_web/JavaScript_basics'
+  }
+}, {
+  title: {
+    zh: '重新介绍 JavaScript',
+    en: 'A re-introduction to JavaScript'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/A_re-introduction_to_JavaScript',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript'
+  }
+}, {
+  title: {
+    zh: '语法和数据类型',
+    en: 'Grammar and types'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Grammar_and_types#Variable_scope',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Variable_scope'
+  }
+}, {
+  title: {
+    zh: '数据类型和数据结构',
+    en: 'Data types and data structures'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures'
+  }
+}, {
+  title: {
+    zh: '变量',
+    en: 'Variables'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Variables',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Variables'
+  }
+}, {
+  title: {
+    zh: '数字和操作符',
+    en: 'Numbers and operators'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Math',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Math'
+  }
+}, {
+  title: {
+    zh: '字符串',
+    en: 'Handling text'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Strings',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Strings'
+  }
+}, {
+  title: {
+    zh: '常用的 String 方法',
+    en: 'Useful string methods'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Useful_string_methods',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Useful_string_methods'
+  }
+}, {
+  title: {
+    zh: '数组',
+    en: 'Arrays'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Arrays',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Arrays'
+  }
+}, {
+  title: {
+    zh: '函数',
+    en: 'Functions'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Functions',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions'
+  }
+}, {
+  title: {
+    zh: 'JavaScript 对象基础',
+    en: 'JavaScript object basics'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/Basics',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Basics'
+  }
+}, {
+  title: {
+    zh: '使用对象',
+    en: 'Working with objects'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Working_with_Objects',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects'
+  }
+}, {
+  title: {
+    zh: '使用 JSON 数据',
+    en: 'Working with JSON'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/JSON',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON'
+  }
+}, {
+  title: {
+    zh: '对象模型的细节',
+    en: 'Details of the object model'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Details_of_the_Object_Model',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Details_of_the_Object_Model'
+  }
+}, {
+  title: {
+    zh: '对象原型',
+    en: 'Object prototypes'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes',
+    en: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/Object_prototypes'
+  }
+}, {
+  title: {
+    zh: 'JavaScript 中的继承',
+    en: 'Inheritance in JavaScript'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/Inheritance',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Inheritance'
+  }
+}, {
+  title: {
+    zh: '继承与原型链',
+    en: 'Inheritance and the prototype chain'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain'
+  }
+}, {
+  title: {
+    zh: '严格模式',
+    en: 'Strict mode'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode'
+  }
+}, {
+  title: {
+    zh: '内存管理',
+    en: 'Memory Management'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Memory_Management',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management'
+  }
+}, {
+  title: {
+    zh: '并发模型与事件循环',
+    en: 'Concurrency model and Event Loop'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/EventLoop',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop'
+  }
+}, {
+  //   title: {
+  //     zh: '索引集合类',
+  //     en: 'Indexed collections'
+  //   },
+  //   docLink: {
+  //     zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Indexed_collections',
+  //     en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Indexed_collections'
+  //   }
+  // }, {
+  //   title: {
+  //     zh: '带键的集合',
+  //     en: 'Keyed collections'
+  //   },
+  //   docLink: {
+  //     zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Keyed_collections',
+  //     en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Keyed_collections'
+  //   }
+  // }, {
+  title: {
+    zh: 'JavaScript 标准库',
+    en: 'Standard built-in objects'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects'
+  }
+}]), _ref2), (_ref3 = {
+  subject: 'css',
+  mainColor: '#F56FC6',
+  title: { zh: '学习 CSS', en: 'Learn CSS' },
+  titleColor: '#FFFFFF',
+  poster: 'https://gw.alicdn.com/tfs/TB1k6anhMMPMeJjy1XdXXasrXXa-427-190.jpg',
+  posterBg: '#FFA2DE',
+  posterStyle: {
+    width: '517px',
+    height: '230px'
+  }
+}, (0, _defineProperty3.default)(_ref3, 'title', {
+  zh: '学习 CSS',
+  en: 'Learn CSS'
+}), (0, _defineProperty3.default)(_ref3, 'copyright', {
+  zh: '来自 MDN (Mozilla Developer Network)',
+  en: 'From MDN (Mozilla Developer Network)'
+}), (0, _defineProperty3.default)(_ref3, 'lessons', [{
+  title: {
+    zh: '什么是 CSS ?',
+    en: 'What is CSS ?'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Getting_started/What_is_CSS',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_started/What_is_CSS'
+  }
+}, {
+  title: {
+    zh: 'CSS 语法',
+    en: 'CSS Syntax'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Introduction_to_CSS/Syntax',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Syntax'
+  }
+}, {
+  title: {
+    zh: 'CSS的值和单位',
+    en: 'CSS Values and Units'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Introduction_to_CSS/Values_and_units',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Values_and_units'
+  }
+}, {
+  title: {
+    zh: '盒模型',
+    en: 'The Box Model'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Introduction_to_CSS/Box_model',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Box_model'
+  }
+}, {
+  title: {
+    zh: '盒模型的属性',
+    en: 'Box Model Properties'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Box_Model',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Box_Model'
+  }
+}, {
+  title: {
+    zh: '定位布局',
+    en: 'Positioning'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/CSS_layout/%E5%AE%9A%E4%BD%8Dx',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/positioning'
+  }
+}, {
+  title: {
+    zh: '定位布局的属性',
+    en: 'CSS Positioning'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Positioning',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning'
+  }
+}, {
+  title: {
+    zh: 'Flexbox 布局',
+    en: 'Flexbox Layout'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/CSS_layout/Flexbox',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox'
+  }
+}, {
+  title: {
+    zh: 'Flexbox 布局的属性',
+    en: 'CSS Flexible Box Layout'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Flexible_Box_Layout',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout'
+  }
+}, {
+  title: {
+    zh: 'Weex 中的通用样式',
+    en: 'Common Styles in Weex'
+  },
+  docLink: {
+    zh: 'http://weex-project.io/cn/references/common-style.html',
+    en: 'http://weex-project.io/references/common-style.html'
+  }
+}, {
+  title: {
+    zh: 'Weex 中的文本样式',
+    en: 'Text Styles in Weex'
+  },
+  docLink: {
+    zh: 'http://weex-project.io/cn/references/text-style.html',
+    en: 'http://weex-project.io/references/text-style.html'
+  }
+}, {
+  title: {
+    zh: '块格式化上下文(BFC)',
+    en: 'Block Formatting Context'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Block_formatting_context',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Block_formatting_context'
+  }
+}, {
+  title: {
+    zh: '视觉格式化模型',
+    en: 'Visual Formatting Model'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Visual_formatting_model',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Visual_formatting_model'
+  }
+}, {
+  title: 'CSS Reference',
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/CSS/Reference',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/CSS/Reference'
+  }
+}]), _ref3)];
+
+/***/ }),
+/* 78 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = true;
+
+var _defineProperty = __webpack_require__(79);
+
+var _defineProperty2 = _interopRequireDefault(_defineProperty);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = function (obj, key, value) {
+  if (key in obj) {
+    (0, _defineProperty2.default)(obj, key, {
+      value: value,
+      enumerable: true,
+      configurable: true,
+      writable: true
+    });
+  } else {
+    obj[key] = value;
+  }
+
+  return obj;
+};
+
+/***/ }),
+/* 79 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(80), __esModule: true };
+
+/***/ }),
+/* 80 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(81);
+var $Object = __webpack_require__(4).Object;
+module.exports = function defineProperty(it, key, desc) {
+  return $Object.defineProperty(it, key, desc);
+};
+
+
+/***/ }),
+/* 81 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(16);
+// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
+$export($export.S + $export.F * !__webpack_require__(2), 'Object', { defineProperty: __webpack_require__(1).f });
+
+
+/***/ }),
+/* 82 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(83)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(84)
+
+/* template */
+var __vue_template__ = __webpack_require__(85)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+  typeof __vue_exports__.default === "object" ||
+  typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+  __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/components/AppInfoCard.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-0ba305b6"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+  for (var name in module) {
+    __vue_options__.style[name] = module[name]
+  }
+})
+if (typeof __register_static_styles__ === "function") {
+  __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 83 */
+/***/ (function(module, exports) {
+
+module.exports = {
+  "card": {
+    "width": "650",
+    "justifyContent": "center",
+    "borderWidth": "1",
+    "borderColor": "#DDDDDD",
+    "borderRadius": "20",
+    "paddingTop": "50",
+    "paddingRight": "50",
+    "paddingBottom": "50",
+    "paddingLeft": "50",
+    "marginTop": "50",
+    "marginRight": "50",
+    "marginBottom": "50",
+    "marginLeft": "50",
+    "backgroundColor": "#FFFFFF"
+  },
+  "title": {
+    "fontSize": "34",
+    "textAlign": "center",
+    "color": "#808080",
+    "marginBottom": "20"
+  },
+  "version": {
+    "fontSize": "80",
+    "textAlign": "center",
+    "marginBottom": "30",
+    "color": "#323232"
+  },
+  "group": {
+    "marginTop": "10",
+    "flexDirection": "row"
+  },
+  "label": {
+    "width": "260",
+    "fontSize": "32",
+    "textAlign": "right",
+    "color": "#888888"
+  },
+  "value": {
+    "width": "230",
+    "paddingLeft": "50",
+    "fontSize": "32",
+    "color": "#414141"
+  }
+}
+
+/***/ }),
+/* 84 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _typeof2 = __webpack_require__(28);
+
+var _typeof3 = _interopRequireDefault(_typeof2);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+var invalid = '- invalid -';
+var unknown = '- - -';
+exports.default = {
+  data: function data() {
+    return {
+      version: invalid,
+      jsfmVersion: invalid,
+      platform: invalid,
+      osVersion: invalid,
+      deviceModel: invalid
+    };
+  },
+  created: function created() {
+    try {
+      this.jsfmVersion = getJSFMVersion();
+    } catch (e) {
+      this.jsfmVersion = '≤ 0.15.6';
+    }
+    if ((typeof WXEnvironment === 'undefined' ? 'undefined' : (0, _typeof3.default)(WXEnvironment)) === 'object') {
+      this.version = WXEnvironment.weexVersion || unknown;
+      this.platform = WXEnvironment.platform || unknown;
+      this.osVersion = WXEnvironment.osVersion || unknown;
+      this.deviceModel = WXEnvironment.deviceModel || unknown;
+    }
+  }
+};
+
+/***/ }),
+/* 85 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+  return _c('div', {
+    staticClass: ["card"]
+  }, [_c('div', {
+    staticClass: ["info"]
+  }, [_c('text', {
+    staticClass: ["title"]
+  }, [_vm._v("Weex SDK Version")]), _c('text', {
+    staticClass: ["version"]
+  }, [_vm._v(_vm._s(_vm.version))]), _c('div', {
+    staticClass: ["group"]
+  }, [_c('text', {
+    staticClass: ["label"]
+  }, [_vm._v("JS Framework")]), _c('text', {
+    staticClass: ["value"]
+  }, [_vm._v(_vm._s(_vm.jsfmVersion))])]), _c('div', {
+    staticClass: ["group"]
+  }, [_c('text', {
+    staticClass: ["label"]
+  }, [_vm._v("platform")]), _c('text', {
+    staticClass: ["value"]
+  }, [_vm._v(_vm._s(_vm.platform))])]), _c('div', {
+    staticClass: ["group"]
+  }, [_c('text', {
+    staticClass: ["label"]
+  }, [_vm._v("osVersion")]), _c('text', {
+    staticClass: ["value"]
+  }, [_vm._v(_vm._s(_vm.osVersion))])]), _c('div', {
+    staticClass: ["group"]
+  }, [_c('text', {
+    staticClass: ["label"]
+  }, [_vm._v("deviceModel")]), _c('text', {
+    staticClass: ["value"]
+  }, [_vm._v(_vm._s(_vm.deviceModel))])])])])
+},staticRenderFns: []}
+module.exports.render._withStripped = true
+
+/***/ }),
+/* 86 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+  return _c('list', {
+    staticClass: ["list"]
+  }, [_c('cell', {
+    appendAsTree: true,
+    attrs: {
+      "append": "tree"
+    }
+  }, [_c('app-info-card')], 1), _vm._l((_vm.aboutApp), function(item, i) {
+    return _c('cell', {
+      key: i,
+      class: ['item-cell', ("item-cell-" + (i+1))],
+      appendAsTree: true,
+      attrs: {
+        "append": "tree"
+      }
+    }, [(item.link) ? _c('div', {
+      class: ['item', ("item-" + (i+1))],
+      on: {
+        "click": function($event) {
+          _vm.jumpTo(item.link, _vm.i18n(item.title))
+        }
+      }
+    }, [_c('text', {
+      staticClass: ["item-title"]
+    }, [_vm._v(_vm._s(_vm.i18n(item.title)))]), _c('image', {
+      staticClass: ["arrow-icon"],
+      attrs: {
+        "src": "https://gw.alicdn.com/tfs/TB1iL2fkLDH8KJjy1XcXXcpdXXa-32-49.png"
+      }
+    })]) : _vm._e()])
+  }), _c('cell', {
+    staticClass: ["item-cell"],
+    appendAsTree: true,
+    attrs: {
+      "append": "tree"
+    }
+  }, [_c('div', {
+    staticClass: ["item"],
+    on: {
+      "click": _vm.chooseLanguage
+    }
+  }, [_c('text', {
+    staticClass: ["item-title"]
+  }, [_vm._v(_vm._s(_vm.i18n(_vm.dict.LANGUAGE)))]), _c('text', {
+    staticClass: ["item-value"]
+  }, [_vm._v(_vm._s(_vm.languageName))])])]), _vm._m(0)], 2)
+},staticRenderFns: [function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+  return _c('cell', {
+    appendAsTree: true,
+    attrs: {
+      "append": "tree"
+    }
+  }, [_c('div', {
+    staticClass: ["copyright"]
+  }, [_c('text', {
+    staticClass: ["copyright-text"]
+  }, [_vm._v("Copyright(c) 2017 The Apache Software Foundation.")]), _c('text', {
+    staticClass: ["copyright-text"]
+  }, [_vm._v("Licensed under the Apache License, Version 2.0")])])])
+}]}
+module.exports.render._withStripped = true
+
+/***/ })
+/******/ ]);
\ No newline at end of file
diff --git a/ios/bundlejs/examples.weex.js b/ios/bundlejs/examples.weex.js
new file mode 100644
index 0000000..68d81c8
--- /dev/null
+++ b/ios/bundlejs/examples.weex.js
@@ -0,0 +1,2598 @@
+// { "framework": "Vue" }
+"use weex:vue";
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, {
+/******/ 				configurable: false,
+/******/ 				enumerable: true,
+/******/ 				get: getter
+/******/ 			});
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = 37);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+var global = module.exports = typeof window != 'undefined' && window.Math == Math
+  ? window : typeof self != 'undefined' && self.Math == Math ? self
+  // eslint-disable-next-line no-new-func
+  : Function('return this')();
+if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports) {
+
+var hasOwnProperty = {}.hasOwnProperty;
+module.exports = function (it, key) {
+  return hasOwnProperty.call(it, key);
+};
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(3);
+var createDesc = __webpack_require__(12);
+module.exports = __webpack_require__(4) ? function (object, key, value) {
+  return dP.f(object, key, createDesc(1, value));
+} : function (object, key, value) {
+  object[key] = value;
+  return object;
+};
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(10);
+var IE8_DOM_DEFINE = __webpack_require__(29);
+var toPrimitive = __webpack_require__(17);
+var dP = Object.defineProperty;
+
+exports.f = __webpack_require__(4) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
+  anObject(O);
+  P = toPrimitive(P, true);
+  anObject(Attributes);
+  if (IE8_DOM_DEFINE) try {
+    return dP(O, P, Attributes);
+  } catch (e) { /* empty */ }
+  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
+  if ('value' in Attributes) O[P] = Attributes.value;
+  return O;
+};
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// Thank's IE8 for his funny defineProperty
+module.exports = !__webpack_require__(11)(function () {
+  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// to indexed object, toObject with fallback for non-array-like ES3 strings
+var IObject = __webpack_require__(51);
+var defined = __webpack_require__(16);
+module.exports = function (it) {
+  return IObject(defined(it));
+};
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var store = __webpack_require__(21)('wks');
+var uid = __webpack_require__(13);
+var Symbol = __webpack_require__(0).Symbol;
+var USE_SYMBOL = typeof Symbol == 'function';
+
+var $exports = module.exports = function (name) {
+  return store[name] || (store[name] =
+    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
+};
+
+$exports.store = store;
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports) {
+
+var core = module.exports = { version: '2.5.7' };
+if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+  return typeof it === 'object' ? it !== null : typeof it === 'function';
+};
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports) {
+
+module.exports = true;
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+module.exports = function (it) {
+  if (!isObject(it)) throw TypeError(it + ' is not an object!');
+  return it;
+};
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports) {
+
+module.exports = function (exec) {
+  try {
+    return !!exec();
+  } catch (e) {
+    return true;
+  }
+};
+
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports) {
+
+module.exports = function (bitmap, value) {
+  return {
+    enumerable: !(bitmap & 1),
+    configurable: !(bitmap & 2),
+    writable: !(bitmap & 4),
+    value: value
+  };
+};
+
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports) {
+
+var id = 0;
+var px = Math.random();
+module.exports = function (key) {
+  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
+};
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.fetchNews = exports.fetchDoodle = exports.readAbout = exports.saveAbout = exports.fetchAbout = exports.readGuide = exports.saveGuide = exports.fetchGuide = exports.readExamples = exports.saveExamples = exports.fetchExamples = undefined;
+
+var _stringify = __webpack_require__(40);
+
+var _stringify2 = _interopRequireDefault(_stringify);
+
+var _typeof2 = __webpack_require__(42);
+
+var _typeof3 = _interopRequireDefault(_typeof2);
+
+exports.createLink = createLink;
+exports.createURL = createURL;
+exports.i18n = i18n;
+exports.parseLanguage = parseLanguage;
+exports.setLanguage = setLanguage;
+exports.clearStorageLanguage = clearStorageLanguage;
+exports.getStorageLanguage = getStorageLanguage;
+exports.getSystemLanguage = getSystemLanguage;
+exports.getLanguage = getLanguage;
+exports.jumpTo = jumpTo;
+exports.viewSource = viewSource;
+exports.setTitleBar = setTitleBar;
+exports.fetchData = fetchData;
+exports.saveData = saveData;
+exports.readData = readData;
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var stream = weex.requireModule('stream');
+var storage = weex.requireModule('storage');
+var navigator = weex.requireModule('navigator');
+
+var encoder = typeof encodeURIComponent === 'function' ? encodeURIComponent : typeof encodeURI === 'function' ? encodeURI : function (x) {
+  return x;
+};
+
+function encodeParams(params) {
+  if (!params || (typeof params === 'undefined' ? 'undefined' : (0, _typeof3.default)(params)) !== 'object') {
+    return '';
+  }
+  var array = [];
+  for (var key in params) {
+    if (typeof params[key] === 'string') {
+      array.push(encoder(key) + '=' + encoder(params[key]));
+    }
+  }
+  return array.join('&');
+}
+
+function createLink(name) {
+  var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+  var args = [];
+  for (var key in params) {
+    if (typeof params[key] === 'string') {
+      args.push(encoder(key) + '=' + encoder(params[key]));
+    }
+  }
+  if (WXEnvironment.platform === 'Web') {
+    args.unshift('page=' + name + '.web.js');
+    return '/?' + args.join('&');
+  }
+  var base = getBaseURL();
+  return '' + base + name + '.weex.js' + (args.length ? '?' + args.join('&') : '');
+}
+
+function createURL(hash, params) {
+  if (WXEnvironment.platform === 'Web') {
+    return 'http://dotwe.org/raw/htmlVue/' + hash;
+  }
+  var url = 'http://dotwe.org/raw/dist/' + hash + '.bundle.wx';
+  var paramString = encodeParams(params);
+  if (WXEnvironment.appName === 'TB') {
+    return url + '?_wx_tpl=' + url + '&' + paramString;
+  }
+  if (WXEnvironment.appName === 'WXSample') {
+    return url + '?' + paramString;
+  }
+  return url + '?wx_weex=true&' + paramString;
+}
+
+function getBaseURL() {
+  var bundleUrl = weex.config.bundleUrl;
+  var isAndroidAssets = bundleUrl.indexOf('your_current_IP') >= 0 || bundleUrl.indexOf('file://assets/') >= 0;
+  var isiOSAssets = bundleUrl.indexOf('file:///') >= 0 && bundleUrl.indexOf('WeexDemo.app') > 0;
+  if (isAndroidAssets) {
+    return 'file://assets/';
+  } else if (isiOSAssets) {
+    // file:///var/mobile/Containers/Bundle/Application/{id}/WeexDemo.app/
+    // file:///Users/{user}/Library/Developer/CoreSimulator/Devices/{id}/data/Containers/Bundle/Application/{id}/WeexDemo.app/
+    return bundleUrl.substring(0, bundleUrl.lastIndexOf('/') + 1);
+  }
+  return '';
+}
+
+function i18n(text, language) {
+  if (typeof text === 'string') {
+    return text;
+  }
+  if (Object.prototype.toString.call(text) === '[object Object]') {
+    var lang = this && this.language || language || 'en';
+    return text[lang];
+  }
+}
+
+var supportedLanguageRE = /(en|zh)\_?\w*/i;
+function parseLanguage(language) {
+  var match = supportedLanguageRE.exec(language + '');
+  if (match && match[1]) {
+    return match[1];
+  }
+  return '';
+}
+
+function setLanguage(language) {
+  var lang = parseLanguage(language);
+  if (lang) {
+    storage.setItem('WEEX_PLAYGROUND_LANGUAGE', lang);
+  }
+}
+
+function clearStorageLanguage() {
+  storage.removeItem('WEEX_PLAYGROUND_LANGUAGE');
+}
+
+function getStorageLanguage(done) {
+  var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+  if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+    return;
+  }
+  try {
+    storage.getItem('WEEX_PLAYGROUND_LANGUAGE', function (event) {
+      if (event.result === 'success') {
+        var lang = parseLanguage(event.data);
+        lang ? done(lang) : fail();
+      } else {
+        fail(event);
+      }
+    });
+  } catch (err) {
+    fail(err);
+  }
+}
+
+function getSystemLanguage(done) {
+  var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+  if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+    return;
+  }
+  if (WXEnvironment.platform.toLowerCase() === 'web') {
+    var lang = parseLanguage(window.navigator.language);
+    lang ? done(lang) : fail();
+  } else {
+    try {
+      var locale = weex.requireModule('locale') || weex.requireModule('local');
+      var useSync = false;
+      var resSync = locale.getLanguage(function (language) {
+        var lang = parseLanguage(language);
+        if (lang) {
+          useSync || done(lang);
+        } else {
+          fail();
+        }
+      });
+      var langSync = parseLanguage(resSync);
+      if (langSync) {
+        useSync = true;
+        done(langSync);
+      } else {
+        fail();
+      }
+    } catch (e) {
+      fail(e);
+    }
+  }
+}
+
+var languageRE = /.+[\?\&]{1}language=([\d\w]+)[\?\&]?.*/i;
+function getLanguage() {
+  var done = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
+
+  var match = languageRE.exec(weex.config.bundleUrl || '');
+  var lang = parseLanguage(match && match[1]);
+  if (lang) {
+    done(lang);
+  } else {
+    getStorageLanguage(done, function () {
+      getSystemLanguage(done, function () {
+        done('en');
+      });
+    });
+  }
+}
+
+function jumpTo(url, title, lang) {
+  getLanguage(function (language) {
+    storage.setItem('CURRENT_DOCUMENT_URL', i18n(url, lang || language));
+    navigator.push({
+      url: createURL('bf0305c14b511b24a4e616f53926432b', { language: language, title: i18n(title, lang || language) })
+    });
+  });
+}
+
+function viewSource(hash) {
+  getLanguage(function (language) {
+    navigator.push({
+      url: createURL('f6ce29faf686eabc38b410bf4828fa5a', { hash: hash, language: language })
+    });
+  });
+}
+
+function setTitleBar(options) {
+  var language = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en';
+
+  if (Object.prototype.toString.apply(options) !== '[object Object]') {
+    return;
+  }
+  var titleBar = weex.requireModule('titleBar');
+  if (options.color || options.backgroundColor) {
+    try {
+      titleBar.setStyle({
+        foregroundColor: options.color || '#FFFFFF',
+        backgroundColor: options.backgroundColor || '#00B4FF'
+      });
+    } catch (e) {}
+  }
+  var title = i18n(options.title, language);
+  if (title) {
+    try {
+      titleBar.setTitle(title);
+    } catch (e) {}
+  }
+}
+
+var storageKeys = {
+  doodle: 'WEEX_PLAYGROUND_APP_DOODLE',
+  guide: 'WEEX_PLAYGROUND_APP_GUIDE',
+  examples: 'WEEX_PLAYGROUND_APP_EXAMPLES',
+  news: 'WEEX_PLAYGROUND_APP_NEWS',
+  about: 'WEEX_PLAYGROUND_APP_ABOUT'
+};
+function fetchData(name) {
+  var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+  var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+  try {
+    stream.fetch({
+      url: 'http://dotwe.org/query/weex-playground-app',
+      method: 'post',
+      headers: {
+        'Content-Type': 'application/x-www-form-urlencoded'
+      },
+      type: 'json',
+      body: 'name=' + name
+    }, function (res) {
+      if (res.ok && res.data && res.data.success) {
+        done(res.data);
+      } else {
+        fail(res);
+      }
+    });
+  } catch (err) {
+    fail(err);
+  }
+}
+function saveData(name, result) {
+  var key = storageKeys[name];
+  if (!key) return;
+  if (result && (typeof result === 'undefined' ? 'undefined' : (0, _typeof3.default)(result)) === 'object') {
+    result.timestamp = Date.now();
+    storage.setItem(key, (0, _stringify2.default)(result));
+  }
+}
+function readData(name) {
+  var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+  var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+  var key = storageKeys[name];
+  if (!key) return fail();
+  try {
+    storage.getItem(key, function (event) {
+      if (event.result === 'success') {
+        var result = JSON.parse(event.data);
+        if (result && Array.isArray(result[name])) {
+          return done(result[name]);
+        }
+      }
+      fail(event);
+    });
+  } catch (e) {
+    fail(e);
+  }
+}
+
+var fetchExamples = exports.fetchExamples = function fetchExamples() {
+  for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+    args[_key] = arguments[_key];
+  }
+
+  return fetchData.apply(undefined, ['examples'].concat(args));
+};
+var saveExamples = exports.saveExamples = function saveExamples() {
+  for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+    args[_key2] = arguments[_key2];
+  }
+
+  return saveData.apply(undefined, ['examples'].concat(args));
+};
+var readExamples = exports.readExamples = function readExamples() {
+  for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+    args[_key3] = arguments[_key3];
+  }
+
+  return readData.apply(undefined, ['examples'].concat(args));
+};
+
+var fetchGuide = exports.fetchGuide = function fetchGuide() {
+  for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+    args[_key4] = arguments[_key4];
+  }
+
+  return fetchData.apply(undefined, ['guide'].concat(args));
+};
+var saveGuide = exports.saveGuide = function saveGuide() {
+  for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
+    args[_key5] = arguments[_key5];
+  }
+
+  return saveData.apply(undefined, ['guide'].concat(args));
+};
+var readGuide = exports.readGuide = function readGuide() {
+  for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
+    args[_key6] = arguments[_key6];
+  }
+
+  return readData.apply(undefined, ['guide'].concat(args));
+};
+
+var fetchAbout = exports.fetchAbout = function fetchAbout() {
+  for (var _len7 = arguments.length, args = Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
+    args[_key7] = arguments[_key7];
+  }
+
+  return fetchData.apply(undefined, ['about'].concat(args));
+};
+var saveAbout = exports.saveAbout = function saveAbout() {
+  for (var _len8 = arguments.length, args = Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
+    args[_key8] = arguments[_key8];
+  }
+
+  return saveData.apply(undefined, ['about'].concat(args));
+};
+var readAbout = exports.readAbout = function readAbout() {
+  for (var _len9 = arguments.length, args = Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
+    args[_key9] = arguments[_key9];
+  }
+
+  return readData.apply(undefined, ['about'].concat(args));
+};
+
+var fetchDoodle = exports.fetchDoodle = function fetchDoodle() {
+  for (var _len10 = arguments.length, args = Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
+    args[_key10] = arguments[_key10];
+  }
+
+  return fetchData.apply(undefined, ['doodle'].concat(args));
+};
+var fetchNews = exports.fetchNews = function fetchNews() {
+  for (var _len11 = arguments.length, args = Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
+    args[_key11] = arguments[_key11];
+  }
+
+  return fetchData.apply(undefined, ['news'].concat(args));
+};
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports) {
+
+// 7.1.4 ToInteger
+var ceil = Math.ceil;
+var floor = Math.floor;
+module.exports = function (it) {
+  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+};
+
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports) {
+
+// 7.2.1 RequireObjectCoercible(argument)
+module.exports = function (it) {
+  if (it == undefined) throw TypeError("Can't call method on  " + it);
+  return it;
+};
+
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.1 ToPrimitive(input [, PreferredType])
+var isObject = __webpack_require__(8);
+// instead of the ES6 spec version, we didn't implement @@toPrimitive case
+// and the second argument - flag - preferred type is a string
+module.exports = function (it, S) {
+  if (!isObject(it)) return it;
+  var fn, val;
+  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
+  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+  throw TypeError("Can't convert object to primitive value");
+};
+
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports) {
+
+module.exports = {};
+
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.14 / 15.2.3.14 Object.keys(O)
+var $keys = __webpack_require__(33);
+var enumBugKeys = __webpack_require__(22);
+
+module.exports = Object.keys || function keys(O) {
+  return $keys(O, enumBugKeys);
+};
+
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var shared = __webpack_require__(21)('keys');
+var uid = __webpack_require__(13);
+module.exports = function (key) {
+  return shared[key] || (shared[key] = uid(key));
+};
+
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(7);
+var global = __webpack_require__(0);
+var SHARED = '__core-js_shared__';
+var store = global[SHARED] || (global[SHARED] = {});
+
+(module.exports = function (key, value) {
+  return store[key] || (store[key] = value !== undefined ? value : {});
+})('versions', []).push({
+  version: core.version,
+  mode: __webpack_require__(9) ? 'pure' : 'global',
+  copyright: '© 2018 Denis Pushkarev (zloirock.ru)'
+});
+
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports) {
+
+// IE 8- don't enum bug keys
+module.exports = (
+  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
+).split(',');
+
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var def = __webpack_require__(3).f;
+var has = __webpack_require__(1);
+var TAG = __webpack_require__(6)('toStringTag');
+
+module.exports = function (it, tag, stat) {
+  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
+};
+
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {
+
+exports.f = __webpack_require__(6);
+
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(7);
+var LIBRARY = __webpack_require__(9);
+var wksExt = __webpack_require__(24);
+var defineProperty = __webpack_require__(3).f;
+module.exports = function (name) {
+  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
+  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
+};
+
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports) {
+
+exports.f = {}.propertyIsEnumerable;
+
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var LIBRARY = __webpack_require__(9);
+var $export = __webpack_require__(28);
+var redefine = __webpack_require__(31);
+var hide = __webpack_require__(2);
+var Iterators = __webpack_require__(18);
+var $iterCreate = __webpack_require__(49);
+var setToStringTag = __webpack_require__(23);
+var getPrototypeOf = __webpack_require__(56);
+var ITERATOR = __webpack_require__(6)('iterator');
+var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
+var FF_ITERATOR = '@@iterator';
+var KEYS = 'keys';
+var VALUES = 'values';
+
+var returnThis = function () { return this; };
+
+module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
+  $iterCreate(Constructor, NAME, next);
+  var getMethod = function (kind) {
+    if (!BUGGY && kind in proto) return proto[kind];
+    switch (kind) {
+      case KEYS: return function keys() { return new Constructor(this, kind); };
+      case VALUES: return function values() { return new Constructor(this, kind); };
+    } return function entries() { return new Constructor(this, kind); };
+  };
+  var TAG = NAME + ' Iterator';
+  var DEF_VALUES = DEFAULT == VALUES;
+  var VALUES_BUG = false;
+  var proto = Base.prototype;
+  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
+  var $default = $native || getMethod(DEFAULT);
+  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
+  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
+  var methods, key, IteratorPrototype;
+  // Fix native
+  if ($anyNative) {
+    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
+    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
+      // Set @@toStringTag to native iterators
+      setToStringTag(IteratorPrototype, TAG, true);
+      // fix for some old engines
+      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
+    }
+  }
+  // fix Array#{values, @@iterator}.name in V8 / FF
+  if (DEF_VALUES && $native && $native.name !== VALUES) {
+    VALUES_BUG = true;
+    $default = function values() { return $native.call(this); };
+  }
+  // Define iterator
+  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
+    hide(proto, ITERATOR, $default);
+  }
+  // Plug for library
+  Iterators[NAME] = $default;
+  Iterators[TAG] = returnThis;
+  if (DEFAULT) {
+    methods = {
+      values: DEF_VALUES ? $default : getMethod(VALUES),
+      keys: IS_SET ? $default : getMethod(KEYS),
+      entries: $entries
+    };
+    if (FORCED) for (key in methods) {
+      if (!(key in proto)) redefine(proto, key, methods[key]);
+    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
+  }
+  return methods;
+};
+
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(7);
+var ctx = __webpack_require__(47);
+var hide = __webpack_require__(2);
+var has = __webpack_require__(1);
+var PROTOTYPE = 'prototype';
+
+var $export = function (type, name, source) {
+  var IS_FORCED = type & $export.F;
+  var IS_GLOBAL = type & $export.G;
+  var IS_STATIC = type & $export.S;
+  var IS_PROTO = type & $export.P;
+  var IS_BIND = type & $export.B;
+  var IS_WRAP = type & $export.W;
+  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
+  var expProto = exports[PROTOTYPE];
+  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];
+  var key, own, out;
+  if (IS_GLOBAL) source = name;
+  for (key in source) {
+    // contains in native
+    own = !IS_FORCED && target && target[key] !== undefined;
+    if (own && has(exports, key)) continue;
+    // export native or passed
+    out = own ? target[key] : source[key];
+    // prevent global pollution for namespaces
+    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
+    // bind timers to global for call from export context
+    : IS_BIND && own ? ctx(out, global)
+    // wrap global constructors for prevent change them in library
+    : IS_WRAP && target[key] == out ? (function (C) {
+      var F = function (a, b, c) {
+        if (this instanceof C) {
+          switch (arguments.length) {
+            case 0: return new C();
+            case 1: return new C(a);
+            case 2: return new C(a, b);
+          } return new C(a, b, c);
+        } return C.apply(this, arguments);
+      };
+      F[PROTOTYPE] = C[PROTOTYPE];
+      return F;
+    // make static versions for prototype methods
+    })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
+    // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
+    if (IS_PROTO) {
+      (exports.virtual || (exports.virtual = {}))[key] = out;
+      // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
+      if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);
+    }
+  }
+};
+// type bitmap
+$export.F = 1;   // forced
+$export.G = 2;   // global
+$export.S = 4;   // static
+$export.P = 8;   // proto
+$export.B = 16;  // bind
+$export.W = 32;  // wrap
+$export.U = 64;  // safe
+$export.R = 128; // real proto method for `library`
+module.exports = $export;
+
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = !__webpack_require__(4) && !__webpack_require__(11)(function () {
+  return Object.defineProperty(__webpack_require__(30)('div'), 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+var document = __webpack_require__(0).document;
+// typeof document.createElement is 'object' in old IE
+var is = isObject(document) && isObject(document.createElement);
+module.exports = function (it) {
+  return is ? document.createElement(it) : {};
+};
+
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(2);
+
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
+var anObject = __webpack_require__(10);
+var dPs = __webpack_require__(50);
+var enumBugKeys = __webpack_require__(22);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+var Empty = function () { /* empty */ };
+var PROTOTYPE = 'prototype';
+
+// Create object with fake `null` prototype: use iframe Object with cleared prototype
+var createDict = function () {
+  // Thrash, waste and sodomy: IE GC bug
+  var iframe = __webpack_require__(30)('iframe');
+  var i = enumBugKeys.length;
+  var lt = '<';
+  var gt = '>';
+  var iframeDocument;
+  iframe.style.display = 'none';
+  __webpack_require__(55).appendChild(iframe);
+  iframe.src = 'javascript:'; // eslint-disable-line no-script-url
+  // createDict = iframe.contentWindow.Object;
+  // html.removeChild(iframe);
+  iframeDocument = iframe.contentWindow.document;
+  iframeDocument.open();
+  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
+  iframeDocument.close();
+  createDict = iframeDocument.F;
+  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];
+  return createDict();
+};
+
+module.exports = Object.create || function create(O, Properties) {
+  var result;
+  if (O !== null) {
+    Empty[PROTOTYPE] = anObject(O);
+    result = new Empty();
+    Empty[PROTOTYPE] = null;
+    // add "__proto__" for Object.getPrototypeOf polyfill
+    result[IE_PROTO] = O;
+  } else result = createDict();
+  return Properties === undefined ? result : dPs(result, Properties);
+};
+
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var has = __webpack_require__(1);
+var toIObject = __webpack_require__(5);
+var arrayIndexOf = __webpack_require__(52)(false);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+
+module.exports = function (object, names) {
+  var O = toIObject(object);
+  var i = 0;
+  var result = [];
+  var key;
+  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);
+  // Don't enum bug & hidden keys
+  while (names.length > i) if (has(O, key = names[i++])) {
+    ~arrayIndexOf(result, key) || result.push(key);
+  }
+  return result;
+};
+
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports) {
+
+var toString = {}.toString;
+
+module.exports = function (it) {
+  return toString.call(it).slice(8, -1);
+};
+
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports) {
+
+exports.f = Object.getOwnPropertySymbols;
+
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
+var $keys = __webpack_require__(33);
+var hiddenKeys = __webpack_require__(22).concat('length', 'prototype');
+
+exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+  return $keys(O, hiddenKeys);
+};
+
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+__webpack_require__(38);
+
+var _Examples = __webpack_require__(73);
+
+var _Examples2 = _interopRequireDefault(_Examples);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// show title bar
+try {
+  var titleBar = weex.requireModule('titleBar');
+  titleBar.showTitleBar(true);
+} catch (e) {}
+
+_Examples2.default.el = '#root';
+new Vue(_Examples2.default);
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _mixin = __webpack_require__(39);
+
+var _mixin2 = _interopRequireDefault(_mixin);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// use shared mixins
+Vue.mixin(_mixin2.default);
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _index = __webpack_require__(14);
+
+var utils = _interopRequireWildcard(_index);
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+var storage = weex.requireModule('storage');
+
+exports.default = {
+  filters: {
+    i18n: utils.i18n,
+    url: utils.createURL,
+    link: utils.createLink
+  },
+  methods: {
+    createLink: utils.createLink,
+    createURL: utils.createURL,
+    i18n: utils.i18n,
+    getLanguage: utils.getLanguage,
+    fetchData: utils.fetchData,
+    saveData: utils.saveData,
+    readData: utils.readData,
+    jumpTo: utils.jumpTo
+  },
+  created: function created() {
+    var _this = this;
+
+    // get and set language
+    utils.getLanguage(function (language) {
+      _this.language = language;
+      utils.setTitleBar(_this.navigationBarOptions, language);
+    });
+
+    // listen to the language change event
+    var channel = new BroadcastChannel('language');
+    channel.onmessage = function (event) {
+      if (event.data && event.data.language) {
+        _this.language = event.data.language;
+      }
+    };
+  },
+  beforeDestroy: function beforeDestroy() {
+    storage.removeItem('CURRENT_DOCUMENT_URL');
+    storage.removeItem('CURRENT_SOURCE_HASH');
+  }
+};
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(41), __esModule: true };
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(7);
+var $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify });
+module.exports = function stringify(it) { // eslint-disable-line no-unused-vars
+  return $JSON.stringify.apply($JSON, arguments);
+};
+
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = true;
+
+var _iterator = __webpack_require__(43);
+
+var _iterator2 = _interopRequireDefault(_iterator);
+
+var _symbol = __webpack_require__(62);
+
+var _symbol2 = _interopRequireDefault(_symbol);
+
+var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
+  return typeof obj === "undefined" ? "undefined" : _typeof(obj);
+} : function (obj) {
+  return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
+};
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(44), __esModule: true };
+
+/***/ }),
+/* 44 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(45);
+__webpack_require__(58);
+module.exports = __webpack_require__(24).f('iterator');
+
+
+/***/ }),
+/* 45 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $at = __webpack_require__(46)(true);
+
+// 21.1.3.27 String.prototype[@@iterator]()
+__webpack_require__(27)(String, 'String', function (iterated) {
+  this._t = String(iterated); // target
+  this._i = 0;                // next index
+// 21.1.5.2.1 %StringIteratorPrototype%.next()
+}, function () {
+  var O = this._t;
+  var index = this._i;
+  var point;
+  if (index >= O.length) return { value: undefined, done: true };
+  point = $at(O, index);
+  this._i += point.length;
+  return { value: point, done: false };
+});
+
+
+/***/ }),
+/* 46 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(15);
+var defined = __webpack_require__(16);
+// true  -> String#at
+// false -> String#codePointAt
+module.exports = function (TO_STRING) {
+  return function (that, pos) {
+    var s = String(defined(that));
+    var i = toInteger(pos);
+    var l = s.length;
+    var a, b;
+    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
+    a = s.charCodeAt(i);
+    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
+      ? TO_STRING ? s.charAt(i) : a
+      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
+  };
+};
+
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// optional / simple context binding
+var aFunction = __webpack_require__(48);
+module.exports = function (fn, that, length) {
+  aFunction(fn);
+  if (that === undefined) return fn;
+  switch (length) {
+    case 1: return function (a) {
+      return fn.call(that, a);
+    };
+    case 2: return function (a, b) {
+      return fn.call(that, a, b);
+    };
+    case 3: return function (a, b, c) {
+      return fn.call(that, a, b, c);
+    };
+  }
+  return function (/* ...args */) {
+    return fn.apply(that, arguments);
+  };
+};
+
+
+/***/ }),
+/* 48 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+  if (typeof it != 'function') throw TypeError(it + ' is not a function!');
+  return it;
+};
+
+
+/***/ }),
+/* 49 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var create = __webpack_require__(32);
+var descriptor = __webpack_require__(12);
+var setToStringTag = __webpack_require__(23);
+var IteratorPrototype = {};
+
+// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
+__webpack_require__(2)(IteratorPrototype, __webpack_require__(6)('iterator'), function () { return this; });
+
+module.exports = function (Constructor, NAME, next) {
+  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
+  setToStringTag(Constructor, NAME + ' Iterator');
+};
+
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(3);
+var anObject = __webpack_require__(10);
+var getKeys = __webpack_require__(19);
+
+module.exports = __webpack_require__(4) ? Object.defineProperties : function defineProperties(O, Properties) {
+  anObject(O);
+  var keys = getKeys(Properties);
+  var length = keys.length;
+  var i = 0;
+  var P;
+  while (length > i) dP.f(O, P = keys[i++], Properties[P]);
+  return O;
+};
+
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for non-array-like ES3 and non-enumerable old V8 strings
+var cof = __webpack_require__(34);
+// eslint-disable-next-line no-prototype-builtins
+module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
+  return cof(it) == 'String' ? it.split('') : Object(it);
+};
+
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// false -> Array#indexOf
+// true  -> Array#includes
+var toIObject = __webpack_require__(5);
+var toLength = __webpack_require__(53);
+var toAbsoluteIndex = __webpack_require__(54);
+module.exports = function (IS_INCLUDES) {
+  return function ($this, el, fromIndex) {
+    var O = toIObject($this);
+    var length = toLength(O.length);
+    var index = toAbsoluteIndex(fromIndex, length);
+    var value;
+    // Array#includes uses SameValueZero equality algorithm
+    // eslint-disable-next-line no-self-compare
+    if (IS_INCLUDES && el != el) while (length > index) {
+      value = O[index++];
+      // eslint-disable-next-line no-self-compare
+      if (value != value) return true;
+    // Array#indexOf ignores holes, Array#includes - not
+    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
+      if (O[index] === el) return IS_INCLUDES || index || 0;
+    } return !IS_INCLUDES && -1;
+  };
+};
+
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.15 ToLength
+var toInteger = __webpack_require__(15);
+var min = Math.min;
+module.exports = function (it) {
+  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
+};
+
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(15);
+var max = Math.max;
+var min = Math.min;
+module.exports = function (index, length) {
+  index = toInteger(index);
+  return index < 0 ? max(index + length, 0) : min(index, length);
+};
+
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var document = __webpack_require__(0).document;
+module.exports = document && document.documentElement;
+
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
+var has = __webpack_require__(1);
+var toObject = __webpack_require__(57);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+var ObjectProto = Object.prototype;
+
+module.exports = Object.getPrototypeOf || function (O) {
+  O = toObject(O);
+  if (has(O, IE_PROTO)) return O[IE_PROTO];
+  if (typeof O.constructor == 'function' && O instanceof O.constructor) {
+    return O.constructor.prototype;
+  } return O instanceof Object ? ObjectProto : null;
+};
+
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.13 ToObject(argument)
+var defined = __webpack_require__(16);
+module.exports = function (it) {
+  return Object(defined(it));
+};
+
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(59);
+var global = __webpack_require__(0);
+var hide = __webpack_require__(2);
+var Iterators = __webpack_require__(18);
+var TO_STRING_TAG = __webpack_require__(6)('toStringTag');
+
+var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +
+  'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +
+  'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +
+  'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +
+  'TextTrackList,TouchList').split(',');
+
+for (var i = 0; i < DOMIterables.length; i++) {
+  var NAME = DOMIterables[i];
+  var Collection = global[NAME];
+  var proto = Collection && Collection.prototype;
+  if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
+  Iterators[NAME] = Iterators.Array;
+}
+
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var addToUnscopables = __webpack_require__(60);
+var step = __webpack_require__(61);
+var Iterators = __webpack_require__(18);
+var toIObject = __webpack_require__(5);
+
+// 22.1.3.4 Array.prototype.entries()
+// 22.1.3.13 Array.prototype.keys()
+// 22.1.3.29 Array.prototype.values()
+// 22.1.3.30 Array.prototype[@@iterator]()
+module.exports = __webpack_require__(27)(Array, 'Array', function (iterated, kind) {
+  this._t = toIObject(iterated); // target
+  this._i = 0;                   // next index
+  this._k = kind;                // kind
+// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
+}, function () {
+  var O = this._t;
+  var kind = this._k;
+  var index = this._i++;
+  if (!O || index >= O.length) {
+    this._t = undefined;
+    return step(1);
+  }
+  if (kind == 'keys') return step(0, index);
+  if (kind == 'values') return step(0, O[index]);
+  return step(0, [index, O[index]]);
+}, 'values');
+
+// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
+Iterators.Arguments = Iterators.Array;
+
+addToUnscopables('keys');
+addToUnscopables('values');
+addToUnscopables('entries');
+
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports) {
+
+module.exports = function () { /* empty */ };
+
+
+/***/ }),
+/* 61 */
+/***/ (function(module, exports) {
+
+module.exports = function (done, value) {
+  return { value: value, done: !!done };
+};
+
+
+/***/ }),
+/* 62 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(63), __esModule: true };
+
+/***/ }),
+/* 63 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(64);
+__webpack_require__(70);
+__webpack_require__(71);
+__webpack_require__(72);
+module.exports = __webpack_require__(7).Symbol;
+
+
+/***/ }),
+/* 64 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// ECMAScript 6 symbols shim
+var global = __webpack_require__(0);
+var has = __webpack_require__(1);
+var DESCRIPTORS = __webpack_require__(4);
+var $export = __webpack_require__(28);
+var redefine = __webpack_require__(31);
+var META = __webpack_require__(65).KEY;
+var $fails = __webpack_require__(11);
+var shared = __webpack_require__(21);
+var setToStringTag = __webpack_require__(23);
+var uid = __webpack_require__(13);
+var wks = __webpack_require__(6);
+var wksExt = __webpack_require__(24);
+var wksDefine = __webpack_require__(25);
+var enumKeys = __webpack_require__(66);
+var isArray = __webpack_require__(67);
+var anObject = __webpack_require__(10);
+var isObject = __webpack_require__(8);
+var toIObject = __webpack_require__(5);
+var toPrimitive = __webpack_require__(17);
+var createDesc = __webpack_require__(12);
+var _create = __webpack_require__(32);
+var gOPNExt = __webpack_require__(68);
+var $GOPD = __webpack_require__(69);
+var $DP = __webpack_require__(3);
+var $keys = __webpack_require__(19);
+var gOPD = $GOPD.f;
+var dP = $DP.f;
+var gOPN = gOPNExt.f;
+var $Symbol = global.Symbol;
+var $JSON = global.JSON;
+var _stringify = $JSON && $JSON.stringify;
+var PROTOTYPE = 'prototype';
+var HIDDEN = wks('_hidden');
+var TO_PRIMITIVE = wks('toPrimitive');
+var isEnum = {}.propertyIsEnumerable;
+var SymbolRegistry = shared('symbol-registry');
+var AllSymbols = shared('symbols');
+var OPSymbols = shared('op-symbols');
+var ObjectProto = Object[PROTOTYPE];
+var USE_NATIVE = typeof $Symbol == 'function';
+var QObject = global.QObject;
+// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
+var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
+
+// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
+var setSymbolDesc = DESCRIPTORS && $fails(function () {
+  return _create(dP({}, 'a', {
+    get: function () { return dP(this, 'a', { value: 7 }).a; }
+  })).a != 7;
+}) ? function (it, key, D) {
+  var protoDesc = gOPD(ObjectProto, key);
+  if (protoDesc) delete ObjectProto[key];
+  dP(it, key, D);
+  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
+} : dP;
+
+var wrap = function (tag) {
+  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
+  sym._k = tag;
+  return sym;
+};
+
+var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {
+  return typeof it == 'symbol';
+} : function (it) {
+  return it instanceof $Symbol;
+};
+
+var $defineProperty = function defineProperty(it, key, D) {
+  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
+  anObject(it);
+  key = toPrimitive(key, true);
+  anObject(D);
+  if (has(AllSymbols, key)) {
+    if (!D.enumerable) {
+      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
+      it[HIDDEN][key] = true;
+    } else {
+      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
+      D = _create(D, { enumerable: createDesc(0, false) });
+    } return setSymbolDesc(it, key, D);
+  } return dP(it, key, D);
+};
+var $defineProperties = function defineProperties(it, P) {
+  anObject(it);
+  var keys = enumKeys(P = toIObject(P));
+  var i = 0;
+  var l = keys.length;
+  var key;
+  while (l > i) $defineProperty(it, key = keys[i++], P[key]);
+  return it;
+};
+var $create = function create(it, P) {
+  return P === undefined ? _create(it) : $defineProperties(_create(it), P);
+};
+var $propertyIsEnumerable = function propertyIsEnumerable(key) {
+  var E = isEnum.call(this, key = toPrimitive(key, true));
+  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
+  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
+};
+var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
+  it = toIObject(it);
+  key = toPrimitive(key, true);
+  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
+  var D = gOPD(it, key);
+  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
+  return D;
+};
+var $getOwnPropertyNames = function getOwnPropertyNames(it) {
+  var names = gOPN(toIObject(it));
+  var result = [];
+  var i = 0;
+  var key;
+  while (names.length > i) {
+    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
+  } return result;
+};
+var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
+  var IS_OP = it === ObjectProto;
+  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
+  var result = [];
+  var i = 0;
+  var key;
+  while (names.length > i) {
+    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
+  } return result;
+};
+
+// 19.4.1.1 Symbol([description])
+if (!USE_NATIVE) {
+  $Symbol = function Symbol() {
+    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
+    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
+    var $set = function (value) {
+      if (this === ObjectProto) $set.call(OPSymbols, value);
+      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+      setSymbolDesc(this, tag, createDesc(1, value));
+    };
+    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
+    return wrap(tag);
+  };
+  redefine($Symbol[PROTOTYPE], 'toString', function toString() {
+    return this._k;
+  });
+
+  $GOPD.f = $getOwnPropertyDescriptor;
+  $DP.f = $defineProperty;
+  __webpack_require__(36).f = gOPNExt.f = $getOwnPropertyNames;
+  __webpack_require__(26).f = $propertyIsEnumerable;
+  __webpack_require__(35).f = $getOwnPropertySymbols;
+
+  if (DESCRIPTORS && !__webpack_require__(9)) {
+    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
+  }
+
+  wksExt.f = function (name) {
+    return wrap(wks(name));
+  };
+}
+
+$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });
+
+for (var es6Symbols = (
+  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
+  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
+).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);
+
+for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);
+
+$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
+  // 19.4.2.1 Symbol.for(key)
+  'for': function (key) {
+    return has(SymbolRegistry, key += '')
+      ? SymbolRegistry[key]
+      : SymbolRegistry[key] = $Symbol(key);
+  },
+  // 19.4.2.5 Symbol.keyFor(sym)
+  keyFor: function keyFor(sym) {
+    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
+    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
+  },
+  useSetter: function () { setter = true; },
+  useSimple: function () { setter = false; }
+});
+
+$export($export.S + $export.F * !USE_NATIVE, 'Object', {
+  // 19.1.2.2 Object.create(O [, Properties])
+  create: $create,
+  // 19.1.2.4 Object.defineProperty(O, P, Attributes)
+  defineProperty: $defineProperty,
+  // 19.1.2.3 Object.defineProperties(O, Properties)
+  defineProperties: $defineProperties,
+  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
+  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
+  // 19.1.2.7 Object.getOwnPropertyNames(O)
+  getOwnPropertyNames: $getOwnPropertyNames,
+  // 19.1.2.8 Object.getOwnPropertySymbols(O)
+  getOwnPropertySymbols: $getOwnPropertySymbols
+});
+
+// 24.3.2 JSON.stringify(value [, replacer [, space]])
+$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
+  var S = $Symbol();
+  // MS Edge converts symbol values to JSON as {}
+  // WebKit converts symbol values to JSON as null
+  // V8 throws on boxed symbols
+  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
+})), 'JSON', {
+  stringify: function stringify(it) {
+    var args = [it];
+    var i = 1;
+    var replacer, $replacer;
+    while (arguments.length > i) args.push(arguments[i++]);
+    $replacer = replacer = args[1];
+    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
+    if (!isArray(replacer)) replacer = function (key, value) {
+      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
+      if (!isSymbol(value)) return value;
+    };
+    args[1] = replacer;
+    return _stringify.apply($JSON, args);
+  }
+});
+
+// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
+$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(2)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
+// 19.4.3.5 Symbol.prototype[@@toStringTag]
+setToStringTag($Symbol, 'Symbol');
+// 20.2.1.9 Math[@@toStringTag]
+setToStringTag(Math, 'Math', true);
+// 24.3.3 JSON[@@toStringTag]
+setToStringTag(global.JSON, 'JSON', true);
+
+
+/***/ }),
+/* 65 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var META = __webpack_require__(13)('meta');
+var isObject = __webpack_require__(8);
+var has = __webpack_require__(1);
+var setDesc = __webpack_require__(3).f;
+var id = 0;
+var isExtensible = Object.isExtensible || function () {
+  return true;
+};
+var FREEZE = !__webpack_require__(11)(function () {
+  return isExtensible(Object.preventExtensions({}));
+});
+var setMeta = function (it) {
+  setDesc(it, META, { value: {
+    i: 'O' + ++id, // object ID
+    w: {}          // weak collections IDs
+  } });
+};
+var fastKey = function (it, create) {
+  // return primitive with prefix
+  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+  if (!has(it, META)) {
+    // can't set metadata to uncaught frozen object
+    if (!isExtensible(it)) return 'F';
+    // not necessary to add metadata
+    if (!create) return 'E';
+    // add missing metadata
+    setMeta(it);
+  // return object ID
+  } return it[META].i;
+};
+var getWeak = function (it, create) {
+  if (!has(it, META)) {
+    // can't set metadata to uncaught frozen object
+    if (!isExtensible(it)) return true;
+    // not necessary to add metadata
+    if (!create) return false;
+    // add missing metadata
+    setMeta(it);
+  // return hash weak collections IDs
+  } return it[META].w;
+};
+// add metadata on freeze-family methods calling
+var onFreeze = function (it) {
+  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
+  return it;
+};
+var meta = module.exports = {
+  KEY: META,
+  NEED: false,
+  fastKey: fastKey,
+  getWeak: getWeak,
+  onFreeze: onFreeze
+};
+
+
+/***/ }),
+/* 66 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// all enumerable object keys, includes symbols
+var getKeys = __webpack_require__(19);
+var gOPS = __webpack_require__(35);
+var pIE = __webpack_require__(26);
+module.exports = function (it) {
+  var result = getKeys(it);
+  var getSymbols = gOPS.f;
+  if (getSymbols) {
+    var symbols = getSymbols(it);
+    var isEnum = pIE.f;
+    var i = 0;
+    var key;
+    while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
+  } return result;
+};
+
+
+/***/ }),
+/* 67 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.2.2 IsArray(argument)
+var cof = __webpack_require__(34);
+module.exports = Array.isArray || function isArray(arg) {
+  return cof(arg) == 'Array';
+};
+
+
+/***/ }),
+/* 68 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
+var toIObject = __webpack_require__(5);
+var gOPN = __webpack_require__(36).f;
+var toString = {}.toString;
+
+var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
+  ? Object.getOwnPropertyNames(window) : [];
+
+var getWindowNames = function (it) {
+  try {
+    return gOPN(it);
+  } catch (e) {
+    return windowNames.slice();
+  }
+};
+
+module.exports.f = function getOwnPropertyNames(it) {
+  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
+};
+
+
+/***/ }),
+/* 69 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var pIE = __webpack_require__(26);
+var createDesc = __webpack_require__(12);
+var toIObject = __webpack_require__(5);
+var toPrimitive = __webpack_require__(17);
+var has = __webpack_require__(1);
+var IE8_DOM_DEFINE = __webpack_require__(29);
+var gOPD = Object.getOwnPropertyDescriptor;
+
+exports.f = __webpack_require__(4) ? gOPD : function getOwnPropertyDescriptor(O, P) {
+  O = toIObject(O);
+  P = toPrimitive(P, true);
+  if (IE8_DOM_DEFINE) try {
+    return gOPD(O, P);
+  } catch (e) { /* empty */ }
+  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
+};
+
+
+/***/ }),
+/* 70 */
+/***/ (function(module, exports) {
+
+
+
+/***/ }),
+/* 71 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(25)('asyncIterator');
+
+
+/***/ }),
+/* 72 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(25)('observable');
+
+
+/***/ }),
+/* 73 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(74)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(75)
+
+/* template */
+var __vue_template__ = __webpack_require__(80)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+  typeof __vue_exports__.default === "object" ||
+  typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+  __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/pages/examples/Examples.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-694b6655"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+  for (var name in module) {
+    __vue_options__.style[name] = module[name]
+  }
+})
+if (typeof __register_static_styles__ === "function") {
+  __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 74 */
+/***/ (function(module, exports) {
+
+module.exports = {
+  "example-list": {
+    "width": "750",
+    "position": "absolute",
+    "top": 0,
+    "bottom": "100",
+    "backgroundColor": "#F5F5F5"
+  },
+  "group-info": {
+    "backgroundColor": "#FFFFFF"
+  },
+  "loading": {
+    "flex": 1,
+    "justifyContent": "center",
+    "alignItems": "center"
+  },
+  "loading-text": {
+    "fontSize": "60",
+    "color": "#BBBBBB"
+  },
+  "group-title": {
+    "width": "750",
+    "paddingTop": "20",
+    "paddingBottom": "35",
+    "fontSize": "40",
+    "textAlign": "center",
+    "color": "#00B4FF",
+    "backgroundImage": "linear-gradient(to bottom, #E3F5FB, #F9FEFF)"
+  },
+  "group-desc": {
+    "fontSize": "28",
+    "color": "#999999",
+    "marginTop": "10",
+    "marginLeft": "30",
+    "marginRight": "40"
+  },
+  "doc-link": {
+    "fontSize": "26",
+    "color": "rgba(0,189,255,0.6)",
+    "textAlign": "right",
+    "marginTop": "10",
+    "marginRight": "60",
+    "marginBottom": "20"
+  },
+  "section": {
+    "paddingBottom": "30"
+  },
+  "tabbar": {
+    "width": "750",
+    "position": "fixed",
+    "bottom": 0,
+    "height": "100",
+    "flexDirection": "row",
+    "justifyContent": "space-around",
+    "alignItems": "flex-end",
+    "backgroundColor": "#E6E6E6"
+  },
+  "tab-cell": {
+    "width": "186",
+    "height": "100",
+    "borderTopWidth": "2",
+    "borderTopStyle": "solid",
+    "borderTopColor": "#DDDDDD",
+    "justifyContent": "center",
+    "backgroundColor": "#FCFCFC",
+    "transitionProperty": "backgroundColor",
+    "transitionDuration": 200
+  },
+  "@TRANSITION": {
+    "tab-cell": {
+      "property": "backgroundColor",
+      "duration": 200
+    },
+    "tab-name": {
+      "property": "color,fontSize",
+      "duration": 100
+    }
+  },
+  "active-tab-cell": {
+    "borderTopColor": "rgba(0,189,255,0.8)",
+    "backgroundColor": "#BDECFF"
+  },
+  "tab-name": {
+    "textAlign": "center",
+    "color": "#666666",
+    "transitionProperty": "color,fontSize",
+    "transitionDuration": 100
+  },
+  "tab-name-zh": {
+    "fontSize": "36"
+  },
+  "tab-name-en": {
+    "fontSize": "30"
+  },
+  "active-tab-name-zh": {
+    "color": "#00B4FF",
+    "fontSize": "42",
+    "fontWeight": "bold"
+  },
+  "active-tab-name-en": {
+    "color": "#00B4FF",
+    "fontSize": "30",
+    "fontWeight": "bold"
+  }
+}
+
+/***/ }),
+/* 75 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _utils = __webpack_require__(14);
+
+var _ExampleScroller = __webpack_require__(76);
+
+var _ExampleScroller2 = _interopRequireDefault(_ExampleScroller);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// import getExamples from '../../examples'
+// const exampleMap = getExamples({ scope: 'mobile', filterTODO: true })
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+var exampleMap = [];
+var useStorage = false;
+exports.default = {
+  components: { ExampleScroller: _ExampleScroller2.default },
+  data: function data() {
+    return {
+      navigationBarOptions: {
+        title: {
+          zh: '使用 Weex 的例子',
+          en: 'Weex Examples'
+        }
+      },
+      examples: exampleMap,
+      showLoading: false,
+      language: 'en',
+      activeTab: 'component',
+      activeGroup: 'div',
+      dict: {
+        READ_MORE: { en: 'read more', zh: '查看更多' }
+      }
+    };
+  },
+  beforeCreate: function beforeCreate() {
+    var _this = this;
+
+    // read examples from storage
+    (0, _utils.readExamples)(function (examples) {
+      _this.examples = examples;
+      if (WXEnvironment.platform.toLowerCase() !== 'web') {
+        useStorage = true;
+      }
+    });
+
+    // update examples to storage
+    (0, _utils.fetchExamples)(function (result) {
+      (0, _utils.saveExamples)(result);
+      if (!useStorage) {
+        _this.examples = result.examples;
+      }
+    });
+
+    setTimeout(function () {
+      _this.showLoading = true;
+    }, 400);
+  },
+
+  computed: {
+    tabs: function tabs() {
+      return this.examples.map(function (group) {
+        return {
+          type: group.type,
+          name: group.name
+        };
+      });
+    },
+    currentTab: function currentTab() {
+      var _this2 = this;
+
+      return this.examples.filter(function (tab) {
+        return tab.type === _this2.activeTab;
+      })[0];
+    }
+  },
+  methods: {
+    toggleTab: function toggleTab(tabType) {
+      this.activeTab = tabType;
+      this.activeGroup = this.currentTab.group[0].type;
+    }
+  }
+};
+
+/***/ }),
+/* 76 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(77)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(78)
+
+/* template */
+var __vue_template__ = __webpack_require__(79)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+  typeof __vue_exports__.default === "object" ||
+  typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+  __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/components/ExampleScroller.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-1f23e14a"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+  for (var name in module) {
+    __vue_options__.style[name] = module[name]
+  }
+})
+if (typeof __register_static_styles__ === "function") {
+  __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 77 */
+/***/ (function(module, exports) {
+
+module.exports = {
+  "scroller": {
+    "flexDirection": "row",
+    "backgroundColor": "#FDFDFD",
+    "paddingTop": "20",
+    "paddingRight": "20",
+    "paddingBottom": "20",
+    "paddingLeft": "20",
+    "height": "600"
+  },
+  "example-box": {
+    "justifyContent": "space-between",
+    "alignItems": "center",
+    "paddingLeft": "6",
+    "paddingRight": "6",
+    "width": "310"
+  },
+  "screenshot": {
+    "width": "270",
+    "height": "422",
+    "borderWidth": "1",
+    "borderColor": "#DDDDDD"
+  },
+  "title": {
+    "height": "75",
+    "justifyContent": "center"
+  },
+  "title-text": {
+    "fontSize": "32",
+    "textAlign": "center",
+    "color": "#606060",
+    "paddingTop": "10",
+    "paddingBottom": "10"
+  },
+  "example-tips": {
+    "fontSize": "28",
+    "textAlign": "center",
+    "color": "#A5A5A5",
+    "paddingTop": "10",
+    "paddingBottom": "10"
+  }
+}
+
+/***/ }),
+/* 78 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _utils = __webpack_require__(14);
+
+exports.default = {
+  methods: { viewSource: _utils.viewSource },
+  props: {
+    language: {
+      type: String,
+      default: 'en'
+    },
+    examples: {
+      type: Array,
+      required: true
+    }
+  },
+  data: function data() {
+    return {
+      VIEW_SOURCE: {
+        en: 'view source',
+        zh: '查看源码'
+      }
+    };
+  }
+}; //
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+/***/ }),
+/* 79 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+  return _c('scroller', {
+    staticClass: ["scroller"],
+    attrs: {
+      "scrollDirection": "horizontal"
+    }
+  }, _vm._l((_vm.examples), function(example, i) {
+    return _c('div', {
+      key: i,
+      staticClass: ["example-box"]
+    }, [_c('div', {
+      staticClass: ["title"]
+    }, [_c('text', {
+      staticClass: ["title-text"]
+    }, [_vm._v(_vm._s(_vm.i18n(example.title)))])]), _c('div', {
+      staticStyle: {
+        alignItems: "center"
+      }
+    }, [_c('a', {
+      attrs: {
+        "href": _vm._f("url")(_vm.i18n(example.hash))
+      }
+    }, [_c('image', {
+      staticClass: ["screenshot"],
+      attrs: {
+        "src": _vm.i18n(example.screenshot)
+      }
+    })]), _c('text', {
+      staticClass: ["example-tips"],
+      on: {
+        "click": function($event) {
+          _vm.viewSource(_vm.i18n(example.hash))
+        }
+      }
+    }, [_vm._v(_vm._s(_vm.i18n(_vm.VIEW_SOURCE)))])])])
+  }))
+},staticRenderFns: []}
+module.exports.render._withStripped = true
+
+/***/ }),
+/* 80 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+  return _c('div', {
+    staticClass: ["wrapper"]
+  }, [(_vm.examples && _vm.examples.length) ? _c('list', {
+    staticClass: ["example-list"]
+  }, [_vm._l((_vm.currentTab.group), function(exampleGroup) {
+    return [(exampleGroup && exampleGroup.title || exampleGroup.name) ? _c('cell', {
+      key: exampleGroup.type,
+      ref: exampleGroup.type,
+      refInFor: true,
+      staticClass: ["group-info"],
+      appendAsTree: true,
+      attrs: {
+        "append": "tree"
+      }
+    }, [_c('text', {
+      staticClass: ["group-title"]
+    }, [_vm._v(_vm._s(_vm.i18n(exampleGroup.title || exampleGroup.name)))]), (exampleGroup.desc) ? _c('text', {
+      staticClass: ["group-desc"]
+    }, [_vm._v(_vm._s(_vm.i18n(exampleGroup.desc)))]) : _vm._e(), (exampleGroup.desc && exampleGroup.docLink) ? _c('text', {
+      staticClass: ["doc-link"],
+      on: {
+        "click": function($event) {
+          _vm.jumpTo(_vm.i18n(exampleGroup.docLink))
+        }
+      }
+    }, [_vm._v(_vm._s(_vm.i18n(_vm.dict.READ_MORE)) + " >>")]) : _vm._e()]) : _vm._e(), _c('cell', {
+      key: exampleGroup.type + '-examples',
+      staticClass: ["section"],
+      appendAsTree: true,
+      attrs: {
+        "append": "tree"
+      }
+    }, [_c('example-scroller', {
+      attrs: {
+        "language": _vm.language,
+        "examples": exampleGroup.examples
+      }
+    })], 1)]
+  })], 2) : (_vm.showLoading) ? _c('div', {
+    staticClass: ["loading"]
+  }, [_c('text', {
+    staticClass: ["loading-text"]
+  }, [_vm._v("loading ...")])]) : _vm._e(), (_vm.tabs && _vm.tabs.length) ? _c('div', {
+    staticClass: ["tabbar"]
+  }, _vm._l((_vm.tabs), function(tab) {
+    return _c('div', {
+      key: tab.type,
+      class: ['tab-cell', tab.type === _vm.activeTab ? 'active-tab-cell' : ''],
+      on: {
+        "click": function($event) {
+          _vm.toggleTab(tab.type)
+        }
+      }
+    }, [_c('text', {
+      class: [
+        'tab-name',
+        ("tab-name-" + _vm.language),
+        tab.type === _vm.activeTab ? ("active-tab-name-" + _vm.language) : ''
+      ]
+    }, [_vm._v(_vm._s(_vm.i18n(tab.name)))])])
+  })) : _vm._e()])
+},staticRenderFns: []}
+module.exports.render._withStripped = true
+
+/***/ })
+/******/ ]);
\ No newline at end of file
diff --git a/ios/bundlejs/guide.weex.js b/ios/bundlejs/guide.weex.js
new file mode 100644
index 0000000..aad4993
--- /dev/null
+++ b/ios/bundlejs/guide.weex.js
@@ -0,0 +1,3191 @@
+// { "framework": "Vue" }
+"use weex:vue";
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, {
+/******/ 				configurable: false,
+/******/ 				enumerable: true,
+/******/ 				get: getter
+/******/ 			});
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = 37);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+var global = module.exports = typeof window != 'undefined' && window.Math == Math
+  ? window : typeof self != 'undefined' && self.Math == Math ? self
+  // eslint-disable-next-line no-new-func
+  : Function('return this')();
+if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(10);
+var IE8_DOM_DEFINE = __webpack_require__(29);
+var toPrimitive = __webpack_require__(17);
+var dP = Object.defineProperty;
+
+exports.f = __webpack_require__(2) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
+  anObject(O);
+  P = toPrimitive(P, true);
+  anObject(Attributes);
+  if (IE8_DOM_DEFINE) try {
+    return dP(O, P, Attributes);
+  } catch (e) { /* empty */ }
+  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
+  if ('value' in Attributes) O[P] = Attributes.value;
+  return O;
+};
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// Thank's IE8 for his funny defineProperty
+module.exports = !__webpack_require__(11)(function () {
+  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports) {
+
+var hasOwnProperty = {}.hasOwnProperty;
+module.exports = function (it, key) {
+  return hasOwnProperty.call(it, key);
+};
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports) {
+
+var core = module.exports = { version: '2.5.7' };
+if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(1);
+var createDesc = __webpack_require__(12);
+module.exports = __webpack_require__(2) ? function (object, key, value) {
+  return dP.f(object, key, createDesc(1, value));
+} : function (object, key, value) {
+  object[key] = value;
+  return object;
+};
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// to indexed object, toObject with fallback for non-array-like ES3 strings
+var IObject = __webpack_require__(51);
+var defined = __webpack_require__(15);
+module.exports = function (it) {
+  return IObject(defined(it));
+};
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var store = __webpack_require__(21)('wks');
+var uid = __webpack_require__(13);
+var Symbol = __webpack_require__(0).Symbol;
+var USE_SYMBOL = typeof Symbol == 'function';
+
+var $exports = module.exports = function (name) {
+  return store[name] || (store[name] =
+    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
+};
+
+$exports.store = store;
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+  return typeof it === 'object' ? it !== null : typeof it === 'function';
+};
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports) {
+
+module.exports = true;
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+module.exports = function (it) {
+  if (!isObject(it)) throw TypeError(it + ' is not an object!');
+  return it;
+};
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports) {
+
+module.exports = function (exec) {
+  try {
+    return !!exec();
+  } catch (e) {
+    return true;
+  }
+};
+
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports) {
+
+module.exports = function (bitmap, value) {
+  return {
+    enumerable: !(bitmap & 1),
+    configurable: !(bitmap & 2),
+    writable: !(bitmap & 4),
+    value: value
+  };
+};
+
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports) {
+
+var id = 0;
+var px = Math.random();
+module.exports = function (key) {
+  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
+};
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports) {
+
+// 7.1.4 ToInteger
+var ceil = Math.ceil;
+var floor = Math.floor;
+module.exports = function (it) {
+  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+};
+
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports) {
+
+// 7.2.1 RequireObjectCoercible(argument)
+module.exports = function (it) {
+  if (it == undefined) throw TypeError("Can't call method on  " + it);
+  return it;
+};
+
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(4);
+var ctx = __webpack_require__(47);
+var hide = __webpack_require__(5);
+var has = __webpack_require__(3);
+var PROTOTYPE = 'prototype';
+
+var $export = function (type, name, source) {
+  var IS_FORCED = type & $export.F;
+  var IS_GLOBAL = type & $export.G;
+  var IS_STATIC = type & $export.S;
+  var IS_PROTO = type & $export.P;
+  var IS_BIND = type & $export.B;
+  var IS_WRAP = type & $export.W;
+  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
+  var expProto = exports[PROTOTYPE];
+  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];
+  var key, own, out;
+  if (IS_GLOBAL) source = name;
+  for (key in source) {
+    // contains in native
+    own = !IS_FORCED && target && target[key] !== undefined;
+    if (own && has(exports, key)) continue;
+    // export native or passed
+    out = own ? target[key] : source[key];
+    // prevent global pollution for namespaces
+    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
+    // bind timers to global for call from export context
+    : IS_BIND && own ? ctx(out, global)
+    // wrap global constructors for prevent change them in library
+    : IS_WRAP && target[key] == out ? (function (C) {
+      var F = function (a, b, c) {
+        if (this instanceof C) {
+          switch (arguments.length) {
+            case 0: return new C();
+            case 1: return new C(a);
+            case 2: return new C(a, b);
+          } return new C(a, b, c);
+        } return C.apply(this, arguments);
+      };
+      F[PROTOTYPE] = C[PROTOTYPE];
+      return F;
+    // make static versions for prototype methods
+    })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
+    // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
+    if (IS_PROTO) {
+      (exports.virtual || (exports.virtual = {}))[key] = out;
+      // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
+      if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);
+    }
+  }
+};
+// type bitmap
+$export.F = 1;   // forced
+$export.G = 2;   // global
+$export.S = 4;   // static
+$export.P = 8;   // proto
+$export.B = 16;  // bind
+$export.W = 32;  // wrap
+$export.U = 64;  // safe
+$export.R = 128; // real proto method for `library`
+module.exports = $export;
+
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.1 ToPrimitive(input [, PreferredType])
+var isObject = __webpack_require__(8);
+// instead of the ES6 spec version, we didn't implement @@toPrimitive case
+// and the second argument - flag - preferred type is a string
+module.exports = function (it, S) {
+  if (!isObject(it)) return it;
+  var fn, val;
+  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
+  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+  throw TypeError("Can't convert object to primitive value");
+};
+
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports) {
+
+module.exports = {};
+
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.14 / 15.2.3.14 Object.keys(O)
+var $keys = __webpack_require__(33);
+var enumBugKeys = __webpack_require__(22);
+
+module.exports = Object.keys || function keys(O) {
+  return $keys(O, enumBugKeys);
+};
+
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var shared = __webpack_require__(21)('keys');
+var uid = __webpack_require__(13);
+module.exports = function (key) {
+  return shared[key] || (shared[key] = uid(key));
+};
+
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(4);
+var global = __webpack_require__(0);
+var SHARED = '__core-js_shared__';
+var store = global[SHARED] || (global[SHARED] = {});
+
+(module.exports = function (key, value) {
+  return store[key] || (store[key] = value !== undefined ? value : {});
+})('versions', []).push({
+  version: core.version,
+  mode: __webpack_require__(9) ? 'pure' : 'global',
+  copyright: '© 2018 Denis Pushkarev (zloirock.ru)'
+});
+
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports) {
+
+// IE 8- don't enum bug keys
+module.exports = (
+  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
+).split(',');
+
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var def = __webpack_require__(1).f;
+var has = __webpack_require__(3);
+var TAG = __webpack_require__(7)('toStringTag');
+
+module.exports = function (it, tag, stat) {
+  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
+};
+
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {
+
+exports.f = __webpack_require__(7);
+
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(4);
+var LIBRARY = __webpack_require__(9);
+var wksExt = __webpack_require__(24);
+var defineProperty = __webpack_require__(1).f;
+module.exports = function (name) {
+  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
+  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
+};
+
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports) {
+
+exports.f = {}.propertyIsEnumerable;
+
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.fetchNews = exports.fetchDoodle = exports.readAbout = exports.saveAbout = exports.fetchAbout = exports.readGuide = exports.saveGuide = exports.fetchGuide = exports.readExamples = exports.saveExamples = exports.fetchExamples = undefined;
+
+var _stringify = __webpack_require__(40);
+
+var _stringify2 = _interopRequireDefault(_stringify);
+
+var _typeof2 = __webpack_require__(42);
+
+var _typeof3 = _interopRequireDefault(_typeof2);
+
+exports.createLink = createLink;
+exports.createURL = createURL;
+exports.i18n = i18n;
+exports.parseLanguage = parseLanguage;
+exports.setLanguage = setLanguage;
+exports.clearStorageLanguage = clearStorageLanguage;
+exports.getStorageLanguage = getStorageLanguage;
+exports.getSystemLanguage = getSystemLanguage;
+exports.getLanguage = getLanguage;
+exports.jumpTo = jumpTo;
+exports.viewSource = viewSource;
+exports.setTitleBar = setTitleBar;
+exports.fetchData = fetchData;
+exports.saveData = saveData;
+exports.readData = readData;
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var stream = weex.requireModule('stream');
+var storage = weex.requireModule('storage');
+var navigator = weex.requireModule('navigator');
+
+var encoder = typeof encodeURIComponent === 'function' ? encodeURIComponent : typeof encodeURI === 'function' ? encodeURI : function (x) {
+  return x;
+};
+
+function encodeParams(params) {
+  if (!params || (typeof params === 'undefined' ? 'undefined' : (0, _typeof3.default)(params)) !== 'object') {
+    return '';
+  }
+  var array = [];
+  for (var key in params) {
+    if (typeof params[key] === 'string') {
+      array.push(encoder(key) + '=' + encoder(params[key]));
+    }
+  }
+  return array.join('&');
+}
+
+function createLink(name) {
+  var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+  var args = [];
+  for (var key in params) {
+    if (typeof params[key] === 'string') {
+      args.push(encoder(key) + '=' + encoder(params[key]));
+    }
+  }
+  if (WXEnvironment.platform === 'Web') {
+    args.unshift('page=' + name + '.web.js');
+    return '/?' + args.join('&');
+  }
+  var base = getBaseURL();
+  return '' + base + name + '.weex.js' + (args.length ? '?' + args.join('&') : '');
+}
+
+function createURL(hash, params) {
+  if (WXEnvironment.platform === 'Web') {
+    return 'http://dotwe.org/raw/htmlVue/' + hash;
+  }
+  var url = 'http://dotwe.org/raw/dist/' + hash + '.bundle.wx';
+  var paramString = encodeParams(params);
+  if (WXEnvironment.appName === 'TB') {
+    return url + '?_wx_tpl=' + url + '&' + paramString;
+  }
+  if (WXEnvironment.appName === 'WXSample') {
+    return url + '?' + paramString;
+  }
+  return url + '?wx_weex=true&' + paramString;
+}
+
+function getBaseURL() {
+  var bundleUrl = weex.config.bundleUrl;
+  var isAndroidAssets = bundleUrl.indexOf('your_current_IP') >= 0 || bundleUrl.indexOf('file://assets/') >= 0;
+  var isiOSAssets = bundleUrl.indexOf('file:///') >= 0 && bundleUrl.indexOf('WeexDemo.app') > 0;
+  if (isAndroidAssets) {
+    return 'file://assets/';
+  } else if (isiOSAssets) {
+    // file:///var/mobile/Containers/Bundle/Application/{id}/WeexDemo.app/
+    // file:///Users/{user}/Library/Developer/CoreSimulator/Devices/{id}/data/Containers/Bundle/Application/{id}/WeexDemo.app/
+    return bundleUrl.substring(0, bundleUrl.lastIndexOf('/') + 1);
+  }
+  return '';
+}
+
+function i18n(text, language) {
+  if (typeof text === 'string') {
+    return text;
+  }
+  if (Object.prototype.toString.call(text) === '[object Object]') {
+    var lang = this && this.language || language || 'en';
+    return text[lang];
+  }
+}
+
+var supportedLanguageRE = /(en|zh)\_?\w*/i;
+function parseLanguage(language) {
+  var match = supportedLanguageRE.exec(language + '');
+  if (match && match[1]) {
+    return match[1];
+  }
+  return '';
+}
+
+function setLanguage(language) {
+  var lang = parseLanguage(language);
+  if (lang) {
+    storage.setItem('WEEX_PLAYGROUND_LANGUAGE', lang);
+  }
+}
+
+function clearStorageLanguage() {
+  storage.removeItem('WEEX_PLAYGROUND_LANGUAGE');
+}
+
+function getStorageLanguage(done) {
+  var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+  if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+    return;
+  }
+  try {
+    storage.getItem('WEEX_PLAYGROUND_LANGUAGE', function (event) {
+      if (event.result === 'success') {
+        var lang = parseLanguage(event.data);
+        lang ? done(lang) : fail();
+      } else {
+        fail(event);
+      }
+    });
+  } catch (err) {
+    fail(err);
+  }
+}
+
+function getSystemLanguage(done) {
+  var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+  if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+    return;
+  }
+  if (WXEnvironment.platform.toLowerCase() === 'web') {
+    var lang = parseLanguage(window.navigator.language);
+    lang ? done(lang) : fail();
+  } else {
+    try {
+      var locale = weex.requireModule('locale') || weex.requireModule('local');
+      var useSync = false;
+      var resSync = locale.getLanguage(function (language) {
+        var lang = parseLanguage(language);
+        if (lang) {
+          useSync || done(lang);
+        } else {
+          fail();
+        }
+      });
+      var langSync = parseLanguage(resSync);
+      if (langSync) {
+        useSync = true;
+        done(langSync);
+      } else {
+        fail();
+      }
+    } catch (e) {
+      fail(e);
+    }
+  }
+}
+
+var languageRE = /.+[\?\&]{1}language=([\d\w]+)[\?\&]?.*/i;
+function getLanguage() {
+  var done = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
+
+  var match = languageRE.exec(weex.config.bundleUrl || '');
+  var lang = parseLanguage(match && match[1]);
+  if (lang) {
+    done(lang);
+  } else {
+    getStorageLanguage(done, function () {
+      getSystemLanguage(done, function () {
+        done('en');
+      });
+    });
+  }
+}
+
+function jumpTo(url, title, lang) {
+  getLanguage(function (language) {
+    storage.setItem('CURRENT_DOCUMENT_URL', i18n(url, lang || language));
+    navigator.push({
+      url: createURL('bf0305c14b511b24a4e616f53926432b', { language: language, title: i18n(title, lang || language) })
+    });
+  });
+}
+
+function viewSource(hash) {
+  getLanguage(function (language) {
+    navigator.push({
+      url: createURL('f6ce29faf686eabc38b410bf4828fa5a', { hash: hash, language: language })
+    });
+  });
+}
+
+function setTitleBar(options) {
+  var language = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en';
+
+  if (Object.prototype.toString.apply(options) !== '[object Object]') {
+    return;
+  }
+  var titleBar = weex.requireModule('titleBar');
+  if (options.color || options.backgroundColor) {
+    try {
+      titleBar.setStyle({
+        foregroundColor: options.color || '#FFFFFF',
+        backgroundColor: options.backgroundColor || '#00B4FF'
+      });
+    } catch (e) {}
+  }
+  var title = i18n(options.title, language);
+  if (title) {
+    try {
+      titleBar.setTitle(title);
+    } catch (e) {}
+  }
+}
+
+var storageKeys = {
+  doodle: 'WEEX_PLAYGROUND_APP_DOODLE',
+  guide: 'WEEX_PLAYGROUND_APP_GUIDE',
+  examples: 'WEEX_PLAYGROUND_APP_EXAMPLES',
+  news: 'WEEX_PLAYGROUND_APP_NEWS',
+  about: 'WEEX_PLAYGROUND_APP_ABOUT'
+};
+function fetchData(name) {
+  var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+  var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+  try {
+    stream.fetch({
+      url: 'http://dotwe.org/query/weex-playground-app',
+      method: 'post',
+      headers: {
+        'Content-Type': 'application/x-www-form-urlencoded'
+      },
+      type: 'json',
+      body: 'name=' + name
+    }, function (res) {
+      if (res.ok && res.data && res.data.success) {
+        done(res.data);
+      } else {
+        fail(res);
+      }
+    });
+  } catch (err) {
+    fail(err);
+  }
+}
+function saveData(name, result) {
+  var key = storageKeys[name];
+  if (!key) return;
+  if (result && (typeof result === 'undefined' ? 'undefined' : (0, _typeof3.default)(result)) === 'object') {
+    result.timestamp = Date.now();
+    storage.setItem(key, (0, _stringify2.default)(result));
+  }
+}
+function readData(name) {
+  var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+  var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+  var key = storageKeys[name];
+  if (!key) return fail();
+  try {
+    storage.getItem(key, function (event) {
+      if (event.result === 'success') {
+        var result = JSON.parse(event.data);
+        if (result && Array.isArray(result[name])) {
+          return done(result[name]);
+        }
+      }
+      fail(event);
+    });
+  } catch (e) {
+    fail(e);
+  }
+}
+
+var fetchExamples = exports.fetchExamples = function fetchExamples() {
+  for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+    args[_key] = arguments[_key];
+  }
+
+  return fetchData.apply(undefined, ['examples'].concat(args));
+};
+var saveExamples = exports.saveExamples = function saveExamples() {
+  for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+    args[_key2] = arguments[_key2];
+  }
+
+  return saveData.apply(undefined, ['examples'].concat(args));
+};
+var readExamples = exports.readExamples = function readExamples() {
+  for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+    args[_key3] = arguments[_key3];
+  }
+
+  return readData.apply(undefined, ['examples'].concat(args));
+};
+
+var fetchGuide = exports.fetchGuide = function fetchGuide() {
+  for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+    args[_key4] = arguments[_key4];
+  }
+
+  return fetchData.apply(undefined, ['guide'].concat(args));
+};
+var saveGuide = exports.saveGuide = function saveGuide() {
+  for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
+    args[_key5] = arguments[_key5];
+  }
+
+  return saveData.apply(undefined, ['guide'].concat(args));
+};
+var readGuide = exports.readGuide = function readGuide() {
+  for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
+    args[_key6] = arguments[_key6];
+  }
+
+  return readData.apply(undefined, ['guide'].concat(args));
+};
+
+var fetchAbout = exports.fetchAbout = function fetchAbout() {
+  for (var _len7 = arguments.length, args = Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
+    args[_key7] = arguments[_key7];
+  }
+
+  return fetchData.apply(undefined, ['about'].concat(args));
+};
+var saveAbout = exports.saveAbout = function saveAbout() {
+  for (var _len8 = arguments.length, args = Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
+    args[_key8] = arguments[_key8];
+  }
+
+  return saveData.apply(undefined, ['about'].concat(args));
+};
+var readAbout = exports.readAbout = function readAbout() {
+  for (var _len9 = arguments.length, args = Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
+    args[_key9] = arguments[_key9];
+  }
+
+  return readData.apply(undefined, ['about'].concat(args));
+};
+
+var fetchDoodle = exports.fetchDoodle = function fetchDoodle() {
+  for (var _len10 = arguments.length, args = Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
+    args[_key10] = arguments[_key10];
+  }
+
+  return fetchData.apply(undefined, ['doodle'].concat(args));
+};
+var fetchNews = exports.fetchNews = function fetchNews() {
+  for (var _len11 = arguments.length, args = Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
+    args[_key11] = arguments[_key11];
+  }
+
+  return fetchData.apply(undefined, ['news'].concat(args));
+};
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var LIBRARY = __webpack_require__(9);
+var $export = __webpack_require__(16);
+var redefine = __webpack_require__(31);
+var hide = __webpack_require__(5);
+var Iterators = __webpack_require__(18);
+var $iterCreate = __webpack_require__(49);
+var setToStringTag = __webpack_require__(23);
+var getPrototypeOf = __webpack_require__(56);
+var ITERATOR = __webpack_require__(7)('iterator');
+var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
+var FF_ITERATOR = '@@iterator';
+var KEYS = 'keys';
+var VALUES = 'values';
+
+var returnThis = function () { return this; };
+
+module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
+  $iterCreate(Constructor, NAME, next);
+  var getMethod = function (kind) {
+    if (!BUGGY && kind in proto) return proto[kind];
+    switch (kind) {
+      case KEYS: return function keys() { return new Constructor(this, kind); };
+      case VALUES: return function values() { return new Constructor(this, kind); };
+    } return function entries() { return new Constructor(this, kind); };
+  };
+  var TAG = NAME + ' Iterator';
+  var DEF_VALUES = DEFAULT == VALUES;
+  var VALUES_BUG = false;
+  var proto = Base.prototype;
+  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
+  var $default = $native || getMethod(DEFAULT);
+  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
+  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
+  var methods, key, IteratorPrototype;
+  // Fix native
+  if ($anyNative) {
+    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
+    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
+      // Set @@toStringTag to native iterators
+      setToStringTag(IteratorPrototype, TAG, true);
+      // fix for some old engines
+      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
+    }
+  }
+  // fix Array#{values, @@iterator}.name in V8 / FF
+  if (DEF_VALUES && $native && $native.name !== VALUES) {
+    VALUES_BUG = true;
+    $default = function values() { return $native.call(this); };
+  }
+  // Define iterator
+  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
+    hide(proto, ITERATOR, $default);
+  }
+  // Plug for library
+  Iterators[NAME] = $default;
+  Iterators[TAG] = returnThis;
+  if (DEFAULT) {
+    methods = {
+      values: DEF_VALUES ? $default : getMethod(VALUES),
+      keys: IS_SET ? $default : getMethod(KEYS),
+      entries: $entries
+    };
+    if (FORCED) for (key in methods) {
+      if (!(key in proto)) redefine(proto, key, methods[key]);
+    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
+  }
+  return methods;
+};
+
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = !__webpack_require__(2) && !__webpack_require__(11)(function () {
+  return Object.defineProperty(__webpack_require__(30)('div'), 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+var document = __webpack_require__(0).document;
+// typeof document.createElement is 'object' in old IE
+var is = isObject(document) && isObject(document.createElement);
+module.exports = function (it) {
+  return is ? document.createElement(it) : {};
+};
+
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(5);
+
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
+var anObject = __webpack_require__(10);
+var dPs = __webpack_require__(50);
+var enumBugKeys = __webpack_require__(22);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+var Empty = function () { /* empty */ };
+var PROTOTYPE = 'prototype';
+
+// Create object with fake `null` prototype: use iframe Object with cleared prototype
+var createDict = function () {
+  // Thrash, waste and sodomy: IE GC bug
+  var iframe = __webpack_require__(30)('iframe');
+  var i = enumBugKeys.length;
+  var lt = '<';
+  var gt = '>';
+  var iframeDocument;
+  iframe.style.display = 'none';
+  __webpack_require__(55).appendChild(iframe);
+  iframe.src = 'javascript:'; // eslint-disable-line no-script-url
+  // createDict = iframe.contentWindow.Object;
+  // html.removeChild(iframe);
+  iframeDocument = iframe.contentWindow.document;
+  iframeDocument.open();
+  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
+  iframeDocument.close();
+  createDict = iframeDocument.F;
+  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];
+  return createDict();
+};
+
+module.exports = Object.create || function create(O, Properties) {
+  var result;
+  if (O !== null) {
+    Empty[PROTOTYPE] = anObject(O);
+    result = new Empty();
+    Empty[PROTOTYPE] = null;
+    // add "__proto__" for Object.getPrototypeOf polyfill
+    result[IE_PROTO] = O;
+  } else result = createDict();
+  return Properties === undefined ? result : dPs(result, Properties);
+};
+
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var has = __webpack_require__(3);
+var toIObject = __webpack_require__(6);
+var arrayIndexOf = __webpack_require__(52)(false);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+
+module.exports = function (object, names) {
+  var O = toIObject(object);
+  var i = 0;
+  var result = [];
+  var key;
+  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);
+  // Don't enum bug & hidden keys
+  while (names.length > i) if (has(O, key = names[i++])) {
+    ~arrayIndexOf(result, key) || result.push(key);
+  }
+  return result;
+};
+
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports) {
+
+var toString = {}.toString;
+
+module.exports = function (it) {
+  return toString.call(it).slice(8, -1);
+};
+
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports) {
+
+exports.f = Object.getOwnPropertySymbols;
+
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
+var $keys = __webpack_require__(33);
+var hiddenKeys = __webpack_require__(22).concat('length', 'prototype');
+
+exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+  return $keys(O, hiddenKeys);
+};
+
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+__webpack_require__(38);
+
+var _Guide = __webpack_require__(73);
+
+var _Guide2 = _interopRequireDefault(_Guide);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// show title bar
+try {
+  var titleBar = weex.requireModule('titleBar');
+  titleBar.showTitleBar(true);
+} catch (e) {}
+
+_Guide2.default.el = '#root';
+new Vue(_Guide2.default);
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _mixin = __webpack_require__(39);
+
+var _mixin2 = _interopRequireDefault(_mixin);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// use shared mixins
+Vue.mixin(_mixin2.default);
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _index = __webpack_require__(27);
+
+var utils = _interopRequireWildcard(_index);
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+var storage = weex.requireModule('storage');
+
+exports.default = {
+  filters: {
+    i18n: utils.i18n,
+    url: utils.createURL,
+    link: utils.createLink
+  },
+  methods: {
+    createLink: utils.createLink,
+    createURL: utils.createURL,
+    i18n: utils.i18n,
+    getLanguage: utils.getLanguage,
+    fetchData: utils.fetchData,
+    saveData: utils.saveData,
+    readData: utils.readData,
+    jumpTo: utils.jumpTo
+  },
+  created: function created() {
+    var _this = this;
+
+    // get and set language
+    utils.getLanguage(function (language) {
+      _this.language = language;
+      utils.setTitleBar(_this.navigationBarOptions, language);
+    });
+
+    // listen to the language change event
+    var channel = new BroadcastChannel('language');
+    channel.onmessage = function (event) {
+      if (event.data && event.data.language) {
+        _this.language = event.data.language;
+      }
+    };
+  },
+  beforeDestroy: function beforeDestroy() {
+    storage.removeItem('CURRENT_DOCUMENT_URL');
+    storage.removeItem('CURRENT_SOURCE_HASH');
+  }
+};
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(41), __esModule: true };
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(4);
+var $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify });
+module.exports = function stringify(it) { // eslint-disable-line no-unused-vars
+  return $JSON.stringify.apply($JSON, arguments);
+};
+
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = true;
+
+var _iterator = __webpack_require__(43);
+
+var _iterator2 = _interopRequireDefault(_iterator);
+
+var _symbol = __webpack_require__(62);
+
+var _symbol2 = _interopRequireDefault(_symbol);
+
+var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
+  return typeof obj === "undefined" ? "undefined" : _typeof(obj);
+} : function (obj) {
+  return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
+};
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(44), __esModule: true };
+
+/***/ }),
+/* 44 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(45);
+__webpack_require__(58);
+module.exports = __webpack_require__(24).f('iterator');
+
+
+/***/ }),
+/* 45 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $at = __webpack_require__(46)(true);
+
+// 21.1.3.27 String.prototype[@@iterator]()
+__webpack_require__(28)(String, 'String', function (iterated) {
+  this._t = String(iterated); // target
+  this._i = 0;                // next index
+// 21.1.5.2.1 %StringIteratorPrototype%.next()
+}, function () {
+  var O = this._t;
+  var index = this._i;
+  var point;
+  if (index >= O.length) return { value: undefined, done: true };
+  point = $at(O, index);
+  this._i += point.length;
+  return { value: point, done: false };
+});
+
+
+/***/ }),
+/* 46 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(14);
+var defined = __webpack_require__(15);
+// true  -> String#at
+// false -> String#codePointAt
+module.exports = function (TO_STRING) {
+  return function (that, pos) {
+    var s = String(defined(that));
+    var i = toInteger(pos);
+    var l = s.length;
+    var a, b;
+    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
+    a = s.charCodeAt(i);
+    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
+      ? TO_STRING ? s.charAt(i) : a
+      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
+  };
+};
+
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// optional / simple context binding
+var aFunction = __webpack_require__(48);
+module.exports = function (fn, that, length) {
+  aFunction(fn);
+  if (that === undefined) return fn;
+  switch (length) {
+    case 1: return function (a) {
+      return fn.call(that, a);
+    };
+    case 2: return function (a, b) {
+      return fn.call(that, a, b);
+    };
+    case 3: return function (a, b, c) {
+      return fn.call(that, a, b, c);
+    };
+  }
+  return function (/* ...args */) {
+    return fn.apply(that, arguments);
+  };
+};
+
+
+/***/ }),
+/* 48 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+  if (typeof it != 'function') throw TypeError(it + ' is not a function!');
+  return it;
+};
+
+
+/***/ }),
+/* 49 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var create = __webpack_require__(32);
+var descriptor = __webpack_require__(12);
+var setToStringTag = __webpack_require__(23);
+var IteratorPrototype = {};
+
+// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
+__webpack_require__(5)(IteratorPrototype, __webpack_require__(7)('iterator'), function () { return this; });
+
+module.exports = function (Constructor, NAME, next) {
+  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
+  setToStringTag(Constructor, NAME + ' Iterator');
+};
+
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(1);
+var anObject = __webpack_require__(10);
+var getKeys = __webpack_require__(19);
+
+module.exports = __webpack_require__(2) ? Object.defineProperties : function defineProperties(O, Properties) {
+  anObject(O);
+  var keys = getKeys(Properties);
+  var length = keys.length;
+  var i = 0;
+  var P;
+  while (length > i) dP.f(O, P = keys[i++], Properties[P]);
+  return O;
+};
+
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for non-array-like ES3 and non-enumerable old V8 strings
+var cof = __webpack_require__(34);
+// eslint-disable-next-line no-prototype-builtins
+module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
+  return cof(it) == 'String' ? it.split('') : Object(it);
+};
+
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// false -> Array#indexOf
+// true  -> Array#includes
+var toIObject = __webpack_require__(6);
+var toLength = __webpack_require__(53);
+var toAbsoluteIndex = __webpack_require__(54);
+module.exports = function (IS_INCLUDES) {
+  return function ($this, el, fromIndex) {
+    var O = toIObject($this);
+    var length = toLength(O.length);
+    var index = toAbsoluteIndex(fromIndex, length);
+    var value;
+    // Array#includes uses SameValueZero equality algorithm
+    // eslint-disable-next-line no-self-compare
+    if (IS_INCLUDES && el != el) while (length > index) {
+      value = O[index++];
+      // eslint-disable-next-line no-self-compare
+      if (value != value) return true;
+    // Array#indexOf ignores holes, Array#includes - not
+    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
+      if (O[index] === el) return IS_INCLUDES || index || 0;
+    } return !IS_INCLUDES && -1;
+  };
+};
+
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.15 ToLength
+var toInteger = __webpack_require__(14);
+var min = Math.min;
+module.exports = function (it) {
+  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
+};
+
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(14);
+var max = Math.max;
+var min = Math.min;
+module.exports = function (index, length) {
+  index = toInteger(index);
+  return index < 0 ? max(index + length, 0) : min(index, length);
+};
+
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var document = __webpack_require__(0).document;
+module.exports = document && document.documentElement;
+
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
+var has = __webpack_require__(3);
+var toObject = __webpack_require__(57);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+var ObjectProto = Object.prototype;
+
+module.exports = Object.getPrototypeOf || function (O) {
+  O = toObject(O);
+  if (has(O, IE_PROTO)) return O[IE_PROTO];
+  if (typeof O.constructor == 'function' && O instanceof O.constructor) {
+    return O.constructor.prototype;
+  } return O instanceof Object ? ObjectProto : null;
+};
+
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.13 ToObject(argument)
+var defined = __webpack_require__(15);
+module.exports = function (it) {
+  return Object(defined(it));
+};
+
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(59);
+var global = __webpack_require__(0);
+var hide = __webpack_require__(5);
+var Iterators = __webpack_require__(18);
+var TO_STRING_TAG = __webpack_require__(7)('toStringTag');
+
+var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +
+  'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +
+  'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +
+  'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +
+  'TextTrackList,TouchList').split(',');
+
+for (var i = 0; i < DOMIterables.length; i++) {
+  var NAME = DOMIterables[i];
+  var Collection = global[NAME];
+  var proto = Collection && Collection.prototype;
+  if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
+  Iterators[NAME] = Iterators.Array;
+}
+
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var addToUnscopables = __webpack_require__(60);
+var step = __webpack_require__(61);
+var Iterators = __webpack_require__(18);
+var toIObject = __webpack_require__(6);
+
+// 22.1.3.4 Array.prototype.entries()
+// 22.1.3.13 Array.prototype.keys()
+// 22.1.3.29 Array.prototype.values()
+// 22.1.3.30 Array.prototype[@@iterator]()
+module.exports = __webpack_require__(28)(Array, 'Array', function (iterated, kind) {
+  this._t = toIObject(iterated); // target
+  this._i = 0;                   // next index
+  this._k = kind;                // kind
+// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
+}, function () {
+  var O = this._t;
+  var kind = this._k;
+  var index = this._i++;
+  if (!O || index >= O.length) {
+    this._t = undefined;
+    return step(1);
+  }
+  if (kind == 'keys') return step(0, index);
+  if (kind == 'values') return step(0, O[index]);
+  return step(0, [index, O[index]]);
+}, 'values');
+
+// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
+Iterators.Arguments = Iterators.Array;
+
+addToUnscopables('keys');
+addToUnscopables('values');
+addToUnscopables('entries');
+
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports) {
+
+module.exports = function () { /* empty */ };
+
+
+/***/ }),
+/* 61 */
+/***/ (function(module, exports) {
+
+module.exports = function (done, value) {
+  return { value: value, done: !!done };
+};
+
+
+/***/ }),
+/* 62 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(63), __esModule: true };
+
+/***/ }),
+/* 63 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(64);
+__webpack_require__(70);
+__webpack_require__(71);
+__webpack_require__(72);
+module.exports = __webpack_require__(4).Symbol;
+
+
+/***/ }),
+/* 64 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// ECMAScript 6 symbols shim
+var global = __webpack_require__(0);
+var has = __webpack_require__(3);
+var DESCRIPTORS = __webpack_require__(2);
+var $export = __webpack_require__(16);
+var redefine = __webpack_require__(31);
+var META = __webpack_require__(65).KEY;
+var $fails = __webpack_require__(11);
+var shared = __webpack_require__(21);
+var setToStringTag = __webpack_require__(23);
+var uid = __webpack_require__(13);
+var wks = __webpack_require__(7);
+var wksExt = __webpack_require__(24);
+var wksDefine = __webpack_require__(25);
+var enumKeys = __webpack_require__(66);
+var isArray = __webpack_require__(67);
+var anObject = __webpack_require__(10);
+var isObject = __webpack_require__(8);
+var toIObject = __webpack_require__(6);
+var toPrimitive = __webpack_require__(17);
+var createDesc = __webpack_require__(12);
+var _create = __webpack_require__(32);
+var gOPNExt = __webpack_require__(68);
+var $GOPD = __webpack_require__(69);
+var $DP = __webpack_require__(1);
+var $keys = __webpack_require__(19);
+var gOPD = $GOPD.f;
+var dP = $DP.f;
+var gOPN = gOPNExt.f;
+var $Symbol = global.Symbol;
+var $JSON = global.JSON;
+var _stringify = $JSON && $JSON.stringify;
+var PROTOTYPE = 'prototype';
+var HIDDEN = wks('_hidden');
+var TO_PRIMITIVE = wks('toPrimitive');
+var isEnum = {}.propertyIsEnumerable;
+var SymbolRegistry = shared('symbol-registry');
+var AllSymbols = shared('symbols');
+var OPSymbols = shared('op-symbols');
+var ObjectProto = Object[PROTOTYPE];
+var USE_NATIVE = typeof $Symbol == 'function';
+var QObject = global.QObject;
+// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
+var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
+
+// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
+var setSymbolDesc = DESCRIPTORS && $fails(function () {
+  return _create(dP({}, 'a', {
+    get: function () { return dP(this, 'a', { value: 7 }).a; }
+  })).a != 7;
+}) ? function (it, key, D) {
+  var protoDesc = gOPD(ObjectProto, key);
+  if (protoDesc) delete ObjectProto[key];
+  dP(it, key, D);
+  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
+} : dP;
+
+var wrap = function (tag) {
+  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
+  sym._k = tag;
+  return sym;
+};
+
+var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {
+  return typeof it == 'symbol';
+} : function (it) {
+  return it instanceof $Symbol;
+};
+
+var $defineProperty = function defineProperty(it, key, D) {
+  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
+  anObject(it);
+  key = toPrimitive(key, true);
+  anObject(D);
+  if (has(AllSymbols, key)) {
+    if (!D.enumerable) {
+      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
+      it[HIDDEN][key] = true;
+    } else {
+      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
+      D = _create(D, { enumerable: createDesc(0, false) });
+    } return setSymbolDesc(it, key, D);
+  } return dP(it, key, D);
+};
+var $defineProperties = function defineProperties(it, P) {
+  anObject(it);
+  var keys = enumKeys(P = toIObject(P));
+  var i = 0;
+  var l = keys.length;
+  var key;
+  while (l > i) $defineProperty(it, key = keys[i++], P[key]);
+  return it;
+};
+var $create = function create(it, P) {
+  return P === undefined ? _create(it) : $defineProperties(_create(it), P);
+};
+var $propertyIsEnumerable = function propertyIsEnumerable(key) {
+  var E = isEnum.call(this, key = toPrimitive(key, true));
+  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
+  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
+};
+var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
+  it = toIObject(it);
+  key = toPrimitive(key, true);
+  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
+  var D = gOPD(it, key);
+  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
+  return D;
+};
+var $getOwnPropertyNames = function getOwnPropertyNames(it) {
+  var names = gOPN(toIObject(it));
+  var result = [];
+  var i = 0;
+  var key;
+  while (names.length > i) {
+    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
+  } return result;
+};
+var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
+  var IS_OP = it === ObjectProto;
+  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
+  var result = [];
+  var i = 0;
+  var key;
+  while (names.length > i) {
+    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
+  } return result;
+};
+
+// 19.4.1.1 Symbol([description])
+if (!USE_NATIVE) {
+  $Symbol = function Symbol() {
+    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
+    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
+    var $set = function (value) {
+      if (this === ObjectProto) $set.call(OPSymbols, value);
+      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+      setSymbolDesc(this, tag, createDesc(1, value));
+    };
+    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
+    return wrap(tag);
+  };
+  redefine($Symbol[PROTOTYPE], 'toString', function toString() {
+    return this._k;
+  });
+
+  $GOPD.f = $getOwnPropertyDescriptor;
+  $DP.f = $defineProperty;
+  __webpack_require__(36).f = gOPNExt.f = $getOwnPropertyNames;
+  __webpack_require__(26).f = $propertyIsEnumerable;
+  __webpack_require__(35).f = $getOwnPropertySymbols;
+
+  if (DESCRIPTORS && !__webpack_require__(9)) {
+    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
+  }
+
+  wksExt.f = function (name) {
+    return wrap(wks(name));
+  };
+}
+
+$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });
+
+for (var es6Symbols = (
+  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
+  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
+).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);
+
+for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);
+
+$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
+  // 19.4.2.1 Symbol.for(key)
+  'for': function (key) {
+    return has(SymbolRegistry, key += '')
+      ? SymbolRegistry[key]
+      : SymbolRegistry[key] = $Symbol(key);
+  },
+  // 19.4.2.5 Symbol.keyFor(sym)
+  keyFor: function keyFor(sym) {
+    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
+    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
+  },
+  useSetter: function () { setter = true; },
+  useSimple: function () { setter = false; }
+});
+
+$export($export.S + $export.F * !USE_NATIVE, 'Object', {
+  // 19.1.2.2 Object.create(O [, Properties])
+  create: $create,
+  // 19.1.2.4 Object.defineProperty(O, P, Attributes)
+  defineProperty: $defineProperty,
+  // 19.1.2.3 Object.defineProperties(O, Properties)
+  defineProperties: $defineProperties,
+  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
+  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
+  // 19.1.2.7 Object.getOwnPropertyNames(O)
+  getOwnPropertyNames: $getOwnPropertyNames,
+  // 19.1.2.8 Object.getOwnPropertySymbols(O)
+  getOwnPropertySymbols: $getOwnPropertySymbols
+});
+
+// 24.3.2 JSON.stringify(value [, replacer [, space]])
+$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
+  var S = $Symbol();
+  // MS Edge converts symbol values to JSON as {}
+  // WebKit converts symbol values to JSON as null
+  // V8 throws on boxed symbols
+  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
+})), 'JSON', {
+  stringify: function stringify(it) {
+    var args = [it];
+    var i = 1;
+    var replacer, $replacer;
+    while (arguments.length > i) args.push(arguments[i++]);
+    $replacer = replacer = args[1];
+    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
+    if (!isArray(replacer)) replacer = function (key, value) {
+      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
+      if (!isSymbol(value)) return value;
+    };
+    args[1] = replacer;
+    return _stringify.apply($JSON, args);
+  }
+});
+
+// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
+$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(5)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
+// 19.4.3.5 Symbol.prototype[@@toStringTag]
+setToStringTag($Symbol, 'Symbol');
+// 20.2.1.9 Math[@@toStringTag]
+setToStringTag(Math, 'Math', true);
+// 24.3.3 JSON[@@toStringTag]
+setToStringTag(global.JSON, 'JSON', true);
+
+
+/***/ }),
+/* 65 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var META = __webpack_require__(13)('meta');
+var isObject = __webpack_require__(8);
+var has = __webpack_require__(3);
+var setDesc = __webpack_require__(1).f;
+var id = 0;
+var isExtensible = Object.isExtensible || function () {
+  return true;
+};
+var FREEZE = !__webpack_require__(11)(function () {
+  return isExtensible(Object.preventExtensions({}));
+});
+var setMeta = function (it) {
+  setDesc(it, META, { value: {
+    i: 'O' + ++id, // object ID
+    w: {}          // weak collections IDs
+  } });
+};
+var fastKey = function (it, create) {
+  // return primitive with prefix
+  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+  if (!has(it, META)) {
+    // can't set metadata to uncaught frozen object
+    if (!isExtensible(it)) return 'F';
+    // not necessary to add metadata
+    if (!create) return 'E';
+    // add missing metadata
+    setMeta(it);
+  // return object ID
+  } return it[META].i;
+};
+var getWeak = function (it, create) {
+  if (!has(it, META)) {
+    // can't set metadata to uncaught frozen object
+    if (!isExtensible(it)) return true;
+    // not necessary to add metadata
+    if (!create) return false;
+    // add missing metadata
+    setMeta(it);
+  // return hash weak collections IDs
+  } return it[META].w;
+};
+// add metadata on freeze-family methods calling
+var onFreeze = function (it) {
+  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
+  return it;
+};
+var meta = module.exports = {
+  KEY: META,
+  NEED: false,
+  fastKey: fastKey,
+  getWeak: getWeak,
+  onFreeze: onFreeze
+};
+
+
+/***/ }),
+/* 66 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// all enumerable object keys, includes symbols
+var getKeys = __webpack_require__(19);
+var gOPS = __webpack_require__(35);
+var pIE = __webpack_require__(26);
+module.exports = function (it) {
+  var result = getKeys(it);
+  var getSymbols = gOPS.f;
+  if (getSymbols) {
+    var symbols = getSymbols(it);
+    var isEnum = pIE.f;
+    var i = 0;
+    var key;
+    while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
+  } return result;
+};
+
+
+/***/ }),
+/* 67 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.2.2 IsArray(argument)
+var cof = __webpack_require__(34);
+module.exports = Array.isArray || function isArray(arg) {
+  return cof(arg) == 'Array';
+};
+
+
+/***/ }),
+/* 68 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
+var toIObject = __webpack_require__(6);
+var gOPN = __webpack_require__(36).f;
+var toString = {}.toString;
+
+var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
+  ? Object.getOwnPropertyNames(window) : [];
+
+var getWindowNames = function (it) {
+  try {
+    return gOPN(it);
+  } catch (e) {
+    return windowNames.slice();
+  }
+};
+
+module.exports.f = function getOwnPropertyNames(it) {
+  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
+};
+
+
+/***/ }),
+/* 69 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var pIE = __webpack_require__(26);
+var createDesc = __webpack_require__(12);
+var toIObject = __webpack_require__(6);
+var toPrimitive = __webpack_require__(17);
+var has = __webpack_require__(3);
+var IE8_DOM_DEFINE = __webpack_require__(29);
+var gOPD = Object.getOwnPropertyDescriptor;
+
+exports.f = __webpack_require__(2) ? gOPD : function getOwnPropertyDescriptor(O, P) {
+  O = toIObject(O);
+  P = toPrimitive(P, true);
+  if (IE8_DOM_DEFINE) try {
+    return gOPD(O, P);
+  } catch (e) { /* empty */ }
+  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
+};
+
+
+/***/ }),
+/* 70 */
+/***/ (function(module, exports) {
+
+
+
+/***/ }),
+/* 71 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(25)('asyncIterator');
+
+
+/***/ }),
+/* 72 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(25)('observable');
+
+
+/***/ }),
+/* 73 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(74)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(75)
+
+/* template */
+var __vue_template__ = __webpack_require__(86)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+  typeof __vue_exports__.default === "object" ||
+  typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+  __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/pages/guide/Guide.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-5490db22"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+  for (var name in module) {
+    __vue_options__.style[name] = module[name]
+  }
+})
+if (typeof __register_static_styles__ === "function") {
+  __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 74 */
+/***/ (function(module, exports) {
+
+module.exports = {
+  "size": {
+    "width": "750",
+    "height": "320"
+  },
+  "center": {
+    "alignItems": "center",
+    "justifyContent": "center"
+  },
+  "slider": {
+    "width": "750",
+    "height": "400",
+    "boxShadow": "0 5px 10px rgba(0, 0, 0, 0.2)",
+    "marginBottom": "10"
+  },
+  "slider-title": {
+    "width": "750",
+    "paddingTop": 0,
+    "paddingRight": "30",
+    "paddingBottom": "30",
+    "paddingLeft": "30",
+    "fontSize": "46",
+    "textAlign": "center",
+    "color": "#FFFFFF"
+  },
+  "indicator": {
+    "position": "absolute",
+    "left": 0,
+    "right": 0,
+    "bottom": 0,
+    "width": "750",
+    "height": "30",
+    "itemSize": "12",
+    "itemColor": "#DDDDDD",
+    "itemSelectedColor": "rgb(0,180,255)"
+  }
+}
+
+/***/ }),
+/* 75 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _utils = __webpack_require__(27);
+
+var _Lesson = __webpack_require__(76);
+
+var _Lesson2 = _interopRequireDefault(_Lesson);
+
+var _mock = __webpack_require__(80);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var useStorage = false; //
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+exports.default = {
+  components: { Lesson: _Lesson2.default },
+  data: function data() {
+    return {
+      language: 'en',
+      navigationBarOptions: {
+        title: {
+          zh: 'Weex 入门',
+          en: 'Weex Guide'
+        }
+      },
+      lenssonIndex: 0,
+      guideLessons: _mock.guideLessons
+    };
+  },
+
+  computed: {
+    chosenLesson: function chosenLesson() {
+      return this.guideLessons[this.lenssonIndex];
+    }
+  },
+  watch: {
+    lenssonIndex: function lenssonIndex() {
+      this.navigationBarOptions.backgroundColor = this.chosenLesson.mainColor;
+      this.navigationBarOptions.title = this.chosenLesson.title;
+    },
+    navigationBarOptions: function navigationBarOptions() {
+      (0, _utils.setTitleBar)(this.navigationBarOptions, this.language);
+    }
+  },
+  beforeCreate: function beforeCreate() {
+    var _this = this;
+
+    (0, _utils.readGuide)(function (guide) {
+      _this.guideLessons = guide;
+      if (WXEnvironment.platform.toLowerCase() !== 'web') {
+        useStorage = true;
+      }
+    });
+    (0, _utils.fetchGuide)(function (result) {
+      (0, _utils.saveGuide)(result);
+      if (!useStorage) {
+        _this.guideLessons = result.guide;
+      }
+    });
+  }
+};
+
+/***/ }),
+/* 76 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(77)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(78)
+
+/* template */
+var __vue_template__ = __webpack_require__(79)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+  typeof __vue_exports__.default === "object" ||
+  typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+  __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/components/Lesson.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-2c29cf22"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+  for (var name in module) {
+    __vue_options__.style[name] = module[name]
+  }
+})
+if (typeof __register_static_styles__ === "function") {
+  __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 77 */
+/***/ (function(module, exports) {
+
+module.exports = {
+  "center": {
+    "alignItems": "center",
+    "justifyContent": "center"
+  },
+  "title": {
+    "fontSize": "60",
+    "textAlign": "center",
+    "marginTop": "60",
+    "marginBottom": "60",
+    "color": "#606060"
+  },
+  "lesson": {
+    "borderBottomWidth": "1",
+    "borderBottomStyle": "solid",
+    "borderBottomColor": "#EEEEEE",
+    "flexDirection": "row",
+    "alignItems": "center"
+  },
+  "lesson-zh": {
+    "width": "600"
+  },
+  "lesson-en": {
+    "width": "630"
+  },
+  "lesson-index": {
+    "color": "#777777",
+    "textAlign": "right",
+    "paddingRight": "30"
+  },
+  "lesson-title": {
+    "paddingTop": "35",
+    "paddingBottom": "35"
+  },
+  "lesson-index-zh": {
+    "fontSize": "46",
+    "width": "120"
+  },
+  "lesson-title-zh": {
+    "fontSize": "42",
+    "width": "480"
+  },
+  "lesson-index-en": {
+    "fontSize": "42",
+    "width": "100"
+  },
+  "lesson-title-en": {
+    "fontSize": "38",
+    "width": "530"
+  },
+  "footer": {
+    "height": "120",
+    "paddingTop": "40"
+  },
+  "copyright": {
+    "fontSize": "22",
+    "color": "#A0A0A0",
+    "textAlign": "center"
+  }
+}
+
+/***/ }),
+/* 78 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+exports.default = {
+  props: ['mainColor', 'title', 'copyright', 'lessons'],
+  data: function data() {
+    return {
+      language: 'en'
+    };
+  }
+};
+
+/***/ }),
+/* 79 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+  return _c('div', {
+    staticClass: ["wrapper"]
+  }, [_c('div', {
+    staticClass: ["center"]
+  }, [_c('text', {
+    staticClass: ["title"]
+  }, [_vm._v(_vm._s(_vm.i18n(_vm.title)))])]), _vm._l((_vm.lessons), function(lesson, i) {
+    return _c('div', {
+      key: i,
+      staticClass: ["center"]
+    }, [_c('div', {
+      class: ['lesson', ("lesson-" + _vm.language)],
+      on: {
+        "click": function($event) {
+          _vm.jumpTo(lesson.docLink, lesson.title)
+        }
+      }
+    }, [_c('text', {
+      class: ['lesson-index', ("lesson-index-" + _vm.language)]
+    }, [_vm._v(_vm._s(i + 1) + ".")]), _c('text', {
+      class: ['lesson-title', ("lesson-title-" + _vm.language)],
+      style: {
+        color: _vm.mainColor
+      }
+    }, [_vm._v(_vm._s(_vm.i18n(lesson.title)))])])])
+  }), _c('div', {
+    staticClass: ["footer", "center"]
+  }, [_c('text', {
+    staticClass: ["copyright"]
+  }, [_vm._v(_vm._s(_vm.i18n(_vm.copyright)))])])], 2)
+},staticRenderFns: []}
+module.exports.render._withStripped = true
+
+/***/ }),
+/* 80 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.aboutApp = exports.guideLessons = undefined;
+
+var _sliders = __webpack_require__(81);
+
+var _sliders2 = _interopRequireDefault(_sliders);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var guideLessons = exports.guideLessons = _sliders2.default;
+
+var aboutApp = exports.aboutApp = [{
+  title: { en: 'Weex Official Website', zh: 'Weex 官方网站' },
+  link: {
+    en: 'http://weex-project.io/',
+    zh: 'http://weex-project.io/cn/'
+  }
+}, {
+  title: { en: 'Apache Software Foundation', zh: 'Apache 软件基金会' },
+  link: 'http://www.apache.org/'
+}, {
+  title: { en: 'Who is using Weex', zh: '谁在使用 Weex' },
+  link: {
+    en: 'http://weex-project.io/who-is-using-weex.html',
+    zh: 'http://weex-project.io/cn/who-is-using-weex.html'
+  }
+}, {
+  title: { en: 'Contribution', zh: '参与贡献' },
+  link: {
+    en: 'http://weex-project.io/guide/contributing.html',
+    zh: 'http://weex-project.io/cn/guide/contributing.html'
+  }
+}, {
+  title: { en: 'Release Note', zh: '版本变更' },
+  link: {
+    en: 'http://weex-project.io/releasenote.html',
+    zh: 'http://weex-project.io/cn/releasenote.html'
+  }
+}, {
+  title: { en: 'FAQ', zh: '常见问题' },
+  link: {
+    en: 'http://weex-project.io/faq.html',
+    zh: 'http://weex-project.io/cn/faq.html'
+  }
+}];
+
+/***/ }),
+/* 81 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _defineProperty2 = __webpack_require__(82);
+
+var _defineProperty3 = _interopRequireDefault(_defineProperty2);
+
+var _ref, _ref2, _ref3;
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = [{
+  subject: 'weex',
+  mainColor: '#00B4FF',
+  title: { zh: '学习 Weex', en: 'Learn Weex' },
+  poster: 'https://gw.alicdn.com/tfs/TB1.8Vdl9_I8KJjy0FoXXaFnVXa-3799-1615.png',
+  posterBg: '#E5F7FF',
+  posterStyle: {
+    width: '650px',
+    height: '304px'
+  },
+  copyright: {
+    zh: '来自 http://weex-project.io/cn/',
+    en: 'From http://weex-project.io/'
+  },
+  lessons: [{
+    title: {
+      zh: '快速入门',
+      en: 'Getting Started'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/guide/index.html',
+      en: 'http://weex-project.io/guide/index.html'
+    }
+  }, {
+    title: {
+      zh: '工作原理',
+      en: 'How it Works'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/wiki/index.html',
+      en: 'http://weex-project.io/wiki/index.html'
+    }
+  }, {
+    title: {
+      zh: 'Weex 中的前端框架',
+      en: 'Front-end Frameworks'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/guide/front-end-frameworks.html',
+      en: 'http://weex-project.io/guide/front-end-frameworks.html'
+    }
+  }, {
+    title: {
+      zh: '在 Weex 中使用 Vue.js',
+      en: 'Use Vue.js on Weex'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/guide/use-vue.html',
+      en: 'http://weex-project.io/guide/use-vue.html'
+    }
+  }, {
+    title: {
+      zh: '与 Web 平台的差异',
+      en: 'Platform difference with Web'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/wiki/platform-difference.html',
+      en: 'http://weex-project.io/wiki/platform-difference.html'
+    }
+  }, {
+    title: {
+      zh: '集成 Weex 到已有应用',
+      en: 'Integrate to Your App'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/guide/integrate-to-your-app.html',
+      en: 'http://weex-project.io/guide/integrate-to-your-app.html'
+    }
+  }, {
+    title: {
+      zh: '搭建开发环境',
+      en: 'Set Up Dev Environment'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/guide/set-up-env.html',
+      en: 'http://weex-project.io/guide/set-up-env.html'
+    }
+  }, {
+    title: {
+      zh: '通用样式',
+      en: 'Common Styles'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/wiki/common-styles.html',
+      en: 'http://weex-project.io/wiki/common-styles.html'
+    }
+  }, {
+    title: {
+      zh: '通用事件',
+      en: 'Common Events'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/wiki/common-events.html',
+      en: 'http://weex-project.io/wiki/common-events.html'
+    }
+  }, {
+    title: {
+      zh: 'Weex 实例变量',
+      en: 'The "weex" Variable'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/references/weex-variable.html',
+      en: 'http://weex-project.io/references/weex-variable.html'
+    }
+  }, {
+    title: {
+      zh: '内置组件',
+      en: 'Built-in Components'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/references/components/index.html',
+      en: 'http://weex-project.io/references/components/index.html'
+    }
+  }, {
+    title: {
+      zh: '内置模块',
+      en: 'Built-in Modules'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/references/modules/index.html',
+      en: 'http://weex-project.io/references/modules/index.html'
+    }
+  }, {
+    title: {
+      zh: '扩展 Android 组件/模块',
+      en: 'Extend Android'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/guide/extend-android.html',
+      en: 'http://weex-project.io/guide/extend-android.html'
+    }
+  }, {
+    title: {
+      zh: '扩展 iOS 组件/模块',
+      en: 'Extend iOS'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/guide/extend-ios.html',
+      en: 'http://weex-project.io/guide/extend-ios.html'
+    }
+  }, {
+    title: {
+      zh: '使用 weex-toolkit',
+      en: 'Use weex-toolkit'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/tools/toolkit.html',
+      en: 'http://weex-project.io/tools/toolkit.html'
+    }
+  }, {
+    title: {
+      zh: '如何参与贡献',
+      en: 'How to Contribute'
+    },
+    docLink: {
+      zh: 'http://weex-project.io/cn/contributing.html',
+      en: 'http://weex-project.io/contributing.html'
+    }
+  }]
+}, (_ref = {
+  subject: 'vue',
+  mainColor: '#42b983',
+  title: { zh: '学习 Vue.js', en: 'Learn Vue.js' },
+  poster: 'https://gw.alicdn.com/tfs/TB1J_uKcMMPMeJjy1XdXXasrXXa-400-400.png',
+  posterBg: '#E7FBF2',
+  posterStyle: {
+    width: '300px',
+    height: '300px'
+  }
+}, (0, _defineProperty3.default)(_ref, 'title', {
+  zh: '学习 Vue.js',
+  en: 'Learn Vue.js'
+}), (0, _defineProperty3.default)(_ref, 'copyright', {
+  zh: '来自 https://cn.vuejs.org/',
+  en: 'From https://vuejs.org/'
+}), (0, _defineProperty3.default)(_ref, 'lessons', [{
+  title: {
+    zh: 'Vue.js 是什么?',
+    en: 'What is Vue.js ?'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/index.html',
+    en: 'https://vuejs.org/v2/guide/index.html'
+  }
+}, {
+  title: {
+    zh: '单文件组件',
+    en: 'Single File Components'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/single-file-components.html',
+    en: 'https://vuejs.org/v2/guide/single-file-components.html'
+  }
+}, {
+  title: {
+    zh: '模板语法',
+    en: 'Template Syntax'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/syntax.html',
+    en: 'https://vuejs.org/v2/guide/syntax.html'
+  }
+}, {
+  title: {
+    zh: 'Class 与 Style 绑定',
+    en: 'Class and Style Bindings'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/class-and-style.html',
+    en: 'https://vuejs.org/v2/guide/class-and-style.html'
+  }
+}, {
+  title: {
+    zh: '条件渲染',
+    en: 'Conditional Rendering'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/conditional.html',
+    en: 'https://vuejs.org/v2/guide/conditional.html'
+  }
+}, {
+  title: {
+    zh: '列表渲染',
+    en: 'List Rendering'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/list.html',
+    en: 'https://vuejs.org/v2/guide/list.html'
+  }
+}, {
+  title: {
+    zh: '事件处理',
+    en: 'Event Handling'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/events.html',
+    en: 'https://vuejs.org/v2/guide/events.html'
+  }
+}, {
+  title: {
+    zh: '表单输入绑定',
+    en: 'Form Input Bindings'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/forms.html',
+    en: 'https://vuejs.org/v2/guide/forms.html'
+  }
+}, {
+  title: {
+    zh: 'Vue 实例',
+    en: 'The Vue Instance'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/instance.html',
+    en: 'https://vuejs.org/v2/guide/instance.html'
+  }
+}, {
+  title: {
+    zh: '在 Weex 中使用 Vue.js',
+    en: 'Use Vue.js on Weex'
+  },
+  docLink: {
+    zh: 'http://weex-project.io/cn/guide/use-vue.html',
+    en: 'http://weex-project.io/guide/use-vue.html'
+  }
+}, {
+  title: {
+    zh: '混合(mixins)',
+    en: 'Mixins'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/mixins.html',
+    en: 'https://vuejs.org/v2/guide/mixins.html'
+  }
+}, {
+  title: {
+    zh: '过滤器(filters)',
+    en: 'Filters'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/filters.html',
+    en: 'https://vuejs.org/v2/guide/filters.html'
+  }
+}, {
+  title: {
+    zh: '插件(plugins)',
+    en: 'Plugins'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/plugins.html',
+    en: 'https://vuejs.org/v2/guide/plugins.html'
+  }
+}, {
+  title: {
+    zh: '自定义指令',
+    en: 'Custom Directives'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/custom-directive.html',
+    en: 'https://vuejs.org/v2/guide/custom-directive.html'
+  }
+}, {
+  title: {
+    zh: '状态管理',
+    en: 'State Management'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/state-management.html',
+    en: 'https://vuejs.org/v2/guide/state-management.html'
+  }
+}, {
+  title: {
+    zh: '深入响应式原理',
+    en: 'Reactivity in Depth'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/reactivity.html',
+    en: 'https://vuejs.org/v2/guide/reactivity.html'
+  }
+}, {
+  title: {
+    zh: '渲染函数',
+    en: 'Render Functions'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/render-function.html',
+    en: 'https://vuejs.org/v2/guide/render-function.html'
+  }
+}, {
+  title: {
+    zh: 'TypeScript 支持',
+    en: 'TypeScript Support'
+  },
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/guide/typescript.html',
+    en: 'https://vuejs.org/v2/guide/typescript.html'
+  }
+}, {
+  title: 'API',
+  docLink: {
+    zh: 'https://cn.vuejs.org/v2/api/',
+    en: 'https://vuejs.org/v2/api/'
+  }
+}]), _ref), (_ref2 = {
+  subject: 'javascript',
+  mainColor: '#F7BD2A',
+  title: { zh: '学习 Javascript', en: 'Learn Javascript' },
+  poster: 'https://gw.alicdn.com/tfs/TB1bT98hMoQMeJjy0FpXXcTxpXa-1500-700.png',
+  posterBg: '#FAF3EB',
+  posterStyle: {
+    width: '750px',
+    height: '350px'
+  }
+}, (0, _defineProperty3.default)(_ref2, 'title', {
+  zh: '学习 Javascript',
+  en: 'Learn Javascript'
+}), (0, _defineProperty3.default)(_ref2, 'copyright', {
+  zh: '来自 MDN (Mozilla Developer Network)',
+  en: 'From MDN (Mozilla Developer Network)'
+}), (0, _defineProperty3.default)(_ref2, 'lessons', [{
+  title: {
+    zh: '什么是 Javascript ?',
+    en: 'What is Javascript ?'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/What_is_JavaScript',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/What_is_JavaScript'
+  }
+}, {
+  title: {
+    zh: 'JavaScript基础',
+    en: 'JavaScript basics'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/Getting_started_with_the_web/JavaScript_basics',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/Getting_started_with_the_web/JavaScript_basics'
+  }
+}, {
+  title: {
+    zh: '重新介绍 JavaScript',
+    en: 'A re-introduction to JavaScript'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/A_re-introduction_to_JavaScript',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript'
+  }
+}, {
+  title: {
+    zh: '语法和数据类型',
+    en: 'Grammar and types'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Grammar_and_types#Variable_scope',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Variable_scope'
+  }
+}, {
+  title: {
+    zh: '数据类型和数据结构',
+    en: 'Data types and data structures'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures'
+  }
+}, {
+  title: {
+    zh: '变量',
+    en: 'Variables'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Variables',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Variables'
+  }
+}, {
+  title: {
+    zh: '数字和操作符',
+    en: 'Numbers and operators'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Math',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Math'
+  }
+}, {
+  title: {
+    zh: '字符串',
+    en: 'Handling text'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Strings',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Strings'
+  }
+}, {
+  title: {
+    zh: '常用的 String 方法',
+    en: 'Useful string methods'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Useful_string_methods',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Useful_string_methods'
+  }
+}, {
+  title: {
+    zh: '数组',
+    en: 'Arrays'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Arrays',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Arrays'
+  }
+}, {
+  title: {
+    zh: '函数',
+    en: 'Functions'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Functions',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions'
+  }
+}, {
+  title: {
+    zh: 'JavaScript 对象基础',
+    en: 'JavaScript object basics'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/Basics',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Basics'
+  }
+}, {
+  title: {
+    zh: '使用对象',
+    en: 'Working with objects'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Working_with_Objects',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects'
+  }
+}, {
+  title: {
+    zh: '使用 JSON 数据',
+    en: 'Working with JSON'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/JSON',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON'
+  }
+}, {
+  title: {
+    zh: '对象模型的细节',
+    en: 'Details of the object model'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Details_of_the_Object_Model',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Details_of_the_Object_Model'
+  }
+}, {
+  title: {
+    zh: '对象原型',
+    en: 'Object prototypes'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes',
+    en: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/Object_prototypes'
+  }
+}, {
+  title: {
+    zh: 'JavaScript 中的继承',
+    en: 'Inheritance in JavaScript'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/Inheritance',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Inheritance'
+  }
+}, {
+  title: {
+    zh: '继承与原型链',
+    en: 'Inheritance and the prototype chain'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain'
+  }
+}, {
+  title: {
+    zh: '严格模式',
+    en: 'Strict mode'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode'
+  }
+}, {
+  title: {
+    zh: '内存管理',
+    en: 'Memory Management'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Memory_Management',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management'
+  }
+}, {
+  title: {
+    zh: '并发模型与事件循环',
+    en: 'Concurrency model and Event Loop'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/EventLoop',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop'
+  }
+}, {
+  //   title: {
+  //     zh: '索引集合类',
+  //     en: 'Indexed collections'
+  //   },
+  //   docLink: {
+  //     zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Indexed_collections',
+  //     en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Indexed_collections'
+  //   }
+  // }, {
+  //   title: {
+  //     zh: '带键的集合',
+  //     en: 'Keyed collections'
+  //   },
+  //   docLink: {
+  //     zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Keyed_collections',
+  //     en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Keyed_collections'
+  //   }
+  // }, {
+  title: {
+    zh: 'JavaScript 标准库',
+    en: 'Standard built-in objects'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects'
+  }
+}]), _ref2), (_ref3 = {
+  subject: 'css',
+  mainColor: '#F56FC6',
+  title: { zh: '学习 CSS', en: 'Learn CSS' },
+  titleColor: '#FFFFFF',
+  poster: 'https://gw.alicdn.com/tfs/TB1k6anhMMPMeJjy1XdXXasrXXa-427-190.jpg',
+  posterBg: '#FFA2DE',
+  posterStyle: {
+    width: '517px',
+    height: '230px'
+  }
+}, (0, _defineProperty3.default)(_ref3, 'title', {
+  zh: '学习 CSS',
+  en: 'Learn CSS'
+}), (0, _defineProperty3.default)(_ref3, 'copyright', {
+  zh: '来自 MDN (Mozilla Developer Network)',
+  en: 'From MDN (Mozilla Developer Network)'
+}), (0, _defineProperty3.default)(_ref3, 'lessons', [{
+  title: {
+    zh: '什么是 CSS ?',
+    en: 'What is CSS ?'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Getting_started/What_is_CSS',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_started/What_is_CSS'
+  }
+}, {
+  title: {
+    zh: 'CSS 语法',
+    en: 'CSS Syntax'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Introduction_to_CSS/Syntax',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Syntax'
+  }
+}, {
+  title: {
+    zh: 'CSS的值和单位',
+    en: 'CSS Values and Units'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Introduction_to_CSS/Values_and_units',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Values_and_units'
+  }
+}, {
+  title: {
+    zh: '盒模型',
+    en: 'The Box Model'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Introduction_to_CSS/Box_model',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Box_model'
+  }
+}, {
+  title: {
+    zh: '盒模型的属性',
+    en: 'Box Model Properties'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Box_Model',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Box_Model'
+  }
+}, {
+  title: {
+    zh: '定位布局',
+    en: 'Positioning'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/CSS_layout/%E5%AE%9A%E4%BD%8Dx',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/positioning'
+  }
+}, {
+  title: {
+    zh: '定位布局的属性',
+    en: 'CSS Positioning'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Positioning',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning'
+  }
+}, {
+  title: {
+    zh: 'Flexbox 布局',
+    en: 'Flexbox Layout'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/CSS_layout/Flexbox',
+    en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox'
+  }
+}, {
+  title: {
+    zh: 'Flexbox 布局的属性',
+    en: 'CSS Flexible Box Layout'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Flexible_Box_Layout',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout'
+  }
+}, {
+  title: {
+    zh: 'Weex 中的通用样式',
+    en: 'Common Styles in Weex'
+  },
+  docLink: {
+    zh: 'http://weex-project.io/cn/references/common-style.html',
+    en: 'http://weex-project.io/references/common-style.html'
+  }
+}, {
+  title: {
+    zh: 'Weex 中的文本样式',
+    en: 'Text Styles in Weex'
+  },
+  docLink: {
+    zh: 'http://weex-project.io/cn/references/text-style.html',
+    en: 'http://weex-project.io/references/text-style.html'
+  }
+}, {
+  title: {
+    zh: '块格式化上下文(BFC)',
+    en: 'Block Formatting Context'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Block_formatting_context',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Block_formatting_context'
+  }
+}, {
+  title: {
+    zh: '视觉格式化模型',
+    en: 'Visual Formatting Model'
+  },
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Visual_formatting_model',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Visual_formatting_model'
+  }
+}, {
+  title: 'CSS Reference',
+  docLink: {
+    zh: 'https://developer.mozilla.org/zh-CN/docs/Web/CSS/Reference',
+    en: 'https://developer.mozilla.org/en-US/docs/Web/CSS/Reference'
+  }
+}]), _ref3)];
+
+/***/ }),
+/* 82 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = true;
+
+var _defineProperty = __webpack_require__(83);
+
+var _defineProperty2 = _interopRequireDefault(_defineProperty);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = function (obj, key, value) {
+  if (key in obj) {
+    (0, _defineProperty2.default)(obj, key, {
+      value: value,
+      enumerable: true,
+      configurable: true,
+      writable: true
+    });
+  } else {
+    obj[key] = value;
+  }
+
+  return obj;
+};
+
+/***/ }),
+/* 83 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(84), __esModule: true };
+
+/***/ }),
+/* 84 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(85);
+var $Object = __webpack_require__(4).Object;
+module.exports = function defineProperty(it, key, desc) {
+  return $Object.defineProperty(it, key, desc);
+};
+
+
+/***/ }),
+/* 85 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(16);
+// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
+$export($export.S + $export.F * !__webpack_require__(2), 'Object', { defineProperty: __webpack_require__(1).f });
+
+
+/***/ }),
+/* 86 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+  return _c('scroller', {
+    staticClass: ["wrapper"]
+  }, [_c('slider', {
+    staticClass: ["slider"],
+    attrs: {
+      "autoPlay": "true"
+    }
+  }, [_vm._l((_vm.guideLessons), function(item, i) {
+    return _c('div', {
+      key: item.subject,
+      staticClass: ["center"],
+      style: {
+        backgroundColor: item.posterBg
+      },
+      on: {
+        "click": function($event) {
+          _vm.lenssonIndex = i
+        }
+      }
+    }, [_c('div', {
+      staticClass: ["center", "size"]
+    }, [_c('image', {
+      style: item.posterStyle,
+      attrs: {
+        "resize": "cover",
+        "src": item.poster
+      }
+    })]), _c('text', {
+      staticClass: ["slider-title"],
+      style: {
+        color: item.titleColor || item.mainColor
+      }
+    }, [_vm._v(_vm._s(_vm.i18n(item.title)))])])
+  }), _c('indicator', {
+    staticClass: ["indicator"]
+  })], 2), _c('lesson', {
+    attrs: {
+      "mainColor": _vm.chosenLesson.mainColor,
+      "title": _vm.chosenLesson.title,
+      "lessons": _vm.chosenLesson.lessons,
+      "copyright": _vm.chosenLesson.copyright
+    }
+  })], 1)
+},staticRenderFns: []}
+module.exports.render._withStripped = true
+
+/***/ })
+/******/ ]);
\ No newline at end of file
diff --git a/ios/bundlejs/landing.weex.js b/ios/bundlejs/landing.weex.js
new file mode 100644
index 0000000..bbb0fb3
--- /dev/null
+++ b/ios/bundlejs/landing.weex.js
@@ -0,0 +1,2319 @@
+// { "framework": "Vue" }
+"use weex:vue";
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, {
+/******/ 				configurable: false,
+/******/ 				enumerable: true,
+/******/ 				get: getter
+/******/ 			});
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = 37);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+var global = module.exports = typeof window != 'undefined' && window.Math == Math
+  ? window : typeof self != 'undefined' && self.Math == Math ? self
+  // eslint-disable-next-line no-new-func
+  : Function('return this')();
+if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports) {
+
+var hasOwnProperty = {}.hasOwnProperty;
+module.exports = function (it, key) {
+  return hasOwnProperty.call(it, key);
+};
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(3);
+var createDesc = __webpack_require__(12);
+module.exports = __webpack_require__(4) ? function (object, key, value) {
+  return dP.f(object, key, createDesc(1, value));
+} : function (object, key, value) {
+  object[key] = value;
+  return object;
+};
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(10);
+var IE8_DOM_DEFINE = __webpack_require__(29);
+var toPrimitive = __webpack_require__(17);
+var dP = Object.defineProperty;
+
+exports.f = __webpack_require__(4) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
+  anObject(O);
+  P = toPrimitive(P, true);
+  anObject(Attributes);
+  if (IE8_DOM_DEFINE) try {
+    return dP(O, P, Attributes);
+  } catch (e) { /* empty */ }
+  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
+  if ('value' in Attributes) O[P] = Attributes.value;
+  return O;
+};
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// Thank's IE8 for his funny defineProperty
+module.exports = !__webpack_require__(11)(function () {
+  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// to indexed object, toObject with fallback for non-array-like ES3 strings
+var IObject = __webpack_require__(51);
+var defined = __webpack_require__(16);
+module.exports = function (it) {
+  return IObject(defined(it));
+};
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var store = __webpack_require__(21)('wks');
+var uid = __webpack_require__(13);
+var Symbol = __webpack_require__(0).Symbol;
+var USE_SYMBOL = typeof Symbol == 'function';
+
+var $exports = module.exports = function (name) {
+  return store[name] || (store[name] =
+    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
+};
+
+$exports.store = store;
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports) {
+
+var core = module.exports = { version: '2.5.7' };
+if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+  return typeof it === 'object' ? it !== null : typeof it === 'function';
+};
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports) {
+
+module.exports = true;
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+module.exports = function (it) {
+  if (!isObject(it)) throw TypeError(it + ' is not an object!');
+  return it;
+};
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports) {
+
+module.exports = function (exec) {
+  try {
+    return !!exec();
+  } catch (e) {
+    return true;
+  }
+};
+
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports) {
+
+module.exports = function (bitmap, value) {
+  return {
+    enumerable: !(bitmap & 1),
+    configurable: !(bitmap & 2),
+    writable: !(bitmap & 4),
+    value: value
+  };
+};
+
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports) {
+
+var id = 0;
+var px = Math.random();
+module.exports = function (key) {
+  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
+};
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.fetchNews = exports.fetchDoodle = exports.readAbout = exports.saveAbout = exports.fetchAbout = exports.readGuide = exports.saveGuide = exports.fetchGuide = exports.readExamples = exports.saveExamples = exports.fetchExamples = undefined;
+
+var _stringify = __webpack_require__(40);
+
+var _stringify2 = _interopRequireDefault(_stringify);
+
+var _typeof2 = __webpack_require__(42);
+
+var _typeof3 = _interopRequireDefault(_typeof2);
+
+exports.createLink = createLink;
+exports.createURL = createURL;
+exports.i18n = i18n;
+exports.parseLanguage = parseLanguage;
+exports.setLanguage = setLanguage;
+exports.clearStorageLanguage = clearStorageLanguage;
+exports.getStorageLanguage = getStorageLanguage;
+exports.getSystemLanguage = getSystemLanguage;
+exports.getLanguage = getLanguage;
+exports.jumpTo = jumpTo;
+exports.viewSource = viewSource;
+exports.setTitleBar = setTitleBar;
+exports.fetchData = fetchData;
+exports.saveData = saveData;
+exports.readData = readData;
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var stream = weex.requireModule('stream');
+var storage = weex.requireModule('storage');
+var navigator = weex.requireModule('navigator');
+
+var encoder = typeof encodeURIComponent === 'function' ? encodeURIComponent : typeof encodeURI === 'function' ? encodeURI : function (x) {
+  return x;
+};
+
+function encodeParams(params) {
+  if (!params || (typeof params === 'undefined' ? 'undefined' : (0, _typeof3.default)(params)) !== 'object') {
+    return '';
+  }
+  var array = [];
+  for (var key in params) {
+    if (typeof params[key] === 'string') {
+      array.push(encoder(key) + '=' + encoder(params[key]));
+    }
+  }
+  return array.join('&');
+}
+
+function createLink(name) {
+  var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+  var args = [];
+  for (var key in params) {
+    if (typeof params[key] === 'string') {
+      args.push(encoder(key) + '=' + encoder(params[key]));
+    }
+  }
+  if (WXEnvironment.platform === 'Web') {
+    args.unshift('page=' + name + '.web.js');
+    return '/?' + args.join('&');
+  }
+  var base = getBaseURL();
+  return '' + base + name + '.weex.js' + (args.length ? '?' + args.join('&') : '');
+}
+
+function createURL(hash, params) {
+  if (WXEnvironment.platform === 'Web') {
+    return 'http://dotwe.org/raw/htmlVue/' + hash;
+  }
+  var url = 'http://dotwe.org/raw/dist/' + hash + '.bundle.wx';
+  var paramString = encodeParams(params);
+  if (WXEnvironment.appName === 'TB') {
+    return url + '?_wx_tpl=' + url + '&' + paramString;
+  }
+  if (WXEnvironment.appName === 'WXSample') {
+    return url + '?' + paramString;
+  }
+  return url + '?wx_weex=true&' + paramString;
+}
+
+function getBaseURL() {
+  var bundleUrl = weex.config.bundleUrl;
+  var isAndroidAssets = bundleUrl.indexOf('your_current_IP') >= 0 || bundleUrl.indexOf('file://assets/') >= 0;
+  var isiOSAssets = bundleUrl.indexOf('file:///') >= 0 && bundleUrl.indexOf('WeexDemo.app') > 0;
+  if (isAndroidAssets) {
+    return 'file://assets/';
+  } else if (isiOSAssets) {
+    // file:///var/mobile/Containers/Bundle/Application/{id}/WeexDemo.app/
+    // file:///Users/{user}/Library/Developer/CoreSimulator/Devices/{id}/data/Containers/Bundle/Application/{id}/WeexDemo.app/
+    return bundleUrl.substring(0, bundleUrl.lastIndexOf('/') + 1);
+  }
+  return '';
+}
+
+function i18n(text, language) {
+  if (typeof text === 'string') {
+    return text;
+  }
+  if (Object.prototype.toString.call(text) === '[object Object]') {
+    var lang = this && this.language || language || 'en';
+    return text[lang];
+  }
+}
+
+var supportedLanguageRE = /(en|zh)\_?\w*/i;
+function parseLanguage(language) {
+  var match = supportedLanguageRE.exec(language + '');
+  if (match && match[1]) {
+    return match[1];
+  }
+  return '';
+}
+
+function setLanguage(language) {
+  var lang = parseLanguage(language);
+  if (lang) {
+    storage.setItem('WEEX_PLAYGROUND_LANGUAGE', lang);
+  }
+}
+
+function clearStorageLanguage() {
+  storage.removeItem('WEEX_PLAYGROUND_LANGUAGE');
+}
+
+function getStorageLanguage(done) {
+  var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+  if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+    return;
+  }
+  try {
+    storage.getItem('WEEX_PLAYGROUND_LANGUAGE', function (event) {
+      if (event.result === 'success') {
+        var lang = parseLanguage(event.data);
+        lang ? done(lang) : fail();
+      } else {
+        fail(event);
+      }
+    });
+  } catch (err) {
+    fail(err);
+  }
+}
+
+function getSystemLanguage(done) {
+  var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+  if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+    return;
+  }
+  if (WXEnvironment.platform.toLowerCase() === 'web') {
+    var lang = parseLanguage(window.navigator.language);
+    lang ? done(lang) : fail();
+  } else {
+    try {
+      var locale = weex.requireModule('locale') || weex.requireModule('local');
+      var useSync = false;
+      var resSync = locale.getLanguage(function (language) {
+        var lang = parseLanguage(language);
+        if (lang) {
+          useSync || done(lang);
+        } else {
+          fail();
+        }
+      });
+      var langSync = parseLanguage(resSync);
+      if (langSync) {
+        useSync = true;
+        done(langSync);
+      } else {
+        fail();
+      }
+    } catch (e) {
+      fail(e);
+    }
+  }
+}
+
+var languageRE = /.+[\?\&]{1}language=([\d\w]+)[\?\&]?.*/i;
+function getLanguage() {
+  var done = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
+
+  var match = languageRE.exec(weex.config.bundleUrl || '');
+  var lang = parseLanguage(match && match[1]);
+  if (lang) {
+    done(lang);
+  } else {
+    getStorageLanguage(done, function () {
+      getSystemLanguage(done, function () {
+        done('en');
+      });
+    });
+  }
+}
+
+function jumpTo(url, title, lang) {
+  getLanguage(function (language) {
+    storage.setItem('CURRENT_DOCUMENT_URL', i18n(url, lang || language));
+    navigator.push({
+      url: createURL('bf0305c14b511b24a4e616f53926432b', { language: language, title: i18n(title, lang || language) })
+    });
+  });
+}
+
+function viewSource(hash) {
+  getLanguage(function (language) {
+    navigator.push({
+      url: createURL('f6ce29faf686eabc38b410bf4828fa5a', { hash: hash, language: language })
+    });
+  });
+}
+
+function setTitleBar(options) {
+  var language = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en';
+
+  if (Object.prototype.toString.apply(options) !== '[object Object]') {
+    return;
+  }
+  var titleBar = weex.requireModule('titleBar');
+  if (options.color || options.backgroundColor) {
+    try {
+      titleBar.setStyle({
+        foregroundColor: options.color || '#FFFFFF',
+        backgroundColor: options.backgroundColor || '#00B4FF'
+      });
+    } catch (e) {}
+  }
+  var title = i18n(options.title, language);
+  if (title) {
+    try {
+      titleBar.setTitle(title);
+    } catch (e) {}
+  }
+}
+
+var storageKeys = {
+  doodle: 'WEEX_PLAYGROUND_APP_DOODLE',
+  guide: 'WEEX_PLAYGROUND_APP_GUIDE',
+  examples: 'WEEX_PLAYGROUND_APP_EXAMPLES',
+  news: 'WEEX_PLAYGROUND_APP_NEWS',
+  about: 'WEEX_PLAYGROUND_APP_ABOUT'
+};
+function fetchData(name) {
+  var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+  var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+  try {
+    stream.fetch({
+      url: 'http://dotwe.org/query/weex-playground-app',
+      method: 'post',
+      headers: {
+        'Content-Type': 'application/x-www-form-urlencoded'
+      },
+      type: 'json',
+      body: 'name=' + name
+    }, function (res) {
+      if (res.ok && res.data && res.data.success) {
+        done(res.data);
+      } else {
+        fail(res);
+      }
+    });
+  } catch (err) {
+    fail(err);
+  }
+}
+function saveData(name, result) {
+  var key = storageKeys[name];
+  if (!key) return;
+  if (result && (typeof result === 'undefined' ? 'undefined' : (0, _typeof3.default)(result)) === 'object') {
+    result.timestamp = Date.now();
+    storage.setItem(key, (0, _stringify2.default)(result));
+  }
+}
+function readData(name) {
+  var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+  var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+  var key = storageKeys[name];
+  if (!key) return fail();
+  try {
+    storage.getItem(key, function (event) {
+      if (event.result === 'success') {
+        var result = JSON.parse(event.data);
+        if (result && Array.isArray(result[name])) {
+          return done(result[name]);
+        }
+      }
+      fail(event);
+    });
+  } catch (e) {
+    fail(e);
+  }
+}
+
+var fetchExamples = exports.fetchExamples = function fetchExamples() {
+  for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+    args[_key] = arguments[_key];
+  }
+
+  return fetchData.apply(undefined, ['examples'].concat(args));
+};
+var saveExamples = exports.saveExamples = function saveExamples() {
+  for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+    args[_key2] = arguments[_key2];
+  }
+
+  return saveData.apply(undefined, ['examples'].concat(args));
+};
+var readExamples = exports.readExamples = function readExamples() {
+  for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+    args[_key3] = arguments[_key3];
+  }
+
+  return readData.apply(undefined, ['examples'].concat(args));
+};
+
+var fetchGuide = exports.fetchGuide = function fetchGuide() {
+  for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+    args[_key4] = arguments[_key4];
+  }
+
+  return fetchData.apply(undefined, ['guide'].concat(args));
+};
+var saveGuide = exports.saveGuide = function saveGuide() {
+  for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
+    args[_key5] = arguments[_key5];
+  }
+
+  return saveData.apply(undefined, ['guide'].concat(args));
+};
+var readGuide = exports.readGuide = function readGuide() {
+  for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
+    args[_key6] = arguments[_key6];
+  }
+
+  return readData.apply(undefined, ['guide'].concat(args));
+};
+
+var fetchAbout = exports.fetchAbout = function fetchAbout() {
+  for (var _len7 = arguments.length, args = Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
+    args[_key7] = arguments[_key7];
+  }
+
+  return fetchData.apply(undefined, ['about'].concat(args));
+};
+var saveAbout = exports.saveAbout = function saveAbout() {
+  for (var _len8 = arguments.length, args = Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
+    args[_key8] = arguments[_key8];
+  }
+
+  return saveData.apply(undefined, ['about'].concat(args));
+};
+var readAbout = exports.readAbout = function readAbout() {
+  for (var _len9 = arguments.length, args = Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
+    args[_key9] = arguments[_key9];
+  }
+
+  return readData.apply(undefined, ['about'].concat(args));
+};
+
+var fetchDoodle = exports.fetchDoodle = function fetchDoodle() {
+  for (var _len10 = arguments.length, args = Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
+    args[_key10] = arguments[_key10];
+  }
+
+  return fetchData.apply(undefined, ['doodle'].concat(args));
+};
+var fetchNews = exports.fetchNews = function fetchNews() {
+  for (var _len11 = arguments.length, args = Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
+    args[_key11] = arguments[_key11];
+  }
+
+  return fetchData.apply(undefined, ['news'].concat(args));
+};
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports) {
+
+// 7.1.4 ToInteger
+var ceil = Math.ceil;
+var floor = Math.floor;
+module.exports = function (it) {
+  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+};
+
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports) {
+
+// 7.2.1 RequireObjectCoercible(argument)
+module.exports = function (it) {
+  if (it == undefined) throw TypeError("Can't call method on  " + it);
+  return it;
+};
+
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.1 ToPrimitive(input [, PreferredType])
+var isObject = __webpack_require__(8);
+// instead of the ES6 spec version, we didn't implement @@toPrimitive case
+// and the second argument - flag - preferred type is a string
+module.exports = function (it, S) {
+  if (!isObject(it)) return it;
+  var fn, val;
+  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
+  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+  throw TypeError("Can't convert object to primitive value");
+};
+
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports) {
+
+module.exports = {};
+
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.14 / 15.2.3.14 Object.keys(O)
+var $keys = __webpack_require__(33);
+var enumBugKeys = __webpack_require__(22);
+
+module.exports = Object.keys || function keys(O) {
+  return $keys(O, enumBugKeys);
+};
+
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var shared = __webpack_require__(21)('keys');
+var uid = __webpack_require__(13);
+module.exports = function (key) {
+  return shared[key] || (shared[key] = uid(key));
+};
+
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(7);
+var global = __webpack_require__(0);
+var SHARED = '__core-js_shared__';
+var store = global[SHARED] || (global[SHARED] = {});
+
+(module.exports = function (key, value) {
+  return store[key] || (store[key] = value !== undefined ? value : {});
+})('versions', []).push({
+  version: core.version,
+  mode: __webpack_require__(9) ? 'pure' : 'global',
+  copyright: '© 2018 Denis Pushkarev (zloirock.ru)'
+});
+
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports) {
+
+// IE 8- don't enum bug keys
+module.exports = (
+  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
+).split(',');
+
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var def = __webpack_require__(3).f;
+var has = __webpack_require__(1);
+var TAG = __webpack_require__(6)('toStringTag');
+
+module.exports = function (it, tag, stat) {
+  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
+};
+
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {
+
+exports.f = __webpack_require__(6);
+
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(7);
+var LIBRARY = __webpack_require__(9);
+var wksExt = __webpack_require__(24);
+var defineProperty = __webpack_require__(3).f;
+module.exports = function (name) {
+  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
+  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
+};
+
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports) {
+
+exports.f = {}.propertyIsEnumerable;
+
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var LIBRARY = __webpack_require__(9);
+var $export = __webpack_require__(28);
+var redefine = __webpack_require__(31);
+var hide = __webpack_require__(2);
+var Iterators = __webpack_require__(18);
+var $iterCreate = __webpack_require__(49);
+var setToStringTag = __webpack_require__(23);
+var getPrototypeOf = __webpack_require__(56);
+var ITERATOR = __webpack_require__(6)('iterator');
+var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
+var FF_ITERATOR = '@@iterator';
+var KEYS = 'keys';
+var VALUES = 'values';
+
+var returnThis = function () { return this; };
+
+module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
+  $iterCreate(Constructor, NAME, next);
+  var getMethod = function (kind) {
+    if (!BUGGY && kind in proto) return proto[kind];
+    switch (kind) {
+      case KEYS: return function keys() { return new Constructor(this, kind); };
+      case VALUES: return function values() { return new Constructor(this, kind); };
+    } return function entries() { return new Constructor(this, kind); };
+  };
+  var TAG = NAME + ' Iterator';
+  var DEF_VALUES = DEFAULT == VALUES;
+  var VALUES_BUG = false;
+  var proto = Base.prototype;
+  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
+  var $default = $native || getMethod(DEFAULT);
+  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
+  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
+  var methods, key, IteratorPrototype;
+  // Fix native
+  if ($anyNative) {
+    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
+    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
+      // Set @@toStringTag to native iterators
+      setToStringTag(IteratorPrototype, TAG, true);
+      // fix for some old engines
+      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
+    }
+  }
+  // fix Array#{values, @@iterator}.name in V8 / FF
+  if (DEF_VALUES && $native && $native.name !== VALUES) {
+    VALUES_BUG = true;
+    $default = function values() { return $native.call(this); };
+  }
+  // Define iterator
+  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
+    hide(proto, ITERATOR, $default);
+  }
+  // Plug for library
+  Iterators[NAME] = $default;
+  Iterators[TAG] = returnThis;
+  if (DEFAULT) {
+    methods = {
+      values: DEF_VALUES ? $default : getMethod(VALUES),
+      keys: IS_SET ? $default : getMethod(KEYS),
+      entries: $entries
+    };
+    if (FORCED) for (key in methods) {
+      if (!(key in proto)) redefine(proto, key, methods[key]);
+    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
+  }
+  return methods;
+};
+
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(7);
+var ctx = __webpack_require__(47);
+var hide = __webpack_require__(2);
+var has = __webpack_require__(1);
+var PROTOTYPE = 'prototype';
+
+var $export = function (type, name, source) {
+  var IS_FORCED = type & $export.F;
+  var IS_GLOBAL = type & $export.G;
+  var IS_STATIC = type & $export.S;
+  var IS_PROTO = type & $export.P;
+  var IS_BIND = type & $export.B;
+  var IS_WRAP = type & $export.W;
+  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
+  var expProto = exports[PROTOTYPE];
+  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];
+  var key, own, out;
+  if (IS_GLOBAL) source = name;
+  for (key in source) {
+    // contains in native
+    own = !IS_FORCED && target && target[key] !== undefined;
+    if (own && has(exports, key)) continue;
+    // export native or passed
+    out = own ? target[key] : source[key];
+    // prevent global pollution for namespaces
+    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
+    // bind timers to global for call from export context
+    : IS_BIND && own ? ctx(out, global)
+    // wrap global constructors for prevent change them in library
+    : IS_WRAP && target[key] == out ? (function (C) {
+      var F = function (a, b, c) {
+        if (this instanceof C) {
+          switch (arguments.length) {
+            case 0: return new C();
+            case 1: return new C(a);
+            case 2: return new C(a, b);
+          } return new C(a, b, c);
+        } return C.apply(this, arguments);
+      };
+      F[PROTOTYPE] = C[PROTOTYPE];
+      return F;
+    // make static versions for prototype methods
+    })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
+    // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
+    if (IS_PROTO) {
+      (exports.virtual || (exports.virtual = {}))[key] = out;
+      // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
+      if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);
+    }
+  }
+};
+// type bitmap
+$export.F = 1;   // forced
+$export.G = 2;   // global
+$export.S = 4;   // static
+$export.P = 8;   // proto
+$export.B = 16;  // bind
+$export.W = 32;  // wrap
+$export.U = 64;  // safe
+$export.R = 128; // real proto method for `library`
+module.exports = $export;
+
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = !__webpack_require__(4) && !__webpack_require__(11)(function () {
+  return Object.defineProperty(__webpack_require__(30)('div'), 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+var document = __webpack_require__(0).document;
+// typeof document.createElement is 'object' in old IE
+var is = isObject(document) && isObject(document.createElement);
+module.exports = function (it) {
+  return is ? document.createElement(it) : {};
+};
+
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(2);
+
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
+var anObject = __webpack_require__(10);
+var dPs = __webpack_require__(50);
+var enumBugKeys = __webpack_require__(22);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+var Empty = function () { /* empty */ };
+var PROTOTYPE = 'prototype';
+
+// Create object with fake `null` prototype: use iframe Object with cleared prototype
+var createDict = function () {
+  // Thrash, waste and sodomy: IE GC bug
+  var iframe = __webpack_require__(30)('iframe');
+  var i = enumBugKeys.length;
+  var lt = '<';
+  var gt = '>';
+  var iframeDocument;
+  iframe.style.display = 'none';
+  __webpack_require__(55).appendChild(iframe);
+  iframe.src = 'javascript:'; // eslint-disable-line no-script-url
+  // createDict = iframe.contentWindow.Object;
+  // html.removeChild(iframe);
+  iframeDocument = iframe.contentWindow.document;
+  iframeDocument.open();
+  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
+  iframeDocument.close();
+  createDict = iframeDocument.F;
+  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];
+  return createDict();
+};
+
+module.exports = Object.create || function create(O, Properties) {
+  var result;
+  if (O !== null) {
+    Empty[PROTOTYPE] = anObject(O);
+    result = new Empty();
+    Empty[PROTOTYPE] = null;
+    // add "__proto__" for Object.getPrototypeOf polyfill
+    result[IE_PROTO] = O;
+  } else result = createDict();
+  return Properties === undefined ? result : dPs(result, Properties);
+};
+
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var has = __webpack_require__(1);
+var toIObject = __webpack_require__(5);
+var arrayIndexOf = __webpack_require__(52)(false);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+
+module.exports = function (object, names) {
+  var O = toIObject(object);
+  var i = 0;
+  var result = [];
+  var key;
+  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);
+  // Don't enum bug & hidden keys
+  while (names.length > i) if (has(O, key = names[i++])) {
+    ~arrayIndexOf(result, key) || result.push(key);
+  }
+  return result;
+};
+
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports) {
+
+var toString = {}.toString;
+
+module.exports = function (it) {
+  return toString.call(it).slice(8, -1);
+};
+
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports) {
+
+exports.f = Object.getOwnPropertySymbols;
+
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
+var $keys = __webpack_require__(33);
+var hiddenKeys = __webpack_require__(22).concat('length', 'prototype');
+
+exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+  return $keys(O, hiddenKeys);
+};
+
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+__webpack_require__(38);
+
+var _utils = __webpack_require__(14);
+
+var utils = _interopRequireWildcard(_utils);
+
+var _Landing = __webpack_require__(73);
+
+var _Landing2 = _interopRequireDefault(_Landing);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+// hide title bar
+try {
+  var titleBar = weex.requireModule('titleBar');
+  titleBar.showTitleBar(false);
+} catch (e) {}
+
+// fetch and save examples
+setTimeout(function () {
+  utils.fetchExamples(utils.saveExamples);
+  utils.fetchGuide(utils.saveGuide);
+  utils.fetchAbout(utils.saveAbout);
+}, 10);
+
+_Landing2.default.el = '#root';
+new Vue(_Landing2.default);
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _mixin = __webpack_require__(39);
+
+var _mixin2 = _interopRequireDefault(_mixin);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// use shared mixins
+Vue.mixin(_mixin2.default);
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _index = __webpack_require__(14);
+
+var utils = _interopRequireWildcard(_index);
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+var storage = weex.requireModule('storage');
+
+exports.default = {
+  filters: {
+    i18n: utils.i18n,
+    url: utils.createURL,
+    link: utils.createLink
+  },
+  methods: {
+    createLink: utils.createLink,
+    createURL: utils.createURL,
+    i18n: utils.i18n,
+    getLanguage: utils.getLanguage,
+    fetchData: utils.fetchData,
+    saveData: utils.saveData,
+    readData: utils.readData,
+    jumpTo: utils.jumpTo
+  },
+  created: function created() {
+    var _this = this;
+
+    // get and set language
+    utils.getLanguage(function (language) {
+      _this.language = language;
+      utils.setTitleBar(_this.navigationBarOptions, language);
+    });
+
+    // listen to the language change event
+    var channel = new BroadcastChannel('language');
+    channel.onmessage = function (event) {
+      if (event.data && event.data.language) {
+        _this.language = event.data.language;
+      }
+    };
+  },
+  beforeDestroy: function beforeDestroy() {
+    storage.removeItem('CURRENT_DOCUMENT_URL');
+    storage.removeItem('CURRENT_SOURCE_HASH');
+  }
+};
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(41), __esModule: true };
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(7);
+var $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify });
+module.exports = function stringify(it) { // eslint-disable-line no-unused-vars
+  return $JSON.stringify.apply($JSON, arguments);
+};
+
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = true;
+
+var _iterator = __webpack_require__(43);
+
+var _iterator2 = _interopRequireDefault(_iterator);
+
+var _symbol = __webpack_require__(62);
+
+var _symbol2 = _interopRequireDefault(_symbol);
+
+var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
+  return typeof obj === "undefined" ? "undefined" : _typeof(obj);
+} : function (obj) {
+  return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
+};
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(44), __esModule: true };
+
+/***/ }),
+/* 44 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(45);
+__webpack_require__(58);
+module.exports = __webpack_require__(24).f('iterator');
+
+
+/***/ }),
+/* 45 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $at = __webpack_require__(46)(true);
+
+// 21.1.3.27 String.prototype[@@iterator]()
+__webpack_require__(27)(String, 'String', function (iterated) {
+  this._t = String(iterated); // target
+  this._i = 0;                // next index
+// 21.1.5.2.1 %StringIteratorPrototype%.next()
+}, function () {
+  var O = this._t;
+  var index = this._i;
+  var point;
+  if (index >= O.length) return { value: undefined, done: true };
+  point = $at(O, index);
+  this._i += point.length;
+  return { value: point, done: false };
+});
+
+
+/***/ }),
+/* 46 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(15);
+var defined = __webpack_require__(16);
+// true  -> String#at
+// false -> String#codePointAt
+module.exports = function (TO_STRING) {
+  return function (that, pos) {
+    var s = String(defined(that));
+    var i = toInteger(pos);
+    var l = s.length;
+    var a, b;
+    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
+    a = s.charCodeAt(i);
+    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
+      ? TO_STRING ? s.charAt(i) : a
+      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
+  };
+};
+
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// optional / simple context binding
+var aFunction = __webpack_require__(48);
+module.exports = function (fn, that, length) {
+  aFunction(fn);
+  if (that === undefined) return fn;
+  switch (length) {
+    case 1: return function (a) {
+      return fn.call(that, a);
+    };
+    case 2: return function (a, b) {
+      return fn.call(that, a, b);
+    };
+    case 3: return function (a, b, c) {
+      return fn.call(that, a, b, c);
+    };
+  }
+  return function (/* ...args */) {
+    return fn.apply(that, arguments);
+  };
+};
+
+
+/***/ }),
+/* 48 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+  if (typeof it != 'function') throw TypeError(it + ' is not a function!');
+  return it;
+};
+
+
+/***/ }),
+/* 49 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var create = __webpack_require__(32);
+var descriptor = __webpack_require__(12);
+var setToStringTag = __webpack_require__(23);
+var IteratorPrototype = {};
+
+// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
+__webpack_require__(2)(IteratorPrototype, __webpack_require__(6)('iterator'), function () { return this; });
+
+module.exports = function (Constructor, NAME, next) {
+  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
+  setToStringTag(Constructor, NAME + ' Iterator');
+};
+
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(3);
+var anObject = __webpack_require__(10);
+var getKeys = __webpack_require__(19);
+
+module.exports = __webpack_require__(4) ? Object.defineProperties : function defineProperties(O, Properties) {
+  anObject(O);
+  var keys = getKeys(Properties);
+  var length = keys.length;
+  var i = 0;
+  var P;
+  while (length > i) dP.f(O, P = keys[i++], Properties[P]);
+  return O;
+};
+
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for non-array-like ES3 and non-enumerable old V8 strings
+var cof = __webpack_require__(34);
+// eslint-disable-next-line no-prototype-builtins
+module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
+  return cof(it) == 'String' ? it.split('') : Object(it);
+};
+
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// false -> Array#indexOf
+// true  -> Array#includes
+var toIObject = __webpack_require__(5);
+var toLength = __webpack_require__(53);
+var toAbsoluteIndex = __webpack_require__(54);
+module.exports = function (IS_INCLUDES) {
+  return function ($this, el, fromIndex) {
+    var O = toIObject($this);
+    var length = toLength(O.length);
+    var index = toAbsoluteIndex(fromIndex, length);
+    var value;
+    // Array#includes uses SameValueZero equality algorithm
+    // eslint-disable-next-line no-self-compare
+    if (IS_INCLUDES && el != el) while (length > index) {
+      value = O[index++];
+      // eslint-disable-next-line no-self-compare
+      if (value != value) return true;
+    // Array#indexOf ignores holes, Array#includes - not
+    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
+      if (O[index] === el) return IS_INCLUDES || index || 0;
+    } return !IS_INCLUDES && -1;
+  };
+};
+
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.15 ToLength
+var toInteger = __webpack_require__(15);
+var min = Math.min;
+module.exports = function (it) {
+  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
+};
+
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(15);
+var max = Math.max;
+var min = Math.min;
+module.exports = function (index, length) {
+  index = toInteger(index);
+  return index < 0 ? max(index + length, 0) : min(index, length);
+};
+
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var document = __webpack_require__(0).document;
+module.exports = document && document.documentElement;
+
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
+var has = __webpack_require__(1);
+var toObject = __webpack_require__(57);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+var ObjectProto = Object.prototype;
+
+module.exports = Object.getPrototypeOf || function (O) {
+  O = toObject(O);
+  if (has(O, IE_PROTO)) return O[IE_PROTO];
+  if (typeof O.constructor == 'function' && O instanceof O.constructor) {
+    return O.constructor.prototype;
+  } return O instanceof Object ? ObjectProto : null;
+};
+
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.13 ToObject(argument)
+var defined = __webpack_require__(16);
+module.exports = function (it) {
+  return Object(defined(it));
+};
+
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(59);
+var global = __webpack_require__(0);
+var hide = __webpack_require__(2);
+var Iterators = __webpack_require__(18);
+var TO_STRING_TAG = __webpack_require__(6)('toStringTag');
+
+var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +
+  'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +
+  'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +
+  'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +
+  'TextTrackList,TouchList').split(',');
+
+for (var i = 0; i < DOMIterables.length; i++) {
+  var NAME = DOMIterables[i];
+  var Collection = global[NAME];
+  var proto = Collection && Collection.prototype;
+  if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
+  Iterators[NAME] = Iterators.Array;
+}
+
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var addToUnscopables = __webpack_require__(60);
+var step = __webpack_require__(61);
+var Iterators = __webpack_require__(18);
+var toIObject = __webpack_require__(5);
+
+// 22.1.3.4 Array.prototype.entries()
+// 22.1.3.13 Array.prototype.keys()
+// 22.1.3.29 Array.prototype.values()
+// 22.1.3.30 Array.prototype[@@iterator]()
+module.exports = __webpack_require__(27)(Array, 'Array', function (iterated, kind) {
+  this._t = toIObject(iterated); // target
+  this._i = 0;                   // next index
+  this._k = kind;                // kind
+// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
+}, function () {
+  var O = this._t;
+  var kind = this._k;
+  var index = this._i++;
+  if (!O || index >= O.length) {
+    this._t = undefined;
+    return step(1);
+  }
+  if (kind == 'keys') return step(0, index);
+  if (kind == 'values') return step(0, O[index]);
+  return step(0, [index, O[index]]);
+}, 'values');
+
+// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
+Iterators.Arguments = Iterators.Array;
+
+addToUnscopables('keys');
+addToUnscopables('values');
+addToUnscopables('entries');
+
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports) {
+
+module.exports = function () { /* empty */ };
+
+
+/***/ }),
+/* 61 */
+/***/ (function(module, exports) {
+
+module.exports = function (done, value) {
+  return { value: value, done: !!done };
+};
+
+
+/***/ }),
+/* 62 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(63), __esModule: true };
+
+/***/ }),
+/* 63 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(64);
+__webpack_require__(70);
+__webpack_require__(71);
+__webpack_require__(72);
+module.exports = __webpack_require__(7).Symbol;
+
+
+/***/ }),
+/* 64 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// ECMAScript 6 symbols shim
+var global = __webpack_require__(0);
+var has = __webpack_require__(1);
+var DESCRIPTORS = __webpack_require__(4);
+var $export = __webpack_require__(28);
+var redefine = __webpack_require__(31);
+var META = __webpack_require__(65).KEY;
+var $fails = __webpack_require__(11);
+var shared = __webpack_require__(21);
+var setToStringTag = __webpack_require__(23);
+var uid = __webpack_require__(13);
+var wks = __webpack_require__(6);
+var wksExt = __webpack_require__(24);
+var wksDefine = __webpack_require__(25);
+var enumKeys = __webpack_require__(66);
+var isArray = __webpack_require__(67);
+var anObject = __webpack_require__(10);
+var isObject = __webpack_require__(8);
+var toIObject = __webpack_require__(5);
+var toPrimitive = __webpack_require__(17);
+var createDesc = __webpack_require__(12);
+var _create = __webpack_require__(32);
+var gOPNExt = __webpack_require__(68);
+var $GOPD = __webpack_require__(69);
+var $DP = __webpack_require__(3);
+var $keys = __webpack_require__(19);
+var gOPD = $GOPD.f;
+var dP = $DP.f;
+var gOPN = gOPNExt.f;
+var $Symbol = global.Symbol;
+var $JSON = global.JSON;
+var _stringify = $JSON && $JSON.stringify;
+var PROTOTYPE = 'prototype';
+var HIDDEN = wks('_hidden');
+var TO_PRIMITIVE = wks('toPrimitive');
+var isEnum = {}.propertyIsEnumerable;
+var SymbolRegistry = shared('symbol-registry');
+var AllSymbols = shared('symbols');
+var OPSymbols = shared('op-symbols');
+var ObjectProto = Object[PROTOTYPE];
+var USE_NATIVE = typeof $Symbol == 'function';
+var QObject = global.QObject;
+// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
+var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
+
+// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
+var setSymbolDesc = DESCRIPTORS && $fails(function () {
+  return _create(dP({}, 'a', {
+    get: function () { return dP(this, 'a', { value: 7 }).a; }
+  })).a != 7;
+}) ? function (it, key, D) {
+  var protoDesc = gOPD(ObjectProto, key);
+  if (protoDesc) delete ObjectProto[key];
+  dP(it, key, D);
+  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
+} : dP;
+
+var wrap = function (tag) {
+  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
+  sym._k = tag;
+  return sym;
+};
+
+var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {
+  return typeof it == 'symbol';
+} : function (it) {
+  return it instanceof $Symbol;
+};
+
+var $defineProperty = function defineProperty(it, key, D) {
+  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
+  anObject(it);
+  key = toPrimitive(key, true);
+  anObject(D);
+  if (has(AllSymbols, key)) {
+    if (!D.enumerable) {
+      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
+      it[HIDDEN][key] = true;
+    } else {
+      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
+      D = _create(D, { enumerable: createDesc(0, false) });
+    } return setSymbolDesc(it, key, D);
+  } return dP(it, key, D);
+};
+var $defineProperties = function defineProperties(it, P) {
+  anObject(it);
+  var keys = enumKeys(P = toIObject(P));
+  var i = 0;
+  var l = keys.length;
+  var key;
+  while (l > i) $defineProperty(it, key = keys[i++], P[key]);
+  return it;
+};
+var $create = function create(it, P) {
+  return P === undefined ? _create(it) : $defineProperties(_create(it), P);
+};
+var $propertyIsEnumerable = function propertyIsEnumerable(key) {
+  var E = isEnum.call(this, key = toPrimitive(key, true));
+  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
+  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
+};
+var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
+  it = toIObject(it);
+  key = toPrimitive(key, true);
+  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
+  var D = gOPD(it, key);
+  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
+  return D;
+};
+var $getOwnPropertyNames = function getOwnPropertyNames(it) {
+  var names = gOPN(toIObject(it));
+  var result = [];
+  var i = 0;
+  var key;
+  while (names.length > i) {
+    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
+  } return result;
+};
+var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
+  var IS_OP = it === ObjectProto;
+  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
+  var result = [];
+  var i = 0;
+  var key;
+  while (names.length > i) {
+    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
+  } return result;
+};
+
+// 19.4.1.1 Symbol([description])
+if (!USE_NATIVE) {
+  $Symbol = function Symbol() {
+    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
+    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
+    var $set = function (value) {
+      if (this === ObjectProto) $set.call(OPSymbols, value);
+      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+      setSymbolDesc(this, tag, createDesc(1, value));
+    };
+    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
+    return wrap(tag);
+  };
+  redefine($Symbol[PROTOTYPE], 'toString', function toString() {
+    return this._k;
+  });
+
+  $GOPD.f = $getOwnPropertyDescriptor;
+  $DP.f = $defineProperty;
+  __webpack_require__(36).f = gOPNExt.f = $getOwnPropertyNames;
+  __webpack_require__(26).f = $propertyIsEnumerable;
+  __webpack_require__(35).f = $getOwnPropertySymbols;
+
+  if (DESCRIPTORS && !__webpack_require__(9)) {
+    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
+  }
+
+  wksExt.f = function (name) {
+    return wrap(wks(name));
+  };
+}
+
+$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });
+
+for (var es6Symbols = (
+  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
+  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
+).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);
+
+for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);
+
+$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
+  // 19.4.2.1 Symbol.for(key)
+  'for': function (key) {
+    return has(SymbolRegistry, key += '')
+      ? SymbolRegistry[key]
+      : SymbolRegistry[key] = $Symbol(key);
+  },
+  // 19.4.2.5 Symbol.keyFor(sym)
+  keyFor: function keyFor(sym) {
+    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
+    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
+  },
+  useSetter: function () { setter = true; },
+  useSimple: function () { setter = false; }
+});
+
+$export($export.S + $export.F * !USE_NATIVE, 'Object', {
+  // 19.1.2.2 Object.create(O [, Properties])
+  create: $create,
+  // 19.1.2.4 Object.defineProperty(O, P, Attributes)
+  defineProperty: $defineProperty,
+  // 19.1.2.3 Object.defineProperties(O, Properties)
+  defineProperties: $defineProperties,
+  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
+  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
+  // 19.1.2.7 Object.getOwnPropertyNames(O)
+  getOwnPropertyNames: $getOwnPropertyNames,
+  // 19.1.2.8 Object.getOwnPropertySymbols(O)
+  getOwnPropertySymbols: $getOwnPropertySymbols
+});
+
+// 24.3.2 JSON.stringify(value [, replacer [, space]])
+$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
+  var S = $Symbol();
+  // MS Edge converts symbol values to JSON as {}
+  // WebKit converts symbol values to JSON as null
+  // V8 throws on boxed symbols
+  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
+})), 'JSON', {
+  stringify: function stringify(it) {
+    var args = [it];
+    var i = 1;
+    var replacer, $replacer;
+    while (arguments.length > i) args.push(arguments[i++]);
+    $replacer = replacer = args[1];
+    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
+    if (!isArray(replacer)) replacer = function (key, value) {
+      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
+      if (!isSymbol(value)) return value;
+    };
+    args[1] = replacer;
+    return _stringify.apply($JSON, args);
+  }
+});
+
+// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
+$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(2)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
+// 19.4.3.5 Symbol.prototype[@@toStringTag]
+setToStringTag($Symbol, 'Symbol');
+// 20.2.1.9 Math[@@toStringTag]
+setToStringTag(Math, 'Math', true);
+// 24.3.3 JSON[@@toStringTag]
+setToStringTag(global.JSON, 'JSON', true);
+
+
+/***/ }),
+/* 65 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var META = __webpack_require__(13)('meta');
+var isObject = __webpack_require__(8);
+var has = __webpack_require__(1);
+var setDesc = __webpack_require__(3).f;
+var id = 0;
+var isExtensible = Object.isExtensible || function () {
+  return true;
+};
+var FREEZE = !__webpack_require__(11)(function () {
+  return isExtensible(Object.preventExtensions({}));
+});
+var setMeta = function (it) {
+  setDesc(it, META, { value: {
+    i: 'O' + ++id, // object ID
+    w: {}          // weak collections IDs
+  } });
+};
+var fastKey = function (it, create) {
+  // return primitive with prefix
+  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+  if (!has(it, META)) {
+    // can't set metadata to uncaught frozen object
+    if (!isExtensible(it)) return 'F';
+    // not necessary to add metadata
+    if (!create) return 'E';
+    // add missing metadata
+    setMeta(it);
+  // return object ID
+  } return it[META].i;
+};
+var getWeak = function (it, create) {
+  if (!has(it, META)) {
+    // can't set metadata to uncaught frozen object
+    if (!isExtensible(it)) return true;
+    // not necessary to add metadata
+    if (!create) return false;
+    // add missing metadata
+    setMeta(it);
+  // return hash weak collections IDs
+  } return it[META].w;
+};
+// add metadata on freeze-family methods calling
+var onFreeze = function (it) {
+  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
+  return it;
+};
+var meta = module.exports = {
+  KEY: META,
+  NEED: false,
+  fastKey: fastKey,
+  getWeak: getWeak,
+  onFreeze: onFreeze
+};
+
+
+/***/ }),
+/* 66 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// all enumerable object keys, includes symbols
+var getKeys = __webpack_require__(19);
+var gOPS = __webpack_require__(35);
+var pIE = __webpack_require__(26);
+module.exports = function (it) {
+  var result = getKeys(it);
+  var getSymbols = gOPS.f;
+  if (getSymbols) {
+    var symbols = getSymbols(it);
+    var isEnum = pIE.f;
+    var i = 0;
+    var key;
+    while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
+  } return result;
+};
+
+
+/***/ }),
+/* 67 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.2.2 IsArray(argument)
+var cof = __webpack_require__(34);
+module.exports = Array.isArray || function isArray(arg) {
+  return cof(arg) == 'Array';
+};
+
+
+/***/ }),
+/* 68 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
+var toIObject = __webpack_require__(5);
+var gOPN = __webpack_require__(36).f;
+var toString = {}.toString;
+
+var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
+  ? Object.getOwnPropertyNames(window) : [];
+
+var getWindowNames = function (it) {
+  try {
+    return gOPN(it);
+  } catch (e) {
+    return windowNames.slice();
+  }
+};
+
+module.exports.f = function getOwnPropertyNames(it) {
+  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
+};
+
+
+/***/ }),
+/* 69 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var pIE = __webpack_require__(26);
+var createDesc = __webpack_require__(12);
+var toIObject = __webpack_require__(5);
+var toPrimitive = __webpack_require__(17);
+var has = __webpack_require__(1);
+var IE8_DOM_DEFINE = __webpack_require__(29);
+var gOPD = Object.getOwnPropertyDescriptor;
+
+exports.f = __webpack_require__(4) ? gOPD : function getOwnPropertyDescriptor(O, P) {
+  O = toIObject(O);
+  P = toPrimitive(P, true);
+  if (IE8_DOM_DEFINE) try {
+    return gOPD(O, P);
+  } catch (e) { /* empty */ }
+  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
+};
+
+
+/***/ }),
+/* 70 */
+/***/ (function(module, exports) {
+
+
+
+/***/ }),
+/* 71 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(25)('asyncIterator');
+
+
+/***/ }),
+/* 72 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(25)('observable');
+
+
+/***/ }),
+/* 73 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(74)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(75)
+
+/* template */
+var __vue_template__ = __webpack_require__(80)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+  typeof __vue_exports__.default === "object" ||
+  typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+  __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/pages/landing/Landing.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-6b061736"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+  for (var name in module) {
+    __vue_options__.style[name] = module[name]
+  }
+})
+if (typeof __register_static_styles__ === "function") {
+  __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 74 */
+/***/ (function(module, exports) {
+
+module.exports = {
+  "doodle": {
+    "width": "750",
+    "height": "880"
+  },
+  "menu-list": {
+    "flex": 1
+  },
+  "menu-row": {
+    "flex": 1,
+    "flexDirection": "row",
+    "justifyContent": "center",
+    "borderTopWidth": "1",
+    "borderTopStyle": "solid",
+    "borderTopColor": "#CCCCCC"
+  },
+  "menu-item": {
+    "flex": 1,
+    "backgroundColor": "#FBFBFB",
+    "justifyContent": "center",
+    "paddingTop": "50",
+    "paddingBottom": "50",
+    "backgroundColor:active": "#F2F2F2"
+  },
+  "menu-item-1": {
+    "borderRightWidth": "1",
+    "borderRightStyle": "solid",
+    "borderRightColor": "#CCCCCC"
+  },
+  "menu-text": {
+    "textAlign": "center",
+    "fontSize": "52",
+    "fontWeight": "bold",
+    "color": "#8B8B8B"
+  },
+  "menu-text-zh": {
+    "fontSize": "56"
+  }
+}
+
+/***/ }),
+/* 75 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _Doodle = __webpack_require__(76);
+
+var _Doodle2 = _interopRequireDefault(_Doodle);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = {
+  components: { Doodle: _Doodle2.default },
+  data: function data() {
+    return {
+      language: 'en',
+      menus: [[{ name: 'guide', title: { en: 'Guide', zh: '教程' } }, { name: 'examples', title: { en: 'Examples', zh: '实例' } }], [{ name: 'news', title: { en: 'News', zh: '资讯' } }, { name: 'about', title: { en: 'About', zh: '关于' } }]]
+    };
+  }
+}; //
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+/***/ }),
+/* 76 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(77)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(78)
+
+/* template */
+var __vue_template__ = __webpack_require__(79)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+  typeof __vue_exports__.default === "object" ||
+  typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+  __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/components/Doodle.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-d429dafa"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+  for (var name in module) {
+    __vue_options__.style[name] = module[name]
+  }
+})
+if (typeof __register_static_styles__ === "function") {
+  __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 77 */
+/***/ (function(module, exports) {
+
+module.exports = {
+  "wrapper": {
+    "alignItems": "center",
+    "justifyContent": "space-between",
+    "backgroundColor": "#FFFFFF"
+  },
+  "center": {
+    "alignItems": "center",
+    "justifyContent": "center"
+  },
+  "logo": {
+    "width": "750",
+    "height": "318"
+  },
+  "btn": {
+    "width": "450",
+    "height": "160",
+    "marginTop": "50",
+    "marginRight": "50",
+    "marginBottom": "50",
+    "marginLeft": "50",
+    "opacity": 0.7,
+    "opacity:active": 1
+  },
+  "scan-bg": {
+    "width": "450",
+    "height": "160",
+    "position": "absolute",
+    "top": 0,
+    "left": 0
+  },
+  "btn-text": {
+    "color": "#505050",
+    "fontSize": "56",
+    "textAlign": "center"
+  },
+  "btn-text-zh": {
+    "fontSize": "64"
+  }
+}
+
+/***/ }),
+/* 78 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _utils = __webpack_require__(14);
+
+var modal = weex.requireModule('modal'); //
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+var navigator = weex.requireModule('navigator');
+var event = weex.requireModule('event');
+
+function isValidDoodle(doodle) {
+  var now = new Date().getTime();
+  return doodle && doodle.src && parseInt(doodle.from, 10) < now && now < parseInt(doodle.to, 10);
+}
+
+exports.default = {
+  props: ['lang'],
+  data: function data() {
+    return {
+      language: this.lang || 'en',
+      showDoodle: false,
+      seenDoodle: false,
+      SCAN: { en: 'Scan QR Code', zh: '扫描二维码' },
+      doodle: {}
+    };
+  },
+  beforeCreate: function beforeCreate() {
+    var _this = this;
+
+    (0, _utils.fetchDoodle)(function (_ref) {
+      var doodle = _ref.doodle;
+
+      if (isValidDoodle(doodle) && !_this.seenDoodle) {
+        _this.doodle = doodle;
+        _this.showDoodle = true;
+        doodle.duration && setTimeout(function () {
+          _this.showDoodle = false;
+          _this.seenDoodle = true;
+        }, parseInt(doodle.duration, 10));
+      }
+    });
+  },
+
+  methods: {
+    scan: function scan() {
+      try {
+        event.openURL('weex://go/scan');
+      } catch (e) {
+        try {
+          navigator.push({ url: 'weex://go/scan' });
+        } catch (e) {}
+      }
+    },
+    magic: function magic() {
+      if (this.doodle && this.doodle.next) {
+        this.showDoodle = false;
+        navigator.push({
+          url: this.createURL(this.doodle.next, {
+            language: this.language
+          })
+        });
+      }
+    }
+  }
+};
+
+/***/ }),
+/* 79 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+  return _c('div', {
+    staticClass: ["wrapper"]
+  }, [(_vm.showDoodle && _vm.doodle.src) ? _c('embed', {
+    staticStyle: {
+      flex: "1"
+    },
+    attrs: {
+      "src": _vm._f("url")(_vm.doodle.src)
+    },
+    on: {
+      "click": _vm.magic
+    }
+  }) : _c('div', {
+    staticClass: ["center"],
+    staticStyle: {
+      flex: "1"
+    }
+  }, [_c('image', {
+    staticClass: ["logo"],
+    attrs: {
+      "src": "https://gw.alicdn.com/tfs/TB1Q9VBkRfH8KJjy1XbXXbLdXXa-3799-1615.png"
+    }
+  }), _c('div', {
+    staticClass: ["btn", "center"],
+    on: {
+      "click": _vm.scan
+    }
+  }, [_c('image', {
+    staticClass: ["scan-bg"],
+    attrs: {
+      "src": "https://gw.alicdn.com/tfs/TB1qnO0kLDH8KJjy1XcXXcpdXXa-900-320.png"
+    }
+  }), _c('text', {
+    class: ['btn-text', 'btn-text-' + _vm.language]
+  }, [_vm._v(_vm._s(_vm.i18n(_vm.SCAN)))])])])])
+},staticRenderFns: []}
+module.exports.render._withStripped = true
+
+/***/ }),
+/* 80 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+  return _c('div', {
+    staticClass: ["wrapper"]
+  }, [_c('doodle', {
+    staticClass: ["doodle"],
+    attrs: {
+      "lang": _vm.language
+    }
+  }), _c('div', {
+    staticClass: ["menu-list"]
+  }, _vm._l((_vm.menus), function(row, r) {
+    return _c('div', {
+      key: r,
+      class: ['menu-row', ("menu-row-" + (r+1))]
+    }, _vm._l((row), function(menu, i) {
+      return _c('a', {
+        key: menu.name,
+        class: ['menu-item', ("menu-item-" + (i+1))],
+        attrs: {
+          "href": _vm._f("link")(menu.name, {
+            language: _vm.language
+          })
+        }
+      }, [_c('text', {
+        class: ['menu-text', ("menu-text-" + _vm.language)]
+      }, [_vm._v(_vm._s(_vm.i18n(menu.title)))])])
+    }))
+  }))], 1)
+},staticRenderFns: []}
+module.exports.render._withStripped = true
+
+/***/ })
+/******/ ]);
\ No newline at end of file
diff --git a/ios/bundlejs/news.weex.js b/ios/bundlejs/news.weex.js
new file mode 100644
index 0000000..b8fc988
--- /dev/null
+++ b/ios/bundlejs/news.weex.js
@@ -0,0 +1,2266 @@
+// { "framework": "Vue" }
+"use weex:vue";
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, {
+/******/ 				configurable: false,
+/******/ 				enumerable: true,
+/******/ 				get: getter
+/******/ 			});
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = 37);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+var global = module.exports = typeof window != 'undefined' && window.Math == Math
+  ? window : typeof self != 'undefined' && self.Math == Math ? self
+  // eslint-disable-next-line no-new-func
+  : Function('return this')();
+if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports) {
+
+var hasOwnProperty = {}.hasOwnProperty;
+module.exports = function (it, key) {
+  return hasOwnProperty.call(it, key);
+};
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(3);
+var createDesc = __webpack_require__(12);
+module.exports = __webpack_require__(4) ? function (object, key, value) {
+  return dP.f(object, key, createDesc(1, value));
+} : function (object, key, value) {
+  object[key] = value;
+  return object;
+};
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(10);
+var IE8_DOM_DEFINE = __webpack_require__(29);
+var toPrimitive = __webpack_require__(16);
+var dP = Object.defineProperty;
+
+exports.f = __webpack_require__(4) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
+  anObject(O);
+  P = toPrimitive(P, true);
+  anObject(Attributes);
+  if (IE8_DOM_DEFINE) try {
+    return dP(O, P, Attributes);
+  } catch (e) { /* empty */ }
+  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
+  if ('value' in Attributes) O[P] = Attributes.value;
+  return O;
+};
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// Thank's IE8 for his funny defineProperty
+module.exports = !__webpack_require__(11)(function () {
+  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// to indexed object, toObject with fallback for non-array-like ES3 strings
+var IObject = __webpack_require__(51);
+var defined = __webpack_require__(15);
+module.exports = function (it) {
+  return IObject(defined(it));
+};
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var store = __webpack_require__(20)('wks');
+var uid = __webpack_require__(13);
+var Symbol = __webpack_require__(0).Symbol;
+var USE_SYMBOL = typeof Symbol == 'function';
+
+var $exports = module.exports = function (name) {
+  return store[name] || (store[name] =
+    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
+};
+
+$exports.store = store;
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports) {
+
+var core = module.exports = { version: '2.5.7' };
+if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+  return typeof it === 'object' ? it !== null : typeof it === 'function';
+};
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports) {
+
+module.exports = true;
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+module.exports = function (it) {
+  if (!isObject(it)) throw TypeError(it + ' is not an object!');
+  return it;
+};
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports) {
+
+module.exports = function (exec) {
+  try {
+    return !!exec();
+  } catch (e) {
+    return true;
+  }
+};
+
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports) {
+
+module.exports = function (bitmap, value) {
+  return {
+    enumerable: !(bitmap & 1),
+    configurable: !(bitmap & 2),
+    writable: !(bitmap & 4),
+    value: value
+  };
+};
+
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports) {
+
+var id = 0;
+var px = Math.random();
+module.exports = function (key) {
+  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
+};
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports) {
+
+// 7.1.4 ToInteger
+var ceil = Math.ceil;
+var floor = Math.floor;
+module.exports = function (it) {
+  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+};
+
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports) {
+
+// 7.2.1 RequireObjectCoercible(argument)
+module.exports = function (it) {
+  if (it == undefined) throw TypeError("Can't call method on  " + it);
+  return it;
+};
+
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.1 ToPrimitive(input [, PreferredType])
+var isObject = __webpack_require__(8);
+// instead of the ES6 spec version, we didn't implement @@toPrimitive case
+// and the second argument - flag - preferred type is a string
+module.exports = function (it, S) {
+  if (!isObject(it)) return it;
+  var fn, val;
+  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
+  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+  throw TypeError("Can't convert object to primitive value");
+};
+
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports) {
+
+module.exports = {};
+
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.14 / 15.2.3.14 Object.keys(O)
+var $keys = __webpack_require__(33);
+var enumBugKeys = __webpack_require__(21);
+
+module.exports = Object.keys || function keys(O) {
+  return $keys(O, enumBugKeys);
+};
+
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var shared = __webpack_require__(20)('keys');
+var uid = __webpack_require__(13);
+module.exports = function (key) {
+  return shared[key] || (shared[key] = uid(key));
+};
+
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(7);
+var global = __webpack_require__(0);
+var SHARED = '__core-js_shared__';
+var store = global[SHARED] || (global[SHARED] = {});
+
+(module.exports = function (key, value) {
+  return store[key] || (store[key] = value !== undefined ? value : {});
+})('versions', []).push({
+  version: core.version,
+  mode: __webpack_require__(9) ? 'pure' : 'global',
+  copyright: '© 2018 Denis Pushkarev (zloirock.ru)'
+});
+
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports) {
+
+// IE 8- don't enum bug keys
+module.exports = (
+  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
+).split(',');
+
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var def = __webpack_require__(3).f;
+var has = __webpack_require__(1);
+var TAG = __webpack_require__(6)('toStringTag');
+
+module.exports = function (it, tag, stat) {
+  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
+};
+
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __webpack_require__) {
+
+exports.f = __webpack_require__(6);
+
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(7);
+var LIBRARY = __webpack_require__(9);
+var wksExt = __webpack_require__(23);
+var defineProperty = __webpack_require__(3).f;
+module.exports = function (name) {
+  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
+  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
+};
+
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports) {
+
+exports.f = {}.propertyIsEnumerable;
+
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.fetchNews = exports.fetchDoodle = exports.readAbout = exports.saveAbout = exports.fetchAbout = exports.readGuide = exports.saveGuide = exports.fetchGuide = exports.readExamples = exports.saveExamples = exports.fetchExamples = undefined;
+
+var _stringify = __webpack_require__(40);
+
+var _stringify2 = _interopRequireDefault(_stringify);
+
+var _typeof2 = __webpack_require__(42);
+
+var _typeof3 = _interopRequireDefault(_typeof2);
+
+exports.createLink = createLink;
+exports.createURL = createURL;
+exports.i18n = i18n;
+exports.parseLanguage = parseLanguage;
+exports.setLanguage = setLanguage;
+exports.clearStorageLanguage = clearStorageLanguage;
+exports.getStorageLanguage = getStorageLanguage;
+exports.getSystemLanguage = getSystemLanguage;
+exports.getLanguage = getLanguage;
+exports.jumpTo = jumpTo;
+exports.viewSource = viewSource;
+exports.setTitleBar = setTitleBar;
+exports.fetchData = fetchData;
+exports.saveData = saveData;
+exports.readData = readData;
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var stream = weex.requireModule('stream');
+var storage = weex.requireModule('storage');
+var navigator = weex.requireModule('navigator');
+
+var encoder = typeof encodeURIComponent === 'function' ? encodeURIComponent : typeof encodeURI === 'function' ? encodeURI : function (x) {
+  return x;
+};
+
+function encodeParams(params) {
+  if (!params || (typeof params === 'undefined' ? 'undefined' : (0, _typeof3.default)(params)) !== 'object') {
+    return '';
+  }
+  var array = [];
+  for (var key in params) {
+    if (typeof params[key] === 'string') {
+      array.push(encoder(key) + '=' + encoder(params[key]));
+    }
+  }
+  return array.join('&');
+}
+
+function createLink(name) {
+  var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+  var args = [];
+  for (var key in params) {
+    if (typeof params[key] === 'string') {
+      args.push(encoder(key) + '=' + encoder(params[key]));
+    }
+  }
+  if (WXEnvironment.platform === 'Web') {
+    args.unshift('page=' + name + '.web.js');
+    return '/?' + args.join('&');
+  }
+  var base = getBaseURL();
+  return '' + base + name + '.weex.js' + (args.length ? '?' + args.join('&') : '');
+}
+
+function createURL(hash, params) {
+  if (WXEnvironment.platform === 'Web') {
+    return 'http://dotwe.org/raw/htmlVue/' + hash;
+  }
+  var url = 'http://dotwe.org/raw/dist/' + hash + '.bundle.wx';
+  var paramString = encodeParams(params);
+  if (WXEnvironment.appName === 'TB') {
+    return url + '?_wx_tpl=' + url + '&' + paramString;
+  }
+  if (WXEnvironment.appName === 'WXSample') {
+    return url + '?' + paramString;
+  }
+  return url + '?wx_weex=true&' + paramString;
+}
+
+function getBaseURL() {
+  var bundleUrl = weex.config.bundleUrl;
+  var isAndroidAssets = bundleUrl.indexOf('your_current_IP') >= 0 || bundleUrl.indexOf('file://assets/') >= 0;
+  var isiOSAssets = bundleUrl.indexOf('file:///') >= 0 && bundleUrl.indexOf('WeexDemo.app') > 0;
+  if (isAndroidAssets) {
+    return 'file://assets/';
+  } else if (isiOSAssets) {
+    // file:///var/mobile/Containers/Bundle/Application/{id}/WeexDemo.app/
+    // file:///Users/{user}/Library/Developer/CoreSimulator/Devices/{id}/data/Containers/Bundle/Application/{id}/WeexDemo.app/
+    return bundleUrl.substring(0, bundleUrl.lastIndexOf('/') + 1);
+  }
+  return '';
+}
+
+function i18n(text, language) {
+  if (typeof text === 'string') {
+    return text;
+  }
+  if (Object.prototype.toString.call(text) === '[object Object]') {
+    var lang = this && this.language || language || 'en';
+    return text[lang];
+  }
+}
+
+var supportedLanguageRE = /(en|zh)\_?\w*/i;
+function parseLanguage(language) {
+  var match = supportedLanguageRE.exec(language + '');
+  if (match && match[1]) {
+    return match[1];
+  }
+  return '';
+}
+
+function setLanguage(language) {
+  var lang = parseLanguage(language);
+  if (lang) {
+    storage.setItem('WEEX_PLAYGROUND_LANGUAGE', lang);
+  }
+}
+
+function clearStorageLanguage() {
+  storage.removeItem('WEEX_PLAYGROUND_LANGUAGE');
+}
+
+function getStorageLanguage(done) {
+  var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+  if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+    return;
+  }
+  try {
+    storage.getItem('WEEX_PLAYGROUND_LANGUAGE', function (event) {
+      if (event.result === 'success') {
+        var lang = parseLanguage(event.data);
+        lang ? done(lang) : fail();
+      } else {
+        fail(event);
+      }
+    });
+  } catch (err) {
+    fail(err);
+  }
+}
+
+function getSystemLanguage(done) {
+  var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+  if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+    return;
+  }
+  if (WXEnvironment.platform.toLowerCase() === 'web') {
+    var lang = parseLanguage(window.navigator.language);
+    lang ? done(lang) : fail();
+  } else {
+    try {
+      var locale = weex.requireModule('locale') || weex.requireModule('local');
+      var useSync = false;
+      var resSync = locale.getLanguage(function (language) {
+        var lang = parseLanguage(language);
+        if (lang) {
+          useSync || done(lang);
+        } else {
+          fail();
+        }
+      });
+      var langSync = parseLanguage(resSync);
+      if (langSync) {
+        useSync = true;
+        done(langSync);
+      } else {
+        fail();
+      }
+    } catch (e) {
+      fail(e);
+    }
+  }
+}
+
+var languageRE = /.+[\?\&]{1}language=([\d\w]+)[\?\&]?.*/i;
+function getLanguage() {
+  var done = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
+
+  var match = languageRE.exec(weex.config.bundleUrl || '');
+  var lang = parseLanguage(match && match[1]);
+  if (lang) {
+    done(lang);
+  } else {
+    getStorageLanguage(done, function () {
+      getSystemLanguage(done, function () {
+        done('en');
+      });
+    });
+  }
+}
+
+function jumpTo(url, title, lang) {
+  getLanguage(function (language) {
+    storage.setItem('CURRENT_DOCUMENT_URL', i18n(url, lang || language));
+    navigator.push({
+      url: createURL('bf0305c14b511b24a4e616f53926432b', { language: language, title: i18n(title, lang || language) })
+    });
+  });
+}
+
+function viewSource(hash) {
+  getLanguage(function (language) {
+    navigator.push({
+      url: createURL('f6ce29faf686eabc38b410bf4828fa5a', { hash: hash, language: language })
+    });
+  });
+}
+
+function setTitleBar(options) {
+  var language = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en';
+
+  if (Object.prototype.toString.apply(options) !== '[object Object]') {
+    return;
+  }
+  var titleBar = weex.requireModule('titleBar');
+  if (options.color || options.backgroundColor) {
+    try {
+      titleBar.setStyle({
+        foregroundColor: options.color || '#FFFFFF',
+        backgroundColor: options.backgroundColor || '#00B4FF'
+      });
+    } catch (e) {}
+  }
+  var title = i18n(options.title, language);
+  if (title) {
+    try {
+      titleBar.setTitle(title);
+    } catch (e) {}
+  }
+}
+
+var storageKeys = {
+  doodle: 'WEEX_PLAYGROUND_APP_DOODLE',
+  guide: 'WEEX_PLAYGROUND_APP_GUIDE',
+  examples: 'WEEX_PLAYGROUND_APP_EXAMPLES',
+  news: 'WEEX_PLAYGROUND_APP_NEWS',
+  about: 'WEEX_PLAYGROUND_APP_ABOUT'
+};
+function fetchData(name) {
+  var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+  var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+  try {
+    stream.fetch({
+      url: 'http://dotwe.org/query/weex-playground-app',
+      method: 'post',
+      headers: {
+        'Content-Type': 'application/x-www-form-urlencoded'
+      },
+      type: 'json',
+      body: 'name=' + name
+    }, function (res) {
+      if (res.ok && res.data && res.data.success) {
+        done(res.data);
+      } else {
+        fail(res);
+      }
+    });
+  } catch (err) {
+    fail(err);
+  }
+}
+function saveData(name, result) {
+  var key = storageKeys[name];
+  if (!key) return;
+  if (result && (typeof result === 'undefined' ? 'undefined' : (0, _typeof3.default)(result)) === 'object') {
+    result.timestamp = Date.now();
+    storage.setItem(key, (0, _stringify2.default)(result));
+  }
+}
+function readData(name) {
+  var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+  var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+  var key = storageKeys[name];
+  if (!key) return fail();
+  try {
+    storage.getItem(key, function (event) {
+      if (event.result === 'success') {
+        var result = JSON.parse(event.data);
+        if (result && Array.isArray(result[name])) {
+          return done(result[name]);
+        }
+      }
+      fail(event);
+    });
+  } catch (e) {
+    fail(e);
+  }
+}
+
+var fetchExamples = exports.fetchExamples = function fetchExamples() {
+  for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+    args[_key] = arguments[_key];
+  }
+
+  return fetchData.apply(undefined, ['examples'].concat(args));
+};
+var saveExamples = exports.saveExamples = function saveExamples() {
+  for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+    args[_key2] = arguments[_key2];
+  }
+
+  return saveData.apply(undefined, ['examples'].concat(args));
+};
+var readExamples = exports.readExamples = function readExamples() {
+  for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+    args[_key3] = arguments[_key3];
+  }
+
+  return readData.apply(undefined, ['examples'].concat(args));
+};
+
+var fetchGuide = exports.fetchGuide = function fetchGuide() {
+  for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+    args[_key4] = arguments[_key4];
+  }
+
+  return fetchData.apply(undefined, ['guide'].concat(args));
+};
+var saveGuide = exports.saveGuide = function saveGuide() {
+  for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
+    args[_key5] = arguments[_key5];
+  }
+
+  return saveData.apply(undefined, ['guide'].concat(args));
+};
+var readGuide = exports.readGuide = function readGuide() {
+  for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
+    args[_key6] = arguments[_key6];
+  }
+
+  return readData.apply(undefined, ['guide'].concat(args));
+};
+
+var fetchAbout = exports.fetchAbout = function fetchAbout() {
+  for (var _len7 = arguments.length, args = Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
+    args[_key7] = arguments[_key7];
+  }
+
+  return fetchData.apply(undefined, ['about'].concat(args));
+};
+var saveAbout = exports.saveAbout = function saveAbout() {
+  for (var _len8 = arguments.length, args = Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
+    args[_key8] = arguments[_key8];
+  }
+
+  return saveData.apply(undefined, ['about'].concat(args));
+};
+var readAbout = exports.readAbout = function readAbout() {
+  for (var _len9 = arguments.length, args = Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
+    args[_key9] = arguments[_key9];
+  }
+
+  return readData.apply(undefined, ['about'].concat(args));
+};
+
+var fetchDoodle = exports.fetchDoodle = function fetchDoodle() {
+  for (var _len10 = arguments.length, args = Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
+    args[_key10] = arguments[_key10];
+  }
+
+  return fetchData.apply(undefined, ['doodle'].concat(args));
+};
+var fetchNews = exports.fetchNews = function fetchNews() {
+  for (var _len11 = arguments.length, args = Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
+    args[_key11] = arguments[_key11];
+  }
+
+  return fetchData.apply(undefined, ['news'].concat(args));
+};
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var LIBRARY = __webpack_require__(9);
+var $export = __webpack_require__(28);
+var redefine = __webpack_require__(31);
+var hide = __webpack_require__(2);
+var Iterators = __webpack_require__(17);
+var $iterCreate = __webpack_require__(49);
+var setToStringTag = __webpack_require__(22);
+var getPrototypeOf = __webpack_require__(56);
+var ITERATOR = __webpack_require__(6)('iterator');
+var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
+var FF_ITERATOR = '@@iterator';
+var KEYS = 'keys';
+var VALUES = 'values';
+
+var returnThis = function () { return this; };
+
+module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
+  $iterCreate(Constructor, NAME, next);
+  var getMethod = function (kind) {
+    if (!BUGGY && kind in proto) return proto[kind];
+    switch (kind) {
+      case KEYS: return function keys() { return new Constructor(this, kind); };
+      case VALUES: return function values() { return new Constructor(this, kind); };
+    } return function entries() { return new Constructor(this, kind); };
+  };
+  var TAG = NAME + ' Iterator';
+  var DEF_VALUES = DEFAULT == VALUES;
+  var VALUES_BUG = false;
+  var proto = Base.prototype;
+  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
+  var $default = $native || getMethod(DEFAULT);
+  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
+  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
+  var methods, key, IteratorPrototype;
+  // Fix native
+  if ($anyNative) {
+    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
+    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
+      // Set @@toStringTag to native iterators
+      setToStringTag(IteratorPrototype, TAG, true);
+      // fix for some old engines
+      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
+    }
+  }
+  // fix Array#{values, @@iterator}.name in V8 / FF
+  if (DEF_VALUES && $native && $native.name !== VALUES) {
+    VALUES_BUG = true;
+    $default = function values() { return $native.call(this); };
+  }
+  // Define iterator
+  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
+    hide(proto, ITERATOR, $default);
+  }
+  // Plug for library
+  Iterators[NAME] = $default;
+  Iterators[TAG] = returnThis;
+  if (DEFAULT) {
+    methods = {
+      values: DEF_VALUES ? $default : getMethod(VALUES),
+      keys: IS_SET ? $default : getMethod(KEYS),
+      entries: $entries
+    };
+    if (FORCED) for (key in methods) {
+      if (!(key in proto)) redefine(proto, key, methods[key]);
+    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
+  }
+  return methods;
+};
+
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(7);
+var ctx = __webpack_require__(47);
+var hide = __webpack_require__(2);
+var has = __webpack_require__(1);
+var PROTOTYPE = 'prototype';
+
+var $export = function (type, name, source) {
+  var IS_FORCED = type & $export.F;
+  var IS_GLOBAL = type & $export.G;
+  var IS_STATIC = type & $export.S;
+  var IS_PROTO = type & $export.P;
+  var IS_BIND = type & $export.B;
+  var IS_WRAP = type & $export.W;
+  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
+  var expProto = exports[PROTOTYPE];
+  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];
+  var key, own, out;
+  if (IS_GLOBAL) source = name;
+  for (key in source) {
+    // contains in native
+    own = !IS_FORCED && target && target[key] !== undefined;
+    if (own && has(exports, key)) continue;
+    // export native or passed
+    out = own ? target[key] : source[key];
+    // prevent global pollution for namespaces
+    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
+    // bind timers to global for call from export context
+    : IS_BIND && own ? ctx(out, global)
+    // wrap global constructors for prevent change them in library
+    : IS_WRAP && target[key] == out ? (function (C) {
+      var F = function (a, b, c) {
+        if (this instanceof C) {
+          switch (arguments.length) {
+            case 0: return new C();
+            case 1: return new C(a);
+            case 2: return new C(a, b);
+          } return new C(a, b, c);
+        } return C.apply(this, arguments);
+      };
+      F[PROTOTYPE] = C[PROTOTYPE];
+      return F;
+    // make static versions for prototype methods
+    })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
+    // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
+    if (IS_PROTO) {
+      (exports.virtual || (exports.virtual = {}))[key] = out;
+      // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
+      if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);
+    }
+  }
+};
+// type bitmap
+$export.F = 1;   // forced
+$export.G = 2;   // global
+$export.S = 4;   // static
+$export.P = 8;   // proto
+$export.B = 16;  // bind
+$export.W = 32;  // wrap
+$export.U = 64;  // safe
+$export.R = 128; // real proto method for `library`
+module.exports = $export;
+
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = !__webpack_require__(4) && !__webpack_require__(11)(function () {
+  return Object.defineProperty(__webpack_require__(30)('div'), 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+var document = __webpack_require__(0).document;
+// typeof document.createElement is 'object' in old IE
+var is = isObject(document) && isObject(document.createElement);
+module.exports = function (it) {
+  return is ? document.createElement(it) : {};
+};
+
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(2);
+
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
+var anObject = __webpack_require__(10);
+var dPs = __webpack_require__(50);
+var enumBugKeys = __webpack_require__(21);
+var IE_PROTO = __webpack_require__(19)('IE_PROTO');
+var Empty = function () { /* empty */ };
+var PROTOTYPE = 'prototype';
+
+// Create object with fake `null` prototype: use iframe Object with cleared prototype
+var createDict = function () {
+  // Thrash, waste and sodomy: IE GC bug
+  var iframe = __webpack_require__(30)('iframe');
+  var i = enumBugKeys.length;
+  var lt = '<';
+  var gt = '>';
+  var iframeDocument;
+  iframe.style.display = 'none';
+  __webpack_require__(55).appendChild(iframe);
+  iframe.src = 'javascript:'; // eslint-disable-line no-script-url
+  // createDict = iframe.contentWindow.Object;
+  // html.removeChild(iframe);
+  iframeDocument = iframe.contentWindow.document;
+  iframeDocument.open();
+  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
+  iframeDocument.close();
+  createDict = iframeDocument.F;
+  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];
+  return createDict();
+};
+
+module.exports = Object.create || function create(O, Properties) {
+  var result;
+  if (O !== null) {
+    Empty[PROTOTYPE] = anObject(O);
+    result = new Empty();
+    Empty[PROTOTYPE] = null;
+    // add "__proto__" for Object.getPrototypeOf polyfill
+    result[IE_PROTO] = O;
+  } else result = createDict();
+  return Properties === undefined ? result : dPs(result, Properties);
+};
+
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var has = __webpack_require__(1);
+var toIObject = __webpack_require__(5);
+var arrayIndexOf = __webpack_require__(52)(false);
+var IE_PROTO = __webpack_require__(19)('IE_PROTO');
+
+module.exports = function (object, names) {
+  var O = toIObject(object);
+  var i = 0;
+  var result = [];
+  var key;
+  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);
+  // Don't enum bug & hidden keys
+  while (names.length > i) if (has(O, key = names[i++])) {
+    ~arrayIndexOf(result, key) || result.push(key);
+  }
+  return result;
+};
+
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports) {
+
+var toString = {}.toString;
+
+module.exports = function (it) {
+  return toString.call(it).slice(8, -1);
+};
+
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports) {
+
+exports.f = Object.getOwnPropertySymbols;
+
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
+var $keys = __webpack_require__(33);
+var hiddenKeys = __webpack_require__(21).concat('length', 'prototype');
+
+exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+  return $keys(O, hiddenKeys);
+};
+
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+__webpack_require__(38);
+
+var _News = __webpack_require__(73);
+
+var _News2 = _interopRequireDefault(_News);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// show title bar
+try {
+  var titleBar = weex.requireModule('titleBar');
+  titleBar.showTitleBar(true);
+} catch (e) {}
+
+_News2.default.el = '#root';
+new Vue(_News2.default);
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _mixin = __webpack_require__(39);
+
+var _mixin2 = _interopRequireDefault(_mixin);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// use shared mixins
+Vue.mixin(_mixin2.default);
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _index = __webpack_require__(26);
+
+var utils = _interopRequireWildcard(_index);
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+var storage = weex.requireModule('storage');
+
+exports.default = {
+  filters: {
+    i18n: utils.i18n,
+    url: utils.createURL,
+    link: utils.createLink
+  },
+  methods: {
+    createLink: utils.createLink,
+    createURL: utils.createURL,
+    i18n: utils.i18n,
+    getLanguage: utils.getLanguage,
+    fetchData: utils.fetchData,
+    saveData: utils.saveData,
+    readData: utils.readData,
+    jumpTo: utils.jumpTo
+  },
+  created: function created() {
+    var _this = this;
+
+    // get and set language
+    utils.getLanguage(function (language) {
+      _this.language = language;
+      utils.setTitleBar(_this.navigationBarOptions, language);
+    });
+
+    // listen to the language change event
+    var channel = new BroadcastChannel('language');
+    channel.onmessage = function (event) {
+      if (event.data && event.data.language) {
+        _this.language = event.data.language;
+      }
+    };
+  },
+  beforeDestroy: function beforeDestroy() {
+    storage.removeItem('CURRENT_DOCUMENT_URL');
+    storage.removeItem('CURRENT_SOURCE_HASH');
+  }
+};
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(41), __esModule: true };
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(7);
+var $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify });
+module.exports = function stringify(it) { // eslint-disable-line no-unused-vars
+  return $JSON.stringify.apply($JSON, arguments);
+};
+
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = true;
+
+var _iterator = __webpack_require__(43);
+
+var _iterator2 = _interopRequireDefault(_iterator);
+
+var _symbol = __webpack_require__(62);
+
+var _symbol2 = _interopRequireDefault(_symbol);
+
+var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
+  return typeof obj === "undefined" ? "undefined" : _typeof(obj);
+} : function (obj) {
+  return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
+};
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(44), __esModule: true };
+
+/***/ }),
+/* 44 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(45);
+__webpack_require__(58);
+module.exports = __webpack_require__(23).f('iterator');
+
+
+/***/ }),
+/* 45 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $at = __webpack_require__(46)(true);
+
+// 21.1.3.27 String.prototype[@@iterator]()
+__webpack_require__(27)(String, 'String', function (iterated) {
+  this._t = String(iterated); // target
+  this._i = 0;                // next index
+// 21.1.5.2.1 %StringIteratorPrototype%.next()
+}, function () {
+  var O = this._t;
+  var index = this._i;
+  var point;
+  if (index >= O.length) return { value: undefined, done: true };
+  point = $at(O, index);
+  this._i += point.length;
+  return { value: point, done: false };
+});
+
+
+/***/ }),
+/* 46 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(14);
+var defined = __webpack_require__(15);
+// true  -> String#at
+// false -> String#codePointAt
+module.exports = function (TO_STRING) {
+  return function (that, pos) {
+    var s = String(defined(that));
+    var i = toInteger(pos);
+    var l = s.length;
+    var a, b;
+    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
+    a = s.charCodeAt(i);
+    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
+      ? TO_STRING ? s.charAt(i) : a
+      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
+  };
+};
+
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// optional / simple context binding
+var aFunction = __webpack_require__(48);
+module.exports = function (fn, that, length) {
+  aFunction(fn);
+  if (that === undefined) return fn;
+  switch (length) {
+    case 1: return function (a) {
+      return fn.call(that, a);
+    };
+    case 2: return function (a, b) {
+      return fn.call(that, a, b);
+    };
+    case 3: return function (a, b, c) {
+      return fn.call(that, a, b, c);
+    };
+  }
+  return function (/* ...args */) {
+    return fn.apply(that, arguments);
+  };
+};
+
+
+/***/ }),
+/* 48 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+  if (typeof it != 'function') throw TypeError(it + ' is not a function!');
+  return it;
+};
+
+
+/***/ }),
+/* 49 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var create = __webpack_require__(32);
+var descriptor = __webpack_require__(12);
+var setToStringTag = __webpack_require__(22);
+var IteratorPrototype = {};
+
+// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
+__webpack_require__(2)(IteratorPrototype, __webpack_require__(6)('iterator'), function () { return this; });
+
+module.exports = function (Constructor, NAME, next) {
+  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
+  setToStringTag(Constructor, NAME + ' Iterator');
+};
+
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(3);
+var anObject = __webpack_require__(10);
+var getKeys = __webpack_require__(18);
+
+module.exports = __webpack_require__(4) ? Object.defineProperties : function defineProperties(O, Properties) {
+  anObject(O);
+  var keys = getKeys(Properties);
+  var length = keys.length;
+  var i = 0;
+  var P;
+  while (length > i) dP.f(O, P = keys[i++], Properties[P]);
+  return O;
+};
+
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for non-array-like ES3 and non-enumerable old V8 strings
+var cof = __webpack_require__(34);
+// eslint-disable-next-line no-prototype-builtins
+module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
+  return cof(it) == 'String' ? it.split('') : Object(it);
+};
+
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// false -> Array#indexOf
+// true  -> Array#includes
+var toIObject = __webpack_require__(5);
+var toLength = __webpack_require__(53);
+var toAbsoluteIndex = __webpack_require__(54);
+module.exports = function (IS_INCLUDES) {
+  return function ($this, el, fromIndex) {
+    var O = toIObject($this);
+    var length = toLength(O.length);
+    var index = toAbsoluteIndex(fromIndex, length);
+    var value;
+    // Array#includes uses SameValueZero equality algorithm
+    // eslint-disable-next-line no-self-compare
+    if (IS_INCLUDES && el != el) while (length > index) {
+      value = O[index++];
+      // eslint-disable-next-line no-self-compare
+      if (value != value) return true;
+    // Array#indexOf ignores holes, Array#includes - not
+    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
+      if (O[index] === el) return IS_INCLUDES || index || 0;
+    } return !IS_INCLUDES && -1;
+  };
+};
+
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.15 ToLength
+var toInteger = __webpack_require__(14);
+var min = Math.min;
+module.exports = function (it) {
+  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
+};
+
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(14);
+var max = Math.max;
+var min = Math.min;
+module.exports = function (index, length) {
+  index = toInteger(index);
+  return index < 0 ? max(index + length, 0) : min(index, length);
+};
+
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var document = __webpack_require__(0).document;
+module.exports = document && document.documentElement;
+
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
+var has = __webpack_require__(1);
+var toObject = __webpack_require__(57);
+var IE_PROTO = __webpack_require__(19)('IE_PROTO');
+var ObjectProto = Object.prototype;
+
+module.exports = Object.getPrototypeOf || function (O) {
+  O = toObject(O);
+  if (has(O, IE_PROTO)) return O[IE_PROTO];
+  if (typeof O.constructor == 'function' && O instanceof O.constructor) {
+    return O.constructor.prototype;
+  } return O instanceof Object ? ObjectProto : null;
+};
+
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.13 ToObject(argument)
+var defined = __webpack_require__(15);
+module.exports = function (it) {
+  return Object(defined(it));
+};
+
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(59);
+var global = __webpack_require__(0);
+var hide = __webpack_require__(2);
+var Iterators = __webpack_require__(17);
+var TO_STRING_TAG = __webpack_require__(6)('toStringTag');
+
+var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +
+  'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +
+  'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +
+  'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +
+  'TextTrackList,TouchList').split(',');
+
+for (var i = 0; i < DOMIterables.length; i++) {
+  var NAME = DOMIterables[i];
+  var Collection = global[NAME];
+  var proto = Collection && Collection.prototype;
+  if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
+  Iterators[NAME] = Iterators.Array;
+}
+
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var addToUnscopables = __webpack_require__(60);
+var step = __webpack_require__(61);
+var Iterators = __webpack_require__(17);
+var toIObject = __webpack_require__(5);
+
+// 22.1.3.4 Array.prototype.entries()
+// 22.1.3.13 Array.prototype.keys()
+// 22.1.3.29 Array.prototype.values()
+// 22.1.3.30 Array.prototype[@@iterator]()
+module.exports = __webpack_require__(27)(Array, 'Array', function (iterated, kind) {
+  this._t = toIObject(iterated); // target
+  this._i = 0;                   // next index
+  this._k = kind;                // kind
+// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
+}, function () {
+  var O = this._t;
+  var kind = this._k;
+  var index = this._i++;
+  if (!O || index >= O.length) {
+    this._t = undefined;
+    return step(1);
+  }
+  if (kind == 'keys') return step(0, index);
+  if (kind == 'values') return step(0, O[index]);
+  return step(0, [index, O[index]]);
+}, 'values');
+
+// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
+Iterators.Arguments = Iterators.Array;
+
+addToUnscopables('keys');
+addToUnscopables('values');
+addToUnscopables('entries');
+
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports) {
+
+module.exports = function () { /* empty */ };
+
+
+/***/ }),
+/* 61 */
+/***/ (function(module, exports) {
+
+module.exports = function (done, value) {
+  return { value: value, done: !!done };
+};
+
+
+/***/ }),
+/* 62 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(63), __esModule: true };
+
+/***/ }),
+/* 63 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(64);
+__webpack_require__(70);
+__webpack_require__(71);
+__webpack_require__(72);
+module.exports = __webpack_require__(7).Symbol;
+
+
+/***/ }),
+/* 64 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// ECMAScript 6 symbols shim
+var global = __webpack_require__(0);
+var has = __webpack_require__(1);
+var DESCRIPTORS = __webpack_require__(4);
+var $export = __webpack_require__(28);
+var redefine = __webpack_require__(31);
+var META = __webpack_require__(65).KEY;
+var $fails = __webpack_require__(11);
+var shared = __webpack_require__(20);
+var setToStringTag = __webpack_require__(22);
+var uid = __webpack_require__(13);
+var wks = __webpack_require__(6);
+var wksExt = __webpack_require__(23);
+var wksDefine = __webpack_require__(24);
+var enumKeys = __webpack_require__(66);
+var isArray = __webpack_require__(67);
+var anObject = __webpack_require__(10);
+var isObject = __webpack_require__(8);
+var toIObject = __webpack_require__(5);
+var toPrimitive = __webpack_require__(16);
+var createDesc = __webpack_require__(12);
+var _create = __webpack_require__(32);
+var gOPNExt = __webpack_require__(68);
+var $GOPD = __webpack_require__(69);
+var $DP = __webpack_require__(3);
+var $keys = __webpack_require__(18);
+var gOPD = $GOPD.f;
+var dP = $DP.f;
+var gOPN = gOPNExt.f;
+var $Symbol = global.Symbol;
+var $JSON = global.JSON;
+var _stringify = $JSON && $JSON.stringify;
+var PROTOTYPE = 'prototype';
+var HIDDEN = wks('_hidden');
+var TO_PRIMITIVE = wks('toPrimitive');
+var isEnum = {}.propertyIsEnumerable;
+var SymbolRegistry = shared('symbol-registry');
+var AllSymbols = shared('symbols');
+var OPSymbols = shared('op-symbols');
+var ObjectProto = Object[PROTOTYPE];
+var USE_NATIVE = typeof $Symbol == 'function';
+var QObject = global.QObject;
+// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
+var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
+
+// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
+var setSymbolDesc = DESCRIPTORS && $fails(function () {
+  return _create(dP({}, 'a', {
+    get: function () { return dP(this, 'a', { value: 7 }).a; }
+  })).a != 7;
+}) ? function (it, key, D) {
+  var protoDesc = gOPD(ObjectProto, key);
+  if (protoDesc) delete ObjectProto[key];
+  dP(it, key, D);
+  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
+} : dP;
+
+var wrap = function (tag) {
+  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
+  sym._k = tag;
+  return sym;
+};
+
+var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {
+  return typeof it == 'symbol';
+} : function (it) {
+  return it instanceof $Symbol;
+};
+
+var $defineProperty = function defineProperty(it, key, D) {
+  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
+  anObject(it);
+  key = toPrimitive(key, true);
+  anObject(D);
+  if (has(AllSymbols, key)) {
+    if (!D.enumerable) {
+      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
+      it[HIDDEN][key] = true;
+    } else {
+      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
+      D = _create(D, { enumerable: createDesc(0, false) });
+    } return setSymbolDesc(it, key, D);
+  } return dP(it, key, D);
+};
+var $defineProperties = function defineProperties(it, P) {
+  anObject(it);
+  var keys = enumKeys(P = toIObject(P));
+  var i = 0;
+  var l = keys.length;
+  var key;
+  while (l > i) $defineProperty(it, key = keys[i++], P[key]);
+  return it;
+};
+var $create = function create(it, P) {
+  return P === undefined ? _create(it) : $defineProperties(_create(it), P);
+};
+var $propertyIsEnumerable = function propertyIsEnumerable(key) {
+  var E = isEnum.call(this, key = toPrimitive(key, true));
+  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
+  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
+};
+var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
+  it = toIObject(it);
+  key = toPrimitive(key, true);
+  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
+  var D = gOPD(it, key);
+  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
+  return D;
+};
+var $getOwnPropertyNames = function getOwnPropertyNames(it) {
+  var names = gOPN(toIObject(it));
+  var result = [];
+  var i = 0;
+  var key;
+  while (names.length > i) {
+    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
+  } return result;
+};
+var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
+  var IS_OP = it === ObjectProto;
+  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
+  var result = [];
+  var i = 0;
+  var key;
+  while (names.length > i) {
+    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
+  } return result;
+};
+
+// 19.4.1.1 Symbol([description])
+if (!USE_NATIVE) {
+  $Symbol = function Symbol() {
+    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
+    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
+    var $set = function (value) {
+      if (this === ObjectProto) $set.call(OPSymbols, value);
+      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+      setSymbolDesc(this, tag, createDesc(1, value));
+    };
+    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
+    return wrap(tag);
+  };
+  redefine($Symbol[PROTOTYPE], 'toString', function toString() {
+    return this._k;
+  });
+
+  $GOPD.f = $getOwnPropertyDescriptor;
+  $DP.f = $defineProperty;
+  __webpack_require__(36).f = gOPNExt.f = $getOwnPropertyNames;
+  __webpack_require__(25).f = $propertyIsEnumerable;
+  __webpack_require__(35).f = $getOwnPropertySymbols;
+
+  if (DESCRIPTORS && !__webpack_require__(9)) {
+    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
+  }
+
+  wksExt.f = function (name) {
+    return wrap(wks(name));
+  };
+}
+
+$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });
+
+for (var es6Symbols = (
+  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
+  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
+).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);
+
+for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);
+
+$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
+  // 19.4.2.1 Symbol.for(key)
+  'for': function (key) {
+    return has(SymbolRegistry, key += '')
+      ? SymbolRegistry[key]
+      : SymbolRegistry[key] = $Symbol(key);
+  },
+  // 19.4.2.5 Symbol.keyFor(sym)
+  keyFor: function keyFor(sym) {
+    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
+    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
+  },
+  useSetter: function () { setter = true; },
+  useSimple: function () { setter = false; }
+});
+
+$export($export.S + $export.F * !USE_NATIVE, 'Object', {
+  // 19.1.2.2 Object.create(O [, Properties])
+  create: $create,
+  // 19.1.2.4 Object.defineProperty(O, P, Attributes)
+  defineProperty: $defineProperty,
+  // 19.1.2.3 Object.defineProperties(O, Properties)
+  defineProperties: $defineProperties,
+  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
+  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
+  // 19.1.2.7 Object.getOwnPropertyNames(O)
+  getOwnPropertyNames: $getOwnPropertyNames,
+  // 19.1.2.8 Object.getOwnPropertySymbols(O)
+  getOwnPropertySymbols: $getOwnPropertySymbols
+});
+
+// 24.3.2 JSON.stringify(value [, replacer [, space]])
+$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
+  var S = $Symbol();
+  // MS Edge converts symbol values to JSON as {}
+  // WebKit converts symbol values to JSON as null
+  // V8 throws on boxed symbols
+  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
+})), 'JSON', {
+  stringify: function stringify(it) {
+    var args = [it];
+    var i = 1;
+    var replacer, $replacer;
+    while (arguments.length > i) args.push(arguments[i++]);
+    $replacer = replacer = args[1];
+    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
+    if (!isArray(replacer)) replacer = function (key, value) {
+      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
+      if (!isSymbol(value)) return value;
+    };
+    args[1] = replacer;
+    return _stringify.apply($JSON, args);
+  }
+});
+
+// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
+$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(2)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
+// 19.4.3.5 Symbol.prototype[@@toStringTag]
+setToStringTag($Symbol, 'Symbol');
+// 20.2.1.9 Math[@@toStringTag]
+setToStringTag(Math, 'Math', true);
+// 24.3.3 JSON[@@toStringTag]
+setToStringTag(global.JSON, 'JSON', true);
+
+
+/***/ }),
+/* 65 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var META = __webpack_require__(13)('meta');
+var isObject = __webpack_require__(8);
+var has = __webpack_require__(1);
+var setDesc = __webpack_require__(3).f;
+var id = 0;
+var isExtensible = Object.isExtensible || function () {
+  return true;
+};
+var FREEZE = !__webpack_require__(11)(function () {
+  return isExtensible(Object.preventExtensions({}));
+});
+var setMeta = function (it) {
+  setDesc(it, META, { value: {
+    i: 'O' + ++id, // object ID
+    w: {}          // weak collections IDs
+  } });
+};
+var fastKey = function (it, create) {
+  // return primitive with prefix
+  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+  if (!has(it, META)) {
+    // can't set metadata to uncaught frozen object
+    if (!isExtensible(it)) return 'F';
+    // not necessary to add metadata
+    if (!create) return 'E';
+    // add missing metadata
+    setMeta(it);
+  // return object ID
+  } return it[META].i;
+};
+var getWeak = function (it, create) {
+  if (!has(it, META)) {
+    // can't set metadata to uncaught frozen object
+    if (!isExtensible(it)) return true;
+    // not necessary to add metadata
+    if (!create) return false;
+    // add missing metadata
+    setMeta(it);
+  // return hash weak collections IDs
+  } return it[META].w;
+};
+// add metadata on freeze-family methods calling
+var onFreeze = function (it) {
+  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
+  return it;
+};
+var meta = module.exports = {
+  KEY: META,
+  NEED: false,
+  fastKey: fastKey,
+  getWeak: getWeak,
+  onFreeze: onFreeze
+};
+
+
+/***/ }),
+/* 66 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// all enumerable object keys, includes symbols
+var getKeys = __webpack_require__(18);
+var gOPS = __webpack_require__(35);
+var pIE = __webpack_require__(25);
+module.exports = function (it) {
+  var result = getKeys(it);
+  var getSymbols = gOPS.f;
+  if (getSymbols) {
+    var symbols = getSymbols(it);
+    var isEnum = pIE.f;
+    var i = 0;
+    var key;
+    while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
+  } return result;
+};
+
+
+/***/ }),
+/* 67 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.2.2 IsArray(argument)
+var cof = __webpack_require__(34);
+module.exports = Array.isArray || function isArray(arg) {
+  return cof(arg) == 'Array';
+};
+
+
+/***/ }),
+/* 68 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
+var toIObject = __webpack_require__(5);
+var gOPN = __webpack_require__(36).f;
+var toString = {}.toString;
+
+var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
+  ? Object.getOwnPropertyNames(window) : [];
+
+var getWindowNames = function (it) {
+  try {
+    return gOPN(it);
+  } catch (e) {
+    return windowNames.slice();
+  }
+};
+
+module.exports.f = function getOwnPropertyNames(it) {
+  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
+};
+
+
+/***/ }),
+/* 69 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var pIE = __webpack_require__(25);
+var createDesc = __webpack_require__(12);
+var toIObject = __webpack_require__(5);
+var toPrimitive = __webpack_require__(16);
+var has = __webpack_require__(1);
+var IE8_DOM_DEFINE = __webpack_require__(29);
+var gOPD = Object.getOwnPropertyDescriptor;
+
+exports.f = __webpack_require__(4) ? gOPD : function getOwnPropertyDescriptor(O, P) {
+  O = toIObject(O);
+  P = toPrimitive(P, true);
+  if (IE8_DOM_DEFINE) try {
+    return gOPD(O, P);
+  } catch (e) { /* empty */ }
+  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
+};
+
+
+/***/ }),
+/* 70 */
+/***/ (function(module, exports) {
+
+
+
+/***/ }),
+/* 71 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(24)('asyncIterator');
+
+
+/***/ }),
+/* 72 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(24)('observable');
+
+
+/***/ }),
+/* 73 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(74)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(75)
+
+/* template */
+var __vue_template__ = __webpack_require__(76)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+  typeof __vue_exports__.default === "object" ||
+  typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+  __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/pages/news/News.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-59a504d6"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+  for (var name in module) {
+    __vue_options__.style[name] = module[name]
+  }
+})
+if (typeof __register_static_styles__ === "function") {
+  __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 74 */
+/***/ (function(module, exports) {
+
+module.exports = {
+  "list": {
+    "backgroundColor": "#F1F1F1"
+  },
+  "refresh": {
+    "width": "750",
+    "alignItems": "center",
+    "backgroundColor": "#808080"
+  },
+  "indicator-text": {
+    "color": "#C5C5C5",
+    "fontSize": "34",
+    "paddingTop": "50",
+    "paddingRight": "50",
+    "paddingBottom": "50",
+    "paddingLeft": "50",
+    "textAlign": "center"
+  },
+  "cell": {
+    "alignItems": "center"
+  },
+  "message-time": {
+    "marginTop": "25",
+    "justifyContent": "center"
+  },
+  "time-text": {
+    "paddingTop": "5",
+    "paddingBottom": "5",
+    "paddingLeft": "18",
+    "paddingRight": "18",
+    "backgroundColor": "rgba(0,0,0,0.1)",
+    "fontSize": "25",
+    "borderRadius": "8",
+    "color": "#FEFEFE"
+  },
+  "message-box": {
+    "borderWidth": "1",
+    "borderColor": "#DDDDDD",
+    "borderRadius": "15",
+    "backgroundColor": "#FFFFFF",
+    "marginTop": "25",
+    "marginBottom": "35",
+    "backgroundColor:active": "#F8F8F8"
+  },
+  "related-article": {
+    "borderTopWidth": "1",
+    "borderTopColor": "#E6E6E6",
+    "flexDirection": "row",
+    "alignItems": "center",
+    "paddingTop": "10",
+    "paddingBottom": "15",
+    "paddingLeft": "30",
+    "paddingRight": "20",
+    "backgroundColor": "#FEFEFE"
+  },
+  "poster": {
+    "width": "680",
+    "height": "340",
+    "backgroundColor": "#D2D2D2"
+  },
+  "title": {
+    "width": "680",
+    "paddingTop": "30",
+    "paddingRight": "30",
+    "paddingBottom": "30",
+    "paddingLeft": "30",
+    "fontSize": "38",
+    "color": "#323232"
+  },
+  "shortcut": {
+    "width": "80",
+    "height": "80"
+  },
+  "subtitle": {
+    "width": "550",
+    "paddingRight": "25",
+    "fontSize": "34",
+    "color": "#454545"
+  },
+  "summary": {
+    "width": "680",
+    "marginTop": "-20",
+    "paddingLeft": "30",
+    "paddingRight": "30",
+    "paddingBottom": "30",
+    "fontSize": "28",
+    "color": "#929292",
+    "lines": 3
+  }
+}
+
+/***/ }),
+/* 75 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _utils = __webpack_require__(26);
+
+var modal = weex.requireModule('modal'); //
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+exports.default = {
+  data: function data() {
+    var dict = {
+      REFRESH: { en: 'Release to refresh', zh: '释放刷新' },
+      REFRESHING: { en: 'Fetching ...', zh: '正在加载……' },
+      UPDATED: { en: 'Updated', zh: '已更新' },
+      LOAD_MERE: { en: 'Load more', zh: '加载更多' },
+      NO_MORE_NEWS: { en: 'No more news', zh: '到底了' }
+    };
+    return {
+      language: 'en',
+      navigationBarOptions: {
+        // backgroundColor: '#5F5F5F',
+        title: {
+          zh: '资讯',
+          en: 'News'
+        }
+      },
+      dict: dict,
+      refreshNote: dict.REFRESH,
+      refreshing: false,
+      visibleCount: 6,
+      news: []
+    };
+  },
+
+  computed: {
+    visibleNews: function visibleNews() {
+      return this.news.slice(0, this.visibleCount);
+    }
+  },
+  beforeCreate: function beforeCreate() {
+    var _this = this;
+
+    (0, _utils.fetchNews)(function (res) {
+      if (Array.isArray(res.news)) {
+        _this.news = res.news;
+      }
+    });
+  },
+
+  methods: {
+    refresh: function refresh() {
+      var _this2 = this;
+
+      this.refreshing = true;
+      this.refreshNote = this.dict.REFRESHING;
+      var finish = function finish() {
+        _this2.refreshing = false;
+        setTimeout(function () {
+          _this2.refreshNote = _this2.dict.REFRESH;
+        }, 500);
+      };
+      (0, _utils.fetchNews)(function (res) {
+        if (Array.isArray(res.news)) {
+          if (_this2.news.length === res.news.length) {
+            modal.toast({
+              message: _this2.i18n(_this2.dict.UPDATED)
+            });
+          }
+          _this2.news = res.news;
+          finish();
+        }
+        setTimeout(function () {
+          return finish();
+        }, 5000);
+      });
+    },
+    loadmore: function loadmore() {
+      var step = 4;
+      var currentCount = this.visibleCount;
+      this.visibleCount = Math.min(currentCount + step, this.news.length);
+      modal.toast({
+        message: this.visibleCount > currentCount ? this.i18n(this.dict.LOAD_MERE) : this.i18n(this.dict.NO_MORE_NEWS)
+      });
+    }
+  }
+};
+
+/***/ }),
+/* 76 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+  return _c('list', {
+    staticClass: ["list"],
+    attrs: {
+      "loadmoreoffset": "10"
+    },
+    on: {
+      "loadmore": _vm.loadmore
+    }
+  }, [_c('refresh', {
+    staticClass: ["refresh"],
+    attrs: {
+      "display": _vm.refreshing ? 'show' : 'hide'
+    },
+    on: {
+      "refresh": _vm.refresh
+    }
+  }, [_c('text', {
+    staticClass: ["indicator-text"]
+  }, [_vm._v(_vm._s(_vm.i18n(_vm.refreshNote)))])]), _vm._l((_vm.visibleNews), function(item, i) {
+    return _c('cell', {
+      key: i,
+      staticClass: ["cell"],
+      appendAsTree: true,
+      attrs: {
+        "append": "tree"
+      }
+    }, [(item.time) ? _c('div', {
+      staticClass: ["message-time"]
+    }, [_c('text', {
+      staticClass: ["time-text"]
+    }, [_vm._v(_vm._s(_vm.i18n(item.time)))])]) : _vm._e(), (item.type === 'article') ? _c('div', {
+      staticClass: ["message-box"]
+    }, [_c('div', {
+      staticClass: ["article"],
+      on: {
+        "click": function($event) {
+          _vm.jumpTo(item.link)
+        }
+      }
+    }, [_c('image', {
+      staticClass: ["poster"],
+      attrs: {
+        "resize": "cover",
+        "src": item.poster
+      }
+    }), _c('text', {
+      staticClass: ["title"]
+    }, [_vm._v(_vm._s(item.title))]), (item.summary) ? _c('text', {
+      staticClass: ["summary"],
+      attrs: {
+        "lines": 3
+      }
+    }, [_vm._v(_vm._s(item.summary))]) : _vm._e(), _c('div', {
+      staticClass: ["related"]
+    }, _vm._l((item.related), function(sub) {
+      return _c('div', {
+        key: sub.title,
+        staticClass: ["related-article"],
+        on: {
+          "click": function($event) {
+            _vm.jumpTo(sub.link)
+          }
+        }
+      }, [_c('text', {
+        staticClass: ["subtitle"]
+      }, [_vm._v(_vm._s(sub.title))]), _c('image', {
+        staticClass: ["shortcut"],
+        attrs: {
+          "resize": "cover",
+          "src": sub.poster
+        }
+      })])
+    }))])]) : _vm._e()])
+  })], 2)
+},staticRenderFns: []}
+module.exports.render._withStripped = true
+
+/***/ })
+/******/ ]);
\ No newline at end of file
diff --git a/ios/weex.png b/ios/weex.png
new file mode 100644
index 0000000..e8f8e52
--- /dev/null
+++ b/ios/weex.png
Binary files differ
diff --git a/ios/weex@2x.png b/ios/weex@2x.png
new file mode 100644
index 0000000..0b7542f
--- /dev/null
+++ b/ios/weex@2x.png
Binary files differ