diff --git a/.bowerrc b/.bowerrc
new file mode 100644
index 0000000..e28246d
--- /dev/null
+++ b/.bowerrc
@@ -0,0 +1,3 @@
+{
+ "directory": "www/lib"
+}
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..aca2523
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,14 @@
+# http://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..8f7ddd3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+# Specifies intentionally untracked files to ignore when using Git
+# http://git-scm.com/docs/gitignore
+
+node_modules/
+platforms/
+plugins/
diff --git a/bower.json b/bower.json
new file mode 100644
index 0000000..2721960
--- /dev/null
+++ b/bower.json
@@ -0,0 +1,7 @@
+{
+ "name": "HelloIonic",
+ "private": "true",
+ "devDependencies": {
+ "ionic": "driftyco/ionic-bower#1.3.1"
+ }
+}
diff --git a/config.xml b/config.xml
new file mode 100644
index 0000000..aa44229
--- /dev/null
+++ b/config.xml
@@ -0,0 +1,28 @@
+
+
+ v1links
+
+ An Ionic Framework and Cordova project.
+
+
+ Your Name Here
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gulpfile.js b/gulpfile.js
new file mode 100644
index 0000000..5c283be
--- /dev/null
+++ b/gulpfile.js
@@ -0,0 +1,51 @@
+var gulp = require('gulp');
+var gutil = require('gulp-util');
+var bower = require('bower');
+var concat = require('gulp-concat');
+var sass = require('gulp-sass');
+var minifyCss = require('gulp-minify-css');
+var rename = require('gulp-rename');
+var sh = require('shelljs');
+
+var paths = {
+ sass: ['./scss/**/*.scss']
+};
+
+gulp.task('default', ['sass']);
+
+gulp.task('sass', function(done) {
+ gulp.src('./scss/ionic.app.scss')
+ .pipe(sass())
+ .on('error', sass.logError)
+ .pipe(gulp.dest('./www/css/'))
+ .pipe(minifyCss({
+ keepSpecialComments: 0
+ }))
+ .pipe(rename({ extname: '.min.css' }))
+ .pipe(gulp.dest('./www/css/'))
+ .on('end', done);
+});
+
+gulp.task('watch', function() {
+ gulp.watch(paths.sass, ['sass']);
+});
+
+gulp.task('install', ['git-check'], function() {
+ return bower.commands.install()
+ .on('log', function(data) {
+ gutil.log('bower', gutil.colors.cyan(data.id), data.message);
+ });
+});
+
+gulp.task('git-check', function(done) {
+ if (!sh.which('git')) {
+ console.log(
+ ' ' + gutil.colors.red('Git is not installed.'),
+ '\n Git, the version control system, is required to download Ionic.',
+ '\n Download git here:', gutil.colors.cyan('http://git-scm.com/downloads') + '.',
+ '\n Once git is installed, run \'' + gutil.colors.cyan('gulp install') + '\' again.'
+ );
+ process.exit(1);
+ }
+ done();
+});
diff --git a/hooks/README.md b/hooks/README.md
new file mode 100644
index 0000000..d2563ea
--- /dev/null
+++ b/hooks/README.md
@@ -0,0 +1,83 @@
+
+# Cordova Hooks
+
+This directory may contain scripts used to customize cordova commands. This
+directory used to exist at `.cordova/hooks`, but has now been moved to the
+project root. Any scripts you add to these directories will be executed before
+and after the commands corresponding to the directory name. Useful for
+integrating your own build systems or integrating with version control systems.
+
+__Remember__: Make your scripts executable.
+
+## Hook Directories
+The following subdirectories will be used for hooks:
+
+ after_build/
+ after_compile/
+ after_docs/
+ after_emulate/
+ after_platform_add/
+ after_platform_rm/
+ after_platform_ls/
+ after_plugin_add/
+ after_plugin_ls/
+ after_plugin_rm/
+ after_plugin_search/
+ after_prepare/
+ after_run/
+ after_serve/
+ before_build/
+ before_compile/
+ before_docs/
+ before_emulate/
+ before_platform_add/
+ before_platform_rm/
+ before_platform_ls/
+ before_plugin_add/
+ before_plugin_ls/
+ before_plugin_rm/
+ before_plugin_search/
+ before_prepare/
+ before_run/
+ before_serve/
+ pre_package/ <-- Windows 8 and Windows Phone only.
+
+## Script Interface
+
+All scripts are run from the project's root directory and have the root directory passes as the first argument. All other options are passed to the script using environment variables:
+
+* CORDOVA_VERSION - The version of the Cordova-CLI.
+* CORDOVA_PLATFORMS - Comma separated list of platforms that the command applies to (e.g.: android, ios).
+* CORDOVA_PLUGINS - Comma separated list of plugin IDs that the command applies to (e.g.: org.apache.cordova.file, org.apache.cordova.file-transfer)
+* CORDOVA_HOOK - Path to the hook that is being executed.
+* CORDOVA_CMDLINE - The exact command-line arguments passed to cordova (e.g.: cordova run ios --emulate)
+
+If a script returns a non-zero exit code, then the parent cordova command will be aborted.
+
+
+## Writing hooks
+
+We highly recommend writting your hooks using Node.js so that they are
+cross-platform. Some good examples are shown here:
+
+[http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/](http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/)
+
diff --git a/hooks/after_prepare/010_add_platform_class.js b/hooks/after_prepare/010_add_platform_class.js
new file mode 100755
index 0000000..bda3e41
--- /dev/null
+++ b/hooks/after_prepare/010_add_platform_class.js
@@ -0,0 +1,94 @@
+#!/usr/bin/env node
+
+// Add Platform Class
+// v1.0
+// Automatically adds the platform class to the body tag
+// after the `prepare` command. By placing the platform CSS classes
+// directly in the HTML built for the platform, it speeds up
+// rendering the correct layout/style for the specific platform
+// instead of waiting for the JS to figure out the correct classes.
+
+var fs = require('fs');
+var path = require('path');
+
+var rootdir = process.argv[2];
+
+function addPlatformBodyTag(indexPath, platform) {
+ // add the platform class to the body tag
+ try {
+ var platformClass = 'platform-' + platform;
+ var cordovaClass = 'platform-cordova platform-webview';
+
+ var html = fs.readFileSync(indexPath, 'utf8');
+
+ var bodyTag = findBodyTag(html);
+ if(!bodyTag) return; // no opening body tag, something's wrong
+
+ if(bodyTag.indexOf(platformClass) > -1) return; // already added
+
+ var newBodyTag = bodyTag;
+
+ var classAttr = findClassAttr(bodyTag);
+ if(classAttr) {
+ // body tag has existing class attribute, add the classname
+ var endingQuote = classAttr.substring(classAttr.length-1);
+ var newClassAttr = classAttr.substring(0, classAttr.length-1);
+ newClassAttr += ' ' + platformClass + ' ' + cordovaClass + endingQuote;
+ newBodyTag = bodyTag.replace(classAttr, newClassAttr);
+
+ } else {
+ // add class attribute to the body tag
+ newBodyTag = bodyTag.replace('>', ' class="' + platformClass + ' ' + cordovaClass + '">');
+ }
+
+ html = html.replace(bodyTag, newBodyTag);
+
+ fs.writeFileSync(indexPath, html, 'utf8');
+
+ process.stdout.write('add to body class: ' + platformClass + '\n');
+ } catch(e) {
+ process.stdout.write(e);
+ }
+}
+
+function findBodyTag(html) {
+ // get the body tag
+ try{
+ return html.match(/
])(.*?)>/gi)[0];
+ }catch(e){}
+}
+
+function findClassAttr(bodyTag) {
+ // get the body tag's class attribute
+ try{
+ return bodyTag.match(/ class=["|'](.*?)["|']/gi)[0];
+ }catch(e){}
+}
+
+if (rootdir) {
+
+ // go through each of the platform directories that have been prepared
+ var platforms = (process.env.CORDOVA_PLATFORMS ? process.env.CORDOVA_PLATFORMS.split(',') : []);
+
+ for(var x=0; x
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/www/js/app.js b/www/js/app.js
new file mode 100644
index 0000000..334e842
--- /dev/null
+++ b/www/js/app.js
@@ -0,0 +1,83 @@
+// Ionic Starter App
+
+// angular.module is a global place for creating, registering and retrieving Angular modules
+// 'starter' is the name of this angular module example (also set in a attribute in index.html)
+// the 2nd parameter is an array of 'requires'
+// 'starter.services' is found in services.js
+// 'starter.controllers' is found in controllers.js
+angular.module('starter', ['ionic', 'ionic.native', 'starter.controllers', 'starter.services'])
+
+.run(function($ionicPlatform, $cordovaStatusBar) {
+ $ionicPlatform.ready(function() {
+ // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
+ // for form inputs)
+ if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) {
+ cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
+ cordova.plugins.Keyboard.disableScroll(true);
+
+ }
+ $cordovaStatusBar.styleLightContent();
+ $cordovaStatusBar.hide();
+ });
+})
+
+.config(function($stateProvider, $urlRouterProvider) {
+
+ // Ionic uses AngularUI Router which uses the concept of states
+ // Learn more here: https://github.com/angular-ui/ui-router
+ // Set up the various states which the app can be in.
+ // Each state's controller can be found in controllers.js
+ $stateProvider
+
+ // setup an abstract state for the tabs directive
+ .state('tab', {
+ url: '/tab',
+ abstract: true,
+ templateUrl: 'templates/tabs.html'
+ })
+
+ // Each tab has its own nav history stack:
+
+ .state('tab.dash', {
+ url: '/dash',
+ views: {
+ 'tab-dash': {
+ templateUrl: 'templates/tab-dash.html',
+ controller: 'DashCtrl'
+ }
+ }
+ })
+
+ .state('tab.chats', {
+ url: '/chats',
+ views: {
+ 'tab-chats': {
+ templateUrl: 'templates/tab-chats.html',
+ controller: 'ChatsCtrl'
+ }
+ }
+ })
+ .state('tab.chat-detail', {
+ url: '/chats/:chatId',
+ views: {
+ 'tab-chats': {
+ templateUrl: 'templates/chat-detail.html',
+ controller: 'ChatDetailCtrl'
+ }
+ }
+ })
+
+ .state('tab.account', {
+ url: '/account',
+ views: {
+ 'tab-account': {
+ templateUrl: 'templates/tab-account.html',
+ controller: 'AccountCtrl'
+ }
+ }
+ });
+
+ // if none of the above states are matched, use this as the fallback
+ $urlRouterProvider.otherwise('/tab/dash');
+
+});
diff --git a/www/js/controllers.js b/www/js/controllers.js
new file mode 100644
index 0000000..dcf4800
--- /dev/null
+++ b/www/js/controllers.js
@@ -0,0 +1,28 @@
+angular.module('starter.controllers', [])
+
+.controller('DashCtrl', function($scope) {})
+
+.controller('ChatsCtrl', function($scope, Chats) {
+ // With the new view caching in Ionic, Controllers are only called
+ // when they are recreated or on app start, instead of every page change.
+ // To listen for when this page is active (for example, to refresh data),
+ // listen for the $ionicView.enter event:
+ //
+ //$scope.$on('$ionicView.enter', function(e) {
+ //});
+
+ $scope.chats = Chats.all();
+ $scope.remove = function(chat) {
+ Chats.remove(chat);
+ };
+})
+
+.controller('ChatDetailCtrl', function($scope, $stateParams, Chats) {
+ $scope.chat = Chats.get($stateParams.chatId);
+})
+
+.controller('AccountCtrl', function($scope) {
+ $scope.settings = {
+ enableFriends: true
+ };
+});
diff --git a/www/js/services.js b/www/js/services.js
new file mode 100644
index 0000000..73837bf
--- /dev/null
+++ b/www/js/services.js
@@ -0,0 +1,50 @@
+angular.module('starter.services', [])
+
+.factory('Chats', function() {
+ // Might use a resource here that returns a JSON array
+
+ // Some fake testing data
+ var chats = [{
+ id: 0,
+ name: 'Ben Sparrow',
+ lastText: 'You on your way?',
+ face: 'img/ben.png'
+ }, {
+ id: 1,
+ name: 'Max Lynx',
+ lastText: 'Hey, it\'s me',
+ face: 'img/max.png'
+ }, {
+ id: 2,
+ name: 'Adam Bradleyson',
+ lastText: 'I should buy a boat',
+ face: 'img/adam.jpg'
+ }, {
+ id: 3,
+ name: 'Perry Governor',
+ lastText: 'Look at my mukluks!',
+ face: 'img/perry.png'
+ }, {
+ id: 4,
+ name: 'Mike Harrington',
+ lastText: 'This is wicked good ice cream.',
+ face: 'img/mike.png'
+ }];
+
+ return {
+ all: function() {
+ return chats;
+ },
+ remove: function(chat) {
+ chats.splice(chats.indexOf(chat), 1);
+ },
+ get: function(chatId) {
+ for (var i = 0; i < chats.length; i++) {
+ if (chats[i].id === parseInt(chatId)) {
+ return chats[i];
+ }
+ }
+ return null;
+ }
+ };
+});
diff --git a/www/lib/ionic.native.js b/www/lib/ionic.native.js
new file mode 100644
index 0000000..b485e08
--- /dev/null
+++ b/www/lib/ionic.native.js
@@ -0,0 +1,9408 @@
+(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Action Sheet
+ * @description
+ * The ActionSheet plugin shows a native list of options the user can choose from.
+ *
+ * Requires Cordova plugin: `cordova-plugin-actionsheet`. For more info, please see the [ActionSheet plugin docs](https://github.com/EddyVerbruggen/cordova-plugin-actionsheet).
+ *
+ * @usage
+ * ```ts
+ * import {ActionSheet} from 'ionic-native';
+ *
+ * let buttonLabels = ['Share via Facebook', 'Share via Twitter'];
+ * ActionSheet.show({
+ * 'title': 'What do you want with this image?',
+ * 'buttonLabels': buttonLabels,
+ * 'addCancelButtonWithLabel': 'Cancel',
+ * 'addDestructiveButtonWithLabel' : 'Delete'
+ * }).then(buttonIndex => {
+ * console.log('Button pressed: ' + buttonLabels[buttonIndex - 1]);
+ * });
+ * ```
+ *
+ */
+var ActionSheet = (function () {
+ function ActionSheet() {
+ }
+ /**
+ * Show the ActionSheet. The ActionSheet's options is an object with the following propterties.
+ *
+ * | Option | Type | Description |
+ * |-------------------------------|-----------|----------------------------------------------|
+ * | title |`string` | The title for the actionsheet |
+ * | buttonLabels |`string[]` | the labels for the buttons. Uses the index x |
+ * | androidTheme |`number` | Theme to be used on Android |
+ * | androidEnableCancelButton |`boolean` | Enable a cancel on Android |
+ * | winphoneEnableCancelButton |`boolean` | Enable a cancel on Windows Phone |
+ * | addCancelButtonWithLabel |`string` | Add a cancel button with text |
+ * | addDestructiveButtonWithLabel |`string` | Add a destructive button with text |
+ * | position |`number[]` | On an iPad, set the X,Y position |
+ *
+ * @param {options} Options See table above
+ * @returns {Promise} Returns a Promise that resolves with the index of the
+ * button pressed (1 based, so 1, 2, 3, etc.)
+ */
+ ActionSheet.show = function (options) { return; };
+ /**
+ * Hide the ActionSheet.
+ */
+ ActionSheet.hide = function () { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], ActionSheet, "show", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], ActionSheet, "hide", null);
+ ActionSheet = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-actionsheet',
+ pluginRef: 'plugins.actionsheet',
+ repo: 'https://github.com/EddyVerbruggen/cordova-plugin-actionsheet',
+ platforms: ['Android', 'iOS', 'Windows Phone 8']
+ })
+ ], ActionSheet);
+ return ActionSheet;
+}());
+exports.ActionSheet = ActionSheet;
+
+},{"./plugin":48}],4:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name AdMob
+ * @description
+ * @usage
+ */
+var AdMob = (function () {
+ function AdMob() {
+ }
+ // Static Methods
+ /**
+ *
+ * @param adIdOrOptions
+ */
+ AdMob.createBanner = function (adIdOrOptions) { return; };
+ /**
+ *
+ */
+ AdMob.removeBanner = function () { };
+ /**
+ *
+ * @param position
+ */
+ AdMob.showBanner = function (position) { };
+ /**
+ *
+ * @param x
+ * @param y
+ */
+ AdMob.showBannerAtXY = function (x, y) { };
+ /**
+ *
+ */
+ AdMob.hideBanner = function () { };
+ /**
+ *
+ * @param adIdOrOptions
+ */
+ AdMob.prepareInterstitial = function (adIdOrOptions) { return; };
+ /**
+ * Show interstitial
+ */
+ AdMob.showInterstitial = function () { };
+ /**
+ *
+ */
+ AdMob.isInterstitialReady = function () { return; };
+ /**
+ * Prepare a reward video ad
+ * @param adIdOrOptions
+ */
+ AdMob.prepareRewardVideoAd = function (adIdOrOptions) { return; };
+ /**
+ * Show a reward video ad
+ */
+ AdMob.showRewardVideoAd = function () { };
+ /**
+ * Sets the values for configuration and targeting
+ * @param options Returns a promise that resolves if the options are set successfully
+ */
+ AdMob.setOptions = function (options) { return; };
+ /**
+ * Get user ad settings
+ * @returns {Promise} Returns a promise that resolves with the ad settings
+ */
+ AdMob.getAdSettings = function () { return; };
+ // Events
+ AdMob.onBannerFailedToReceive = function () { return; };
+ AdMob.onBannerReceive = function () { return; };
+ AdMob.onBannerPresent = function () { return; };
+ AdMob.onBannerLeaveApp = function () { return; };
+ AdMob.onBannerDismiss = function () { return; };
+ AdMob.onInterstitialFailedToReceive = function () { return; };
+ AdMob.onInterstitialReceive = function () { return; };
+ AdMob.onInterstitialPresent = function () { return; };
+ AdMob.onInterstitialLeaveApp = function () { return; };
+ AdMob.onInterstitialDismiss = function () { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], AdMob, "createBanner", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], AdMob, "removeBanner", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], AdMob, "showBanner", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], AdMob, "showBannerAtXY", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], AdMob, "hideBanner", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], AdMob, "prepareInterstitial", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], AdMob, "showInterstitial", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], AdMob, "isInterstitialReady", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], AdMob, "prepareRewardVideoAd", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], AdMob, "showRewardVideoAd", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], AdMob, "setOptions", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], AdMob, "getAdSettings", null);
+ __decorate([
+ plugin_1.Cordova({
+ eventObservable: true,
+ event: 'onBannerFailedToReceive'
+ })
+ ], AdMob, "onBannerFailedToReceive", null);
+ __decorate([
+ plugin_1.Cordova({
+ eventObservable: true,
+ event: 'onBannerReceive'
+ })
+ ], AdMob, "onBannerReceive", null);
+ __decorate([
+ plugin_1.Cordova({
+ eventObservable: true,
+ event: 'onBannerPresent'
+ })
+ ], AdMob, "onBannerPresent", null);
+ __decorate([
+ plugin_1.Cordova({
+ eventObservable: true,
+ event: 'onBannerLeaveApp'
+ })
+ ], AdMob, "onBannerLeaveApp", null);
+ __decorate([
+ plugin_1.Cordova({
+ eventObservable: true,
+ event: 'onBannerDismiss'
+ })
+ ], AdMob, "onBannerDismiss", null);
+ __decorate([
+ plugin_1.Cordova({
+ eventObservable: true,
+ event: 'onInterstitialFailedToReceive'
+ })
+ ], AdMob, "onInterstitialFailedToReceive", null);
+ __decorate([
+ plugin_1.Cordova({
+ eventObservable: true,
+ event: 'onInterstitialReceive'
+ })
+ ], AdMob, "onInterstitialReceive", null);
+ __decorate([
+ plugin_1.Cordova({
+ eventObservable: true,
+ event: 'onInterstitialPresent'
+ })
+ ], AdMob, "onInterstitialPresent", null);
+ __decorate([
+ plugin_1.Cordova({
+ eventObservable: true,
+ event: 'onInterstitialLeaveApp'
+ })
+ ], AdMob, "onInterstitialLeaveApp", null);
+ __decorate([
+ plugin_1.Cordova({
+ eventObservable: true,
+ event: 'onInterstitialDismiss'
+ })
+ ], AdMob, "onInterstitialDismiss", null);
+ AdMob = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-admobpro',
+ pluginRef: 'AdMob',
+ repo: 'https://github.com/floatinghotspot/cordova-admob-pro'
+ })
+ ], AdMob);
+ return AdMob;
+}());
+exports.AdMob = AdMob;
+
+},{"./plugin":48}],5:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name App Availability
+ * @description
+ * This plugin allows you to check if an app is installed on the user's device. It requires an URI Scheme (e.g. twitter://) on iOS or a Package Name (e.g com.twitter.android) on Android.
+ *
+ * Requires Cordova plugin: cordova-plugin-appavailability. For more info, please see the [AppAvailability plugin docs](https://github.com/ohh2ahh/AppAvailability).
+ *
+ * @usage
+ * ```js
+ * import {AppAvailability} from 'ionic-native';
+ *
+ *
+ * var app;
+ *
+ * if(device.platform === 'iOS') {
+ * app = 'twitter://';
+ * }else if(device.platform === 'Android'){
+ * app = 'com.twitter.android';
+ * }
+ *
+ * AppAvailability.check(app)
+ * .then(
+ * yes => console.log(app + " is available"),
+ * no => console.log(app + " is NOT available")
+ * );
+ * ```
+ */
+var AppAvailability = (function () {
+ function AppAvailability() {
+ }
+ /**
+ * Checks if an app is available on device
+ * @param app Package name on android, or URI scheme on iOS
+ * @returns {Promise}
+ */
+ AppAvailability.check = function (app) { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], AppAvailability, "check", null);
+ AppAvailability = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-appavailability',
+ pluginRef: 'appAvailability',
+ repo: 'https://github.com/ohh2ahh/AppAvailability',
+ platforms: ['Android', 'iOS']
+ })
+ ], AppAvailability);
+ return AppAvailability;
+}());
+exports.AppAvailability = AppAvailability;
+
+},{"./plugin":48}],6:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name App Rate
+ * @description
+ * The AppRate plugin makes it easy to prompt the user to rate your app, either now, later, or never.
+ *
+ * Requires Cordova plugin: cordova-plugin-apprate. For more info, please see the [AppRate plugin docs](https://github.com/pushandplay/cordova-plugin-apprate).
+ *
+ * @usage
+ * ```js
+ * import {AppRate} from 'ionic-native';
+ *
+ *
+ * AppRate.preferences.storeAppURL.ios = '';
+ * AppRate.preferences.storeAppURL.android = 'market://details?id=';
+ * AppRate.preferences.storeAppURL.blackberry = 'appworld://content/[App Id]/';
+ * AppRate.preferences.storeAppURL.windows8 = 'ms-windows-store:Review?name=';
+ * AppRate.promptForRating();
+ * ```
+ */
+var AppRate = (function () {
+ function AppRate() {
+ }
+ Object.defineProperty(AppRate, "preferences", {
+ /**
+ * Rating dialog preferences
+ *
+ * | Option | Type | Default | Description |
+ * |------------------------------|------------|---------|----------------------------------------------------------------------------------------|
+ * | useLanguage | `String` | null | custom BCP 47 language tag |
+ * | displayAppName | `String` | '' | custom application title |
+ * | promptAgainForEachNewVersion | `Boolean` | true | show dialog again when application version will be updated |
+ * | usesUntilPrompt | `Integer` | 3 | count of runs of application before dialog will be displayed |
+ * | openStoreInApp | `Boolean` | false | leave app or no when application page opened in app store (now supported only for iOS) |
+ * | useCustomRateDialog | `Boolean` | false | use custom view for rate dialog |
+ * | callbacks.onButtonClicked | `Function` | null | call back function. called when user clicked on rate-dialog buttons |
+ * | callbacks.onRateDialogShow | `Function` | null | call back function. called when rate-dialog showing |
+ * | storeAppURL.ios | `String` | null | application id in AppStore |
+ * | storeAppURL.android | `String` | null | application URL in GooglePlay |
+ * | storeAppURL.blackberry | `String` | null | application URL in AppWorld |
+ * | storeAppURL.windows8 | `String` | null | application URL in WindowsStore |
+ * | customLocale | `Object` | null | custom locale object |
+ * @type {{}}
+ */
+ get: function () { return window.AppRate.preferences; },
+ enumerable: true,
+ configurable: true
+ });
+ /**
+ * Prompts the user for rating
+ *
+ * @param {boolean} immediately Show the rating prompt immediately.
+ */
+ AppRate.promptForRating = function (immediately) { };
+ ;
+ __decorate([
+ plugin_1.CordovaProperty
+ ], AppRate, "preferences", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], AppRate, "promptForRating", null);
+ AppRate = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-apprate',
+ pluginRef: 'AppRate',
+ repo: 'https://github.com/pushandplay/cordova-plugin-apprate',
+ platforms: ['Android', 'iOS']
+ })
+ ], AppRate);
+ return AppRate;
+}());
+exports.AppRate = AppRate;
+
+},{"./plugin":48}],7:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name App Version
+ * @description
+ * Reads the version of your app from the target build settings.
+ *
+ * Requires Cordova plugin: `cordova-plugin-app-version`. For more info, please see the [Cordova App Version docs](https://github.com/whiteoctober/cordova-plugin-app-version).
+ *
+ * @usage
+ * ```js
+ * import {AppVersion} from 'ionic-native';
+ *
+ *
+ * AppVersion.getAppName();
+ * AppVersion.getPackageName();
+ * AppVersion.getVersionCode();
+ * AppVersion.getVersionNumber();
+ * ```
+ */
+var AppVersion = (function () {
+ function AppVersion() {
+ }
+ /**
+ * Returns the name of the app
+ * @returns {Promise}
+ */
+ AppVersion.getAppName = function () { return; };
+ /**
+ * Returns the package name of the app
+ * @returns {Promise}
+ */
+ AppVersion.getPackageName = function () { return; };
+ /**
+ * Returns the build identifier of the app
+ * @returns {Promise}
+ */
+ AppVersion.getVersionCode = function () { return; };
+ /**
+ * Returns the version of the app
+ * @returns {Promise}
+ */
+ AppVersion.getVersionNumber = function () { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], AppVersion, "getAppName", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], AppVersion, "getPackageName", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], AppVersion, "getVersionCode", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], AppVersion, "getVersionNumber", null);
+ AppVersion = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-app-version',
+ pluginRef: 'cordova.getAppVersion',
+ repo: 'https://github.com/whiteoctober/cordova-plugin-app-version',
+ platforms: ['Android', 'iOS']
+ })
+ ], AppVersion);
+ return AppVersion;
+}());
+exports.AppVersion = AppVersion;
+
+},{"./plugin":48}],8:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name BackgroundGeolocation
+ * @description
+ * This plugin provides foreground and background geolocation with battery-saving "circular region monitoring" and "stop detection". For
+ * more detail, please see https://github.com/mauron85/cordova-plugin-background-geolocation
+ *
+ * @usage
+ *
+ * ```ts
+ * import {BackgroundGeolocation} from 'ionic-native';
+ *
+ *
+ *
+ * // When device is ready :
+ * platform.ready().then(() => {
+ *
+ * // BackgroundGeolocation is highly configurable. See platform specific configuration options
+ * let config = {
+ * desiredAccuracy: 10,
+ * stationaryRadius: 20,
+ * distanceFilter: 30,
+ * debug: true, // enable this hear sounds for background-geolocation life-cycle.
+ * stopOnTerminate: false, // enable this to clear background location settings when the app terminates
+ * };
+ *
+ * BackgroundGeolocation.configure(config)
+ * .then((location) => {
+ * console.log('[js] BackgroundGeolocation callback: ' + location.latitude + ',' + location.longitude);
+ *
+ * // IMPORTANT: You must execute the finish method here to inform the native plugin that you're finished,
+ * // and the background-task may be completed. You must do this regardless if your HTTP request is successful or not.
+ * // IF YOU DON'T, ios will CRASH YOUR APP for spending too much time in the background.
+ * BackgroundGeolocation.finish(); // FOR IOS ONLY
+ * })
+ * .catch((error) => {
+ * console.log('BackgroundGeolocation error');
+ * });
+ *
+ * // Turn ON the background-geolocation system. The user will be tracked whenever they suspend the app.
+ * BackgroundGeolocation.start();
+ * }
+ *
+ * // If you wish to turn OFF background-tracking, call the #stop method.
+ * BackgroundGeolocation.stop();
+ *
+ * ```
+ */
+var BackgroundGeolocation = (function () {
+ function BackgroundGeolocation() {
+ }
+ /**
+ * Configure the plugin.
+ * Success callback will be called with one argument - Location object, which tries to mimic w3c Coordinates interface.
+ * See http://dev.w3.org/geo/api/spec-source.html#coordinates_interface
+ * Callback to be executed every time a geolocation is recorded in the background.
+ *
+ * Fail callback to be executed every time a geolocation error occurs.
+ *
+ * Options a json object of type Config
+ */
+ BackgroundGeolocation.configure = function (options) { return; };
+ /**
+ * Turn ON the background-geolocation system.
+ * The user will be tracked whenever they suspend the app.
+ */
+ BackgroundGeolocation.start = function () { return; };
+ /**
+ * Turn OFF background-tracking
+ */
+ BackgroundGeolocation.stop = function () { return; };
+ /**
+ * Inform the native plugin that you're finished, the background-task may be completed
+ * NOTE: IOS, WP only
+ */
+ BackgroundGeolocation.finish = function () { };
+ /**
+ * Force the plugin to enter "moving" or "stationary" state
+ * NOTE: IOS, WP only
+ */
+ BackgroundGeolocation.changePace = function (isMoving) { };
+ /**
+ * Setup configuration
+ */
+ BackgroundGeolocation.setConfig = function (options) { return; };
+ /**
+ * Returns current stationaryLocation if available. null if not
+ * NOTE: IOS, WP only
+ */
+ BackgroundGeolocation.getStationaryLocation = function () { return; };
+ /**
+ * Add a stationary-region listener. Whenever the devices enters "stationary-mode",
+ * your #success callback will be executed with #location param containing #radius of region
+ * NOTE: IOS, WP only
+ */
+ BackgroundGeolocation.onStationary = function () { return; };
+ /**
+ * Check if location is enabled on the device
+ * @returns {Promise} Returns a promise with int argument that takes values 0, 1 (true).
+ * NOTE: ANDROID only
+ */
+ BackgroundGeolocation.isLocationEnabled = function () { return; };
+ /**
+ * Display device location settings
+ */
+ BackgroundGeolocation.showLocationSettings = function () { };
+ /**
+ * Method can be used to detect user changes in location services settings.
+ * If user enable or disable location services then success callback will be executed.
+ * In case or error (SettingNotFoundException) fail callback will be executed.
+ * NOTE: ANDROID only
+ */
+ BackgroundGeolocation.watchLocationMode = function () { return; };
+ /**
+ * Stop watching for location mode changes.
+ * NOTE: ANDROID only
+ */
+ BackgroundGeolocation.stopWatchingLocationMode = function () { };
+ /**
+ * Method will return all stored locations.
+ * Locations are stored when:
+ * - config.stopOnTerminate is false and main activity was killed
+ * by the system
+ * or
+ * - option.debug is true
+ * NOTE: ANDROID only
+ */
+ BackgroundGeolocation.getLocations = function () { return; };
+ /**
+ * Delete stored location by given locationId.
+ * NOTE: ANDROID only
+ */
+ BackgroundGeolocation.deleteLocation = function (locationId) { return; };
+ /**
+ * Delete all stored locations.
+ * NOTE: ANDROID only
+ */
+ BackgroundGeolocation.deleteAllLocations = function () { return; };
+ __decorate([
+ plugin_1.Cordova({
+ callbackOrder: 'reverse'
+ })
+ ], BackgroundGeolocation, "configure", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BackgroundGeolocation, "start", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BackgroundGeolocation, "stop", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BackgroundGeolocation, "finish", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BackgroundGeolocation, "changePace", null);
+ __decorate([
+ plugin_1.Cordova({
+ callbackOrder: 'reverse'
+ })
+ ], BackgroundGeolocation, "setConfig", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BackgroundGeolocation, "getStationaryLocation", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BackgroundGeolocation, "onStationary", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BackgroundGeolocation, "isLocationEnabled", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BackgroundGeolocation, "showLocationSettings", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BackgroundGeolocation, "watchLocationMode", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BackgroundGeolocation, "stopWatchingLocationMode", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BackgroundGeolocation, "getLocations", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BackgroundGeolocation, "deleteLocation", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BackgroundGeolocation, "deleteAllLocations", null);
+ BackgroundGeolocation = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-mauron85-background-geolocation',
+ pluginRef: 'plugins.backgroundGeoLocation',
+ repo: 'https://github.com/mauron85/cordova-plugin-background-geolocation'
+ })
+ ], BackgroundGeolocation);
+ return BackgroundGeolocation;
+}());
+exports.BackgroundGeolocation = BackgroundGeolocation;
+
+},{"./plugin":48}],9:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+* @name Background Mode
+* @description
+* Cordova plugin to prevent the app from going to sleep while in background.
+* Requires Cordova plugin: cordova-plugin-background-mode. For more info about plugin, vist: https://github.com/katzer/cordova-plugin-background-mode#android-customization
+*@usage
+* ```js
+* import {BackgroundMode} from 'ionic-native';
+*
+* BackgroundMode.enable();
+*/
+var BackgroundMode = (function () {
+ function BackgroundMode() {
+ }
+ /**
+ * Enable the background mode.
+ * Once called, prevents the app from being paused while in background.
+ */
+ BackgroundMode.enable = function () { };
+ /**
+ * Disable the background mode.
+ * Once the background mode has been disabled, the app will be paused when in background.
+ */
+ BackgroundMode.disable = function () { };
+ /**
+ * Checks if background mode is enabled or not.
+ */
+ BackgroundMode.isEnabled = function () { return; };
+ /**
+ * Can be used to get the information if the background mode is active.
+ */
+ BackgroundMode.isActive = function () { return; };
+ /**
+ * Override the default title, ticker and text.
+ * Available only for Android platform.
+ */
+ BackgroundMode.setDefaults = function (options) { };
+ /**
+ * Modify the displayed information.
+ * Available only for Android platform.
+ */
+ BackgroundMode.update = function (options) { };
+ /**
+ * Sets a callback for a specific event
+ * Can be used to get notified or run function when the background mode has been activated, deactivated or failed.
+ * @param eventName The name of the event. Available events: activate, deactivate, failure
+ */
+ BackgroundMode.on = function (eventName, callback) { };
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], BackgroundMode, "enable", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BackgroundMode, "disable", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BackgroundMode, "isEnabled", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BackgroundMode, "isActive", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android']
+ })
+ ], BackgroundMode, "setDefaults", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android']
+ })
+ ], BackgroundMode, "update", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], BackgroundMode, "on", null);
+ BackgroundMode = __decorate([
+ plugin_1.Plugin({
+ plugin: 'de.appplant.cordova.plugin.background-mode',
+ pluginRef: 'cordova.plugins.backgroundMode',
+ repo: 'https://github.com/katzer/cordova-plugin-background-mode',
+ platforms: ['Android', 'iOS', 'Windows Phone 8']
+ })
+ ], BackgroundMode);
+ return BackgroundMode;
+}());
+exports.BackgroundMode = BackgroundMode;
+
+},{"./plugin":48}],10:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Badge
+ * @description
+ * The essential purpose of badge numbers is to enable an application to inform its users that it has something for them — for example, unread messages — when the application isn’t running in the foreground.
+ *
+ * Requires Cordova plugin: cordova-plugin-badge. For more info, please see the [Badge plugin docs](https://github.com/katzer/cordova-plugin-badge).
+ *
+ * @usage
+ * ```js
+ * import {Badge} from 'ionic-native';
+ *
+ *
+ * Badge.set(10);
+ * Badge.increase();
+ * Badge.clear();
+ * ```
+ */
+var Badge = (function () {
+ function Badge() {
+ }
+ /**
+ * Clear the badge of the app icon.
+ */
+ Badge.clear = function () { return; };
+ /**
+ * Set the badge of the app icon.
+ * @param {number} badgeNumber The new badge number.
+ * @returns {Promise}
+ */
+ Badge.set = function (badgeNumber) { return; };
+ /**
+ * Get the badge of the app icon.
+ * @returns {Promise}
+ */
+ Badge.get = function () { return; };
+ /**
+ * Increase the badge number.
+ * @param {number} increaseBy Count to add to the current badge number
+ * @returns {Promise}
+ */
+ Badge.increase = function (increaseBy) { return; };
+ /**
+ * Decrease the badge number.
+ * @param {number} decreaseBy Count to subtract from the current badge number
+ * @returns {Promise}
+ */
+ Badge.decrease = function (decreaseBy) { return; };
+ /**
+ * Determine if the app has permission to show badges.
+ */
+ Badge.hasPermission = function () { return; };
+ /**
+ * Register permission to set badge notifications
+ * @returns {Promise}
+ */
+ Badge.registerPermission = function () { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], Badge, "clear", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Badge, "set", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Badge, "get", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Badge, "increase", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Badge, "decrease", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Badge, "hasPermission", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Badge, "registerPermission", null);
+ Badge = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-badge',
+ pluginRef: 'cordova.plugins.notification.badge',
+ repo: 'https://github.com/katzer/cordova-plugin-badge',
+ platforms: ['Android', 'iOS', 'Browser', 'Windows', 'Amazon FireOS', 'Windows Phone 8']
+ })
+ ], Badge);
+ return Badge;
+}());
+exports.Badge = Badge;
+
+},{"./plugin":48}],11:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Barcode Scanner
+ * @description
+ * The Barcode Scanner Plugin opens a camera view and automatically scans a barcode, returning the data back to you.
+ *
+ * Requires Cordova plugin: `phonegap-plugin-barcodescanner`. For more info, please see the [BarcodeScanner plugin docs](https://github.com/phonegap/phonegap-plugin-barcodescanner).
+ *
+ * @usage
+ * ```js
+ * import {BarcodeScanner} from 'ionic-native';
+ *
+ *
+ * BarcodeScanner.scan().then((barcodeData) => {
+ * // Success! Barcode data is here
+ * }, (err) => {
+ * // An error occurred
+ * });
+ * ```
+ */
+var BarcodeScanner = (function () {
+ function BarcodeScanner() {
+ }
+ /**
+ * Open the barcode scanner.
+ * @return Returns a Promise that resolves with scanner data, or rejects with an error.
+ */
+ BarcodeScanner.scan = function (options) { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], BarcodeScanner, "scan", null);
+ BarcodeScanner = __decorate([
+ plugin_1.Plugin({
+ plugin: 'phonegap-plugin-barcodescanner',
+ pluginRef: 'cordova.plugins.barcodeScanner',
+ repo: 'https://github.com/phonegap/phonegap-plugin-barcodescanner',
+ platforms: ['Android', 'iOS', 'Windows Phone 8', 'Windows 10', 'Windows 8', 'BlackBerry 10', 'Browser']
+ })
+ ], BarcodeScanner);
+ return BarcodeScanner;
+}());
+exports.BarcodeScanner = BarcodeScanner;
+
+},{"./plugin":48}],12:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Base64 To Gallery
+ * @description This plugin allows you to save base64 data as a png image into the device
+ * @usage
+ * ```ts
+ * import {Base64ToGallery} from 'ionic-native';
+ *
+ *
+ * Base64ToGallery.base64ToGallery(base64Data, 'img_').then(
+ * res => console.log("Saved image to gallery ", res),
+ * err => console.log("Error saving image to gallery ", err)
+ * );
+ * ```
+ */
+var Base64ToGallery = (function () {
+ function Base64ToGallery() {
+ }
+ /**
+ * Converts a base64 string to an image file in the device gallery
+ * @param data
+ * @param prefix
+ */
+ Base64ToGallery.prototype.base64ToGallery = function (data, prefix) {
+ return;
+ };
+ __decorate([
+ plugin_1.Cordova()
+ ], Base64ToGallery.prototype, "base64ToGallery", null);
+ Base64ToGallery = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-base64-to-gallery',
+ pluginRef: 'cordova',
+ repo: 'https://github.com/Nexxa/cordova-base64-to-gallery',
+ platforms: ['Android', 'iOS', 'Windows Phone 8']
+ })
+ ], Base64ToGallery);
+ return Base64ToGallery;
+}());
+exports.Base64ToGallery = Base64ToGallery;
+
+},{"./plugin":48}],13:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Battery Status
+ * @description
+ * Requires Cordova plugin: cordova-plugin-batterystatus. For more info, please see the [BatteryStatus plugin docs](https://github.com/apache/cordova-plugin-battery-status).
+ *
+ * @usage
+ * ```js
+ * import {BatteryStatus} from 'ionic-native';
+ *
+ *
+ *
+ * // watch change in battery status
+ * let subscription = BatteryStatus.onChange().subscribe(
+ * status => {
+ * console.log(status.level, status.isPlugged);
+ * }
+ * );
+ *
+ * // stop watch
+ * subscription.unsubscribe();
+ *
+ * ```
+ */
+var BatteryStatus = (function () {
+ function BatteryStatus() {
+ }
+ /**
+ * Watch the change in battery level
+ * @returns {Observable} Returns an observable that pushes a status object
+ */
+ BatteryStatus.onChange = function () { return; };
+ /**
+ * Watch when the battery level goes low
+ * @returns {Observable} Returns an observable that pushes a status object
+ */
+ BatteryStatus.onLow = function () { return; };
+ /**
+ * Watch when the battery level goes to critial
+ * @returns {Observable} Returns an observable that pushes a status object
+ */
+ BatteryStatus.onCritical = function () { return; };
+ __decorate([
+ plugin_1.Cordova({
+ eventObservable: true,
+ event: 'batterystatus'
+ })
+ ], BatteryStatus, "onChange", null);
+ __decorate([
+ plugin_1.Cordova({
+ eventObservable: true,
+ event: 'batterylow'
+ })
+ ], BatteryStatus, "onLow", null);
+ __decorate([
+ plugin_1.Cordova({
+ eventObservable: true,
+ event: 'batterycritical'
+ })
+ ], BatteryStatus, "onCritical", null);
+ BatteryStatus = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-battery-status',
+ repo: 'https://github.com/apache/cordova-plugin-battery-status',
+ platforms: ['Amazon Fire OS', 'iOS', 'Android', 'BlackBerry 10', 'Windows Phone 7', 'Windows Phone 8', 'Windows', 'Firefox OS', 'Browser']
+ })
+ ], BatteryStatus);
+ return BatteryStatus;
+}());
+exports.BatteryStatus = BatteryStatus;
+
+},{"./plugin":48}],14:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name BLE
+ * @description
+ * This plugin enables communication between a phone and Bluetooth Low Energy (BLE) peripherals.
+ *
+ * The plugin provides a simple JavaScript API for iOS and Android.
+ *
+ * - Scan for peripherals
+ * - Connect to a peripheral
+ * - Read the value of a characteristic
+ * - Write new value to a characteristic
+ * - Get notified when characteristic's value changes
+ *
+ * Advertising information is returned when scanning for peripherals. Service, characteristic, and property info is returned when connecting to a peripheral. All access is via service and characteristic UUIDs. The plugin manages handles internally.
+ *
+ * Simultaneous connections to multiple peripherals are supported.
+ *
+ * @usage
+ *
+ * ## Peripheral Data
+ *
+ * Peripheral Data is passed to the success callback when scanning and connecting. Limited data is passed when scanning.
+ *
+ * ```ts
+ * {
+ * "name": "Battery Demo",
+ * "id": "20:FF:D0:FF:D1:C0",
+ * "advertising": [2,1,6,3,3,15,24,8,9,66,97,116,116,101,114,121],
+ * "rssi": -55
+ * }
+ * ```
+ * After connecting, the peripheral object also includes service, characteristic and descriptor information.
+ *
+ * ```ts
+ * {
+ * "name": "Battery Demo",
+ * "id": "20:FF:D0:FF:D1:C0",
+ * "advertising": [2,1,6,3,3,15,24,8,9,66,97,116,116,101,114,121],
+ * "rssi": -55,
+ * "services": [
+ * "1800",
+ * "1801",
+ * "180f"
+ * ],
+ * "characteristics": [
+ * {
+ * "service": "1800",
+ * "characteristic": "2a00",
+ * "properties": [
+ * "Read"
+ * ]
+ * },
+ * {
+ * "service": "1800",
+ * "characteristic": "2a01",
+ * "properties": [
+ * "Read"
+ * ]
+ * },
+ * {
+ * "service": "1801",
+ * "characteristic": "2a05",
+ * "properties": [
+ * "Read"
+ * ]
+ * },
+ * {
+ * "service": "180f",
+ * "characteristic": "2a19",
+ * "properties": [
+ * "Read"
+ * ],
+ * "descriptors": [
+ * {
+ * "uuid": "2901"
+ * },
+ * {
+ * "uuid": "2904"
+ * }
+ * ]
+ * }
+ * ]
+ * }
+ * ```
+ *
+ * ## Advertising Data
+ * Bluetooth advertising data is returned in when scanning for devices. The format format varies depending on your platform. On Android advertising data will be the raw advertising bytes. iOS does not allow access to raw advertising data, so a dictionary of data is returned.
+ *
+ * The advertising information for both Android and iOS appears to be a combination of advertising data and scan response data.
+ *
+ * ### Android
+ *
+ * ```ts
+ * {
+ * "name": "demo",
+ * "id": "00:1A:7D:DA:71:13",
+ * "advertising": ArrayBuffer,
+ * "rssi": -37
+ * }
+ * ```
+ *
+ * Convert the advertising info to a Uint8Array for processing. `var adData = new Uint8Array(peripheral.advertising)`
+ *
+ * ### iOS
+ *
+ * Note that iOS uses the string value of the constants for the [Advertisement Data Retrieval Keys](https://developer.apple.com/library/ios/documentation/CoreBluetooth/Reference/CBCentralManagerDelegate_Protocol/index.html#//apple_ref/doc/constant_group/Advertisement_Data_Retrieval_Keys). This will likely change in the future.
+ *
+ * ```ts
+ * {
+ * "name": "demo",
+ * "id": "D8479A4F-7517-BCD3-91B5-3302B2F81802",
+ * "advertising": {
+ * "kCBAdvDataChannel": 37,
+ * "kCBAdvDataServiceData": {
+ * "FED8": {
+ * "byteLength": 7 // data not shown
+ * }
+ * },
+ * "kCBAdvDataLocalName": "demo",
+ * "kCBAdvDataServiceUUIDs": ["FED8"],
+ * "kCBAdvDataManufacturerData": {
+ * "byteLength": 7 // data not shown
+ * },
+ * "kCBAdvDataTxPowerLevel": 32,
+ * "kCBAdvDataIsConnectable": true
+ * },
+ * "rssi": -53
+ * }
+ * ```
+ *
+ * ## Typed Arrays
+ *
+ * This plugin uses typed Arrays or ArrayBuffers for sending and receiving data.
+ *
+ * This means that you need convert your data to ArrayBuffers before sending and from ArrayBuffers when receiving.
+ *
+ * ```ts
+ * // ASCII only
+ * function stringToBytes(string) {
+ * var array = new Uint8Array(string.length);
+ * for (var i = 0, l = string.length; i < l; i++) {
+ * array[i] = string.charCodeAt(i);
+ * }
+ * return array.buffer;
+ * }
+ *
+ * // ASCII only
+ * function bytesToString(buffer) {
+ * return String.fromCharCode.apply(null, new Uint8Array(buffer));
+ * }
+ * ```
+ * You can read more about typed arrays in these articles on [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) and [HTML5 Rocks](http://www.html5rocks.com/en/tutorials/webgl/typed_arrays/).
+ *
+ * ## UUIDs
+ *
+ * UUIDs are always strings and not numbers. Some 16-bit UUIDs, such as '2220' look like integers, but they're not. (The integer 2220 is 0x8AC in hex.) This isn't a problem with 128 bit UUIDs since they look like strings 82b9e6e1-593a-456f-be9b-9215160ebcac. All 16-bit UUIDs should also be passed to methods as strings.
+ *
+ */
+var BLE = (function () {
+ function BLE() {
+ }
+ /**
+ * Scan and discover BLE peripherals for the specified amount of time.
+ *
+ * @usage
+ * ```
+ * BLE.scan([], 5).subscribe(device => {
+ * console.log(JSON.stringify(device));
+ * });
+ * ```
+ * @param {string[]} services List of service UUIDs to discover, or `[]` to find all devices
+ * @param {number} seconds Number of seconds to run discovery
+ * @return Returns an Observable that notifies of each peripheral that is discovered during the specified time.
+ */
+ BLE.scan = function (services, seconds) { return; };
+ /**
+ * Scan and discover BLE peripherals until `stopScan` is called.
+ *
+ * @usage
+ * ```
+ * BLE.startScan([]).subscribe(device => {
+ * console.log(JSON.stringify(device));
+ * });
+ *
+ * setTimeout(() => {
+ * BLE.stopScan();
+ * }, 5000);
+ * ```
+ * @param {string[]} services List of service UUIDs to discover, or `[]` to find all devices
+ * @return Returns an Observable that notifies of each peripheral discovered.
+ */
+ BLE.startScan = function (services) { return; };
+ /**
+ * Stop a scan started by `startScan`.
+ *
+ * @usage
+ * ```
+ * BLE.startScan([]).subscribe(device => {
+ * console.log(JSON.stringify(device));
+ * });
+ * setTimeout(() => {
+ * BLE.stopScan().then(() => { console.log('scan stopped'); });
+ * }, 5000);
+ * ```
+ * @return returns a Promise.
+ */
+ BLE.stopScan = function () { return; };
+ /**
+ * Connect to a peripheral.
+ * @usage
+ * ```
+ * BLE.connect('12:34:56:78:9A:BC').subscribe(peripheralData => {
+ * console.log(peripheralData);
+ * },
+ * peripheralData => {
+ * console.log('disconnected');
+ * });
+ * ```
+ * @param deviceId {string} UUID or MAC address of the peripheral
+ * @return Returns an Observable that notifies of connect/disconnect.
+ */
+ BLE.connect = function (deviceId) { return; };
+ /**
+ * Disconnect from a peripheral.
+ * @usage
+ * ```
+ * BLE.disconnect('12:34:56:78:9A:BC').then(() => {
+ * console.log('Disconnected');
+ * });
+ * ```
+ * @param deviceId {string} UUID or MAC address of the peripheral
+ * @return Returns a Promise
+ */
+ BLE.disconnect = function (deviceId) { return; };
+ /**
+ * Read the value of a characteristic.
+ *
+ * @param {string} deviceId UUID or MAC address of the peripheral
+ * @param {string} serviceUUID UUID of the BLE service
+ * @param {string} characteristicUUID UUID of the BLE characteristic
+ * @return Returns a Promise
+ */
+ BLE.read = function (deviceId, serviceUUID, characteristicUUID) { return; };
+ ;
+ /**
+ * Write the value of a characteristic.
+ * @usage
+ * ```
+ * // send 1 byte to switch a light on
+ * var data = new Uint8Array(1);
+ * data[0] = 1;
+ * BLE.write(device_id, "FF10", "FF11", data.buffer);
+ *
+ * // send a 3 byte value with RGB color
+ * var data = new Uint8Array(3);
+ * data[0] = 0xFF; // red
+ * data[0] = 0x00; // green
+ * data[0] = 0xFF; // blue
+ * BLE.write(device_id, "ccc0", "ccc1", data.buffer);
+ *
+ * // send a 32 bit integer
+ * var data = new Uint32Array(1);
+ * data[0] = counterInput.value;
+ * BLE.write(device_id, SERVICE, CHARACTERISTIC, data.buffer);
+ *
+ * ```
+ * @param {string} deviceId UUID or MAC address of the peripheral
+ * @param {string} serviceUUID UUID of the BLE service
+ * @param {string} characteristicUUID UUID of the BLE characteristic
+ * @param {ArrayBuffer} value Data to write to the characteristic, as an ArrayBuffer.
+ * @return Returns a Promise
+ */
+ BLE.write = function (deviceId, serviceUUID, characteristicUUID, value) { return; };
+ /**
+ * Write the value of a characteristic without waiting for confirmation from the peripheral.
+ *
+ * @param {string} deviceId UUID or MAC address of the peripheral
+ * @param {string} serviceUUID UUID of the BLE service
+ * @param {string} characteristicUUID UUID of the BLE characteristic
+ * @param {ArrayBuffer} value Data to write to the characteristic, as an ArrayBuffer.
+ * @return Returns a Promise
+ */
+ BLE.writeWithoutResponse = function (deviceId, serviceUUID, characteristicUUID, value) { return; };
+ /**
+ * Register to be notified when the value of a characteristic changes.
+ *
+ * @usage
+ * ```
+ * BLE.startNotification(device_id, "FF10", "FF11").subscribe(buffer => {
+ * console.log(String.fromCharCode.apply(null, new Uint8Array(buffer));
+ * });
+ * ```
+ *
+ * @param {string} deviceId UUID or MAC address of the peripheral
+ * @param {string} serviceUUID UUID of the BLE service
+ * @param {string} characteristicUUID UUID of the BLE characteristic
+ * @return Returns an Observable that notifies of characteristic changes.
+ */
+ BLE.startNotification = function (deviceId, serviceUUID, characteristicUUID) { return; };
+ /**
+ * Stop being notified when the value of a characteristic changes.
+ *
+ * @param {string} deviceId UUID or MAC address of the peripheral
+ * @param {string} serviceUUID UUID of the BLE service
+ * @param {string} characteristicUUID UUID of the BLE characteristic
+ * @return Returns a Promise.
+ */
+ BLE.stopNotification = function (deviceId, serviceUUID, characteristicUUID) { return; };
+ /**
+ * Report the connection status.
+ *
+ * @usage
+ * ```
+ * BLE.isConnected('FFCA0B09-CB1D-4DC0-A1EF-31AFD3EDFB53').then(
+ * () => { console.log('connected'); },
+ * () => { console.log('not connected'); }
+ * );
+ * ```
+ * @param {string} deviceId UUID or MAC address of the peripheral
+ * @return Returns a Promise.
+ */
+ BLE.isConnected = function (deviceId) { return; };
+ /**
+ * Report if bluetooth is enabled.
+ *
+ * @usage
+ * ```
+ * BLE.isEnabled().then(
+ * () => { console.log('enabled'); },
+ * () => { console.log('not enabled'); }
+ * );
+ * ```
+ * @return Returns a Promise.
+ */
+ BLE.isEnabled = function () { return; };
+ /**
+ * Open System Bluetooth settings (Android only).
+ *
+ * @return Returns a Promise.
+ */
+ BLE.showBluetoothSettings = function () { return; };
+ /**
+ * Enable Bluetooth on the device (Android only).
+ *
+ * @return Returns a Promise.
+ */
+ BLE.enable = function () { return; };
+ __decorate([
+ plugin_1.Cordova({
+ observable: true
+ })
+ ], BLE, "scan", null);
+ __decorate([
+ plugin_1.Cordova({
+ observable: true,
+ clearFunction: 'stopScan',
+ clearWithArgs: true
+ })
+ ], BLE, "startScan", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BLE, "stopScan", null);
+ __decorate([
+ plugin_1.Cordova({
+ observable: true,
+ clearFunction: 'disconnect',
+ clearWithArgs: true
+ })
+ ], BLE, "connect", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BLE, "disconnect", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BLE, "read", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BLE, "write", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BLE, "writeWithoutResponse", null);
+ __decorate([
+ plugin_1.Cordova({
+ observable: true,
+ clearFunction: 'stopNotification',
+ clearWithArgs: true
+ })
+ ], BLE, "startNotification", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BLE, "stopNotification", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BLE, "isConnected", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BLE, "isEnabled", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BLE, "showBluetoothSettings", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], BLE, "enable", null);
+ BLE = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-ble-central',
+ pluginRef: 'ble',
+ repo: 'https://github.com/don/cordova-plugin-ble-central',
+ platforms: ['iOS', 'Android']
+ })
+ ], BLE);
+ return BLE;
+}());
+exports.BLE = BLE;
+
+},{"./plugin":48}],15:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Bluetooth Serial
+ * @description This plugin enables serial communication over Bluetooth. It was written for communicating between Android or iOS and an Arduino.
+ * @usage
+ */
+var BluetoothSerial = (function () {
+ function BluetoothSerial() {
+ }
+ /**
+ * Connect to a Bluetooth device
+ * Returns an Observable. Subscribe to connect, unsubscribe to disconnect.
+ * @param macAddress_or_uuid Identifier of the remote device
+ */
+ BluetoothSerial.connect = function (macAddress_or_uuid) { return; };
+ /**
+ * Connect insecurely to a Bluetooth device
+ * Returns an Observable. Subscribe to connect, unsubscribe to disconnect.
+ * @param macAddress Identifier of the remote device
+ */
+ BluetoothSerial.connectInsecure = function (macAddress) { return; };
+ /**
+ * Writes data to the serial port
+ * @param data ArrayBuffer of data
+ * @usage
+ * ```ts
+ * // Write a string
+ * Bluetooth.write("hello world").then(success, failure);
+ *
+ * // Array of int or bytes
+ * Bluetooth.write([186, 220, 222]).then(success, failure);
+ *
+ * // Typed Array
+ * var data = new Uint8Array(4);
+ * data[0] = 0x41;
+ * data[1] = 0x42;
+ * data[2] = 0x43;
+ * data[3] = 0x44;
+ * Bluetooth.write(data).then(success, failure);
+ *
+ * // Array Buffer
+ * Bluetooth.write(data.buffer).then(success, failure);
+ * ```
+ */
+ BluetoothSerial.write = function (data) { return; };
+ /**
+ * Gets the number of bytes of data available
+ */
+ BluetoothSerial.available = function () { return; };
+ /**
+ * Reads data from the buffer
+ */
+ BluetoothSerial.read = function () { return; };
+ /**
+ * Reads data from the buffer until it reaches a delimiter
+ * @param delimiter
+ */
+ BluetoothSerial.readUntil = function (delimiter) { return; };
+ /**
+ * Subscribe to be notified when data is received
+ * @param delimiter
+ */
+ BluetoothSerial.subscribe = function (delimiter) { return; };
+ /**
+ * Subscribe to be notified when data is received
+ */
+ BluetoothSerial.subscribeRawData = function () { return; };
+ /**
+ * Clears data in buffer
+ */
+ BluetoothSerial.clear = function () { return; };
+ /**
+ * Lists bonded devices
+ */
+ BluetoothSerial.list = function () { return; };
+ /**
+ * Reports if bluetooth is enabled
+ */
+ BluetoothSerial.isEnabled = function () { return; };
+ /**
+ * Reports the connection status
+ */
+ BluetoothSerial.isConnected = function () { return; };
+ /**
+ * Reads the RSSI from the connected peripheral
+ */
+ BluetoothSerial.readRSSI = function () { return; };
+ /**
+ * Show the Bluetooth settings on the device
+ */
+ BluetoothSerial.showBluetoothSettings = function () { return; };
+ /**
+ * Enable Bluetooth on the device
+ */
+ BluetoothSerial.enable = function () { return; };
+ /**
+ * Discover unpaired devices
+ * @usage
+ * ```ts
+ * [{
+ * "class": 276,
+ * "id": "10:BF:48:CB:00:00",
+ * "address": "10:BF:48:CB:00:00",
+ * "name": "Nexus 7"
+ * }, {
+ * "class": 7936,
+ * "id": "00:06:66:4D:00:00",
+ * "address": "00:06:66:4D:00:00",
+ * "name": "RN42"
+ * }]
+ * ```
+ */
+ BluetoothSerial.discoverUnpaired = function () { return; };
+ /**
+ * Subscribe to be notified on Bluetooth device discovery. Discovery process must be initiated with the `discoverUnpaired` function.
+ */
+ BluetoothSerial.setDeviceDiscoveredListener = function () { return; };
+ /**
+ * Sets the human readable device name that is broadcasted to other devices
+ * @param newName Desired name of device
+ */
+ BluetoothSerial.setName = function (newName) { };
+ /**
+ * Makes the device discoverable by other devices
+ * @param discoverableDuration Desired number of seconds device should be discoverable for
+ */
+ BluetoothSerial.setDiscoverable = function (discoverableDuration) { };
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android', 'iOS', 'Windows Phone'],
+ observable: true,
+ clearFunction: 'disconnect'
+ })
+ ], BluetoothSerial, "connect", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android'],
+ observable: true,
+ clearFunction: 'disconnect'
+ })
+ ], BluetoothSerial, "connectInsecure", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android', 'iOS', 'Windows Phone']
+ })
+ ], BluetoothSerial, "write", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android', 'iOS', 'Windows Phone']
+ })
+ ], BluetoothSerial, "available", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android', 'iOS', 'Windows Phone']
+ })
+ ], BluetoothSerial, "read", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android', 'iOS', 'Windows Phone']
+ })
+ ], BluetoothSerial, "readUntil", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android', 'iOS', 'Windows Phone'],
+ observable: true,
+ clearFunction: 'unsubscribe'
+ })
+ ], BluetoothSerial, "subscribe", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android', 'iOS', 'Windows Phone'],
+ observable: true,
+ clearFunction: 'unsubscribeRawData'
+ })
+ ], BluetoothSerial, "subscribeRawData", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android', 'iOS', 'Windows Phone']
+ })
+ ], BluetoothSerial, "clear", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android', 'iOS', 'Windows Phone']
+ })
+ ], BluetoothSerial, "list", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android', 'iOS', 'Windows Phone']
+ })
+ ], BluetoothSerial, "isEnabled", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android', 'iOS', 'Windows Phone']
+ })
+ ], BluetoothSerial, "isConnected", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android', 'iOS', 'Windows Phone']
+ })
+ ], BluetoothSerial, "readRSSI", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android', 'iOS', 'Windows Phone']
+ })
+ ], BluetoothSerial, "showBluetoothSettings", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android', 'iOS', 'Windows Phone']
+ })
+ ], BluetoothSerial, "enable", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android', 'iOS', 'Windows Phone']
+ })
+ ], BluetoothSerial, "discoverUnpaired", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android', 'iOS', 'Windows Phone'],
+ observable: true,
+ clearFunction: 'clearDeviceDiscoveredListener'
+ })
+ ], BluetoothSerial, "setDeviceDiscoveredListener", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android'],
+ sync: true
+ })
+ ], BluetoothSerial, "setName", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['Android'],
+ sync: true
+ })
+ ], BluetoothSerial, "setDiscoverable", null);
+ BluetoothSerial = __decorate([
+ plugin_1.Plugin({
+ repo: 'https://github.com/don/BluetoothSerial',
+ plugin: 'cordova-plugin-bluetooth-serial',
+ pluginRef: 'bluetoothSerial',
+ platforms: ['Android', 'iOS', 'Windows Phone', 'Browser']
+ })
+ ], BluetoothSerial);
+ return BluetoothSerial;
+}());
+exports.BluetoothSerial = BluetoothSerial;
+
+},{"./plugin":48}],16:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Calendar
+ * @description
+ * This plugin allows you to add events to the Calendar of the mobile device.
+ *
+ * Requires Cordova plugin: `cordova-plugin-calendar`. For more info, please see the [Calendar plugin docs](https://github.com/EddyVerbruggen/Calendar-PhoneGap-Plugin).
+ *
+ * @usage
+ *
+ */
+var Calendar = (function () {
+ function Calendar() {
+ }
+ /**
+ * This function checks if we have permission to read/write from/to the calendar.
+ * The promise will resolve with `true` when:
+ * - You're running on iOS, or
+ * - You're targetting API level lower than 23, or
+ * - You're using Android < 6, or
+ * - You've already granted permission
+ *
+ * If this returns false, you should call `requestReadWritePermissions` function
+ */
+ Calendar.hasReadWritePermissions = function () { return; };
+ /**
+ * Requests read/write permissions
+ */
+ Calendar.requestReadWritePermissions = function () { };
+ /**
+ * Create a calendar. (iOS only)
+ *
+ * @usage
+ * ```
+ * import {Calendar} from 'ionic-native';
+ *
+ *
+ *
+ * Calendar.createCalendar('MyCalendar').then(
+ * (msg) => { console.log(msg); },
+ * (err) => { console.log(err); }
+ * );
+ * ```
+ *
+ * @param {string | Object} nameOrOptions either a string name or a options object.
+ * options:
+ * calendarName: string the name of the calendar
+ * calendarColor: string the hex color of the calendar
+ * @return Returns a Promise
+ */
+ Calendar.createCalendar = function (nameOrOptions) { return; };
+ /**
+ * Delete a calendar. (iOS only)
+ *
+ * @usage
+ * ```
+ * Calendar.deleteCalendar('MyCalendar').then(
+ * (msg) => { console.log(msg); },
+ * (err) => { console.log(err); }
+ * );
+ * ```
+ *
+ * @param {string} name Name of the calendar to delete.
+ * @return Returns a Promise
+ */
+ Calendar.deleteCalendar = function (name) { return; };
+ /**
+ * Returns the default calendar options.
+ *
+ * @return Returns an object with the default calendar options:
+ * firstReminderMinutes: 60,
+ * secondReminderMinutes: null,
+ * recurrence: null, // options are: 'daily', 'weekly', 'monthly', 'yearly'
+ * recurrenceInterval: 1, // only used when recurrence is set
+ * recurrenceEndDate: null,
+ * calendarName: null,
+ * calendarId: null,
+ * url: null
+ */
+ Calendar.getCalendarOptions = function () {
+ return {
+ firstReminderMinutes: 60,
+ secondReminderMinutes: null,
+ recurrence: null,
+ recurrenceInterval: 1,
+ recurrenceEndDate: null,
+ calendarName: null,
+ calendarId: null,
+ url: null
+ };
+ };
+ /**
+ * Silently create an event.
+ *
+ * @param {string} [title] The event title
+ * @param {string} [location] The event location
+ * @param {string} [notes] The event notes
+ * @param {Date} [startDate] The event start date
+ * @param {Date} [endDate] The event end date
+ * @return Returns a Promise
+ */
+ Calendar.createEvent = function (title, location, notes, startDate, endDate) { return; };
+ /**
+ * Silently create an event with additional options.
+ *
+ * @param {string} [title] The event title
+ * @param {string} [location] The event location
+ * @param {string} [notes] The event notes
+ * @param {Date} [startDate] The event start date
+ * @param {Date} [endDate] The event end date
+ * @param {CalendarOptions} [options] Additional options, see `getCalendarOptions`
+ * @return Returns a Promise
+ */
+ Calendar.createEventWithOptions = function (title, location, notes, startDate, endDate, options) { return; };
+ /**
+ * Interactively create an event.
+ *
+ * @param {string} [title] The event title
+ * @param {string} [location] The event location
+ * @param {string} [notes] The event notes
+ * @param {Date} [startDate] The event start date
+ * @param {Date} [endDate] The event end date
+ * @return Returns a Promise
+ */
+ Calendar.createEventInteractively = function (title, location, notes, startDate, endDate) { return; };
+ /**
+ * Interactively create an event with additional options.
+ *
+ * @param {string} [title] The event title
+ * @param {string} [location] The event location
+ * @param {string} [notes] The event notes
+ * @param {Date} [startDate] The event start date
+ * @param {Date} [endDate] The event end date
+ * @param {CalendarOptions} [options] Additional options, see `getCalendarOptions`
+ * @return Returns a Promise
+ */
+ Calendar.createEventInteractivelyWithOptions = function (title, location, notes, startDate, endDate, options) { return; };
+ // deprecated
+ // @Cordova()
+ // static createEventInNamedCalendar(
+ // title?: string,
+ // location?: string,
+ // notes?: string,
+ // startDate?: Date,
+ // endDate?: Date,
+ // calendarName?: string
+ // ) {}
+ /**
+ * Find an event.
+ *
+ * @param {string} [title] The event title
+ * @param {string} [location] The event location
+ * @param {string} [notes] The event notes
+ * @param {Date} [startDate] The event start date
+ * @param {Date} [endDate] The event end date
+ * @return Returns a Promise
+ */
+ Calendar.findEvent = function (title, location, notes, startDate, endDate) { return; };
+ /**
+ * Find an event with additional options.
+ *
+ * @param {string} [title] The event title
+ * @param {string} [location] The event location
+ * @param {string} [notes] The event notes
+ * @param {Date} [startDate] The event start date
+ * @param {Date} [endDate] The event end date
+ * @param {CalendarOptions} [options] Additional options, see `getCalendarOptions`
+ * @return Returns a Promise that resolves with the event, or rejects with an error.
+ */
+ Calendar.findEventWithOptions = function (title, location, notes, startDate, endDate, options) { return; };
+ /**
+ * Find a list of events within the specified date range. (Android only)
+ *
+ * @param {Date} [startDate] The start date
+ * @param {Date} [endDate] The end date
+ * @return Returns a Promise that resolves with the list of events, or rejects with an error.
+ */
+ Calendar.listEventsInRange = function (startDate, endDate) { return; };
+ /**
+ * Get a list of all calendars.
+ * @return A Promise that resolves with the list of calendars, or rejects with an error.
+ */
+ Calendar.listCalendars = function () { return; };
+ /**
+ * Get a list of all future events in the specified calendar. (iOS only)
+ * @return Returns a Promise that resolves with the list of events, or rejects with an error.
+ */
+ Calendar.findAllEventsInNamedCalendar = function (calendarName) { return; };
+ /**
+ * Modify an event. (iOS only)
+ *
+ * @param {string} [title] The event title
+ * @param {string} [location] The event location
+ * @param {string} [notes] The event notes
+ * @param {Date} [startDate] The event start date
+ * @param {Date} [endDate] The event end date
+ * @param {string} [newTitle] The new event title
+ * @param {string} [newLocation] The new event location
+ * @param {string} [newNotes] The new event notes
+ * @param {Date} [newStartDate] The new event start date
+ * @param {Date} [newEndDate] The new event end date
+ * @return Returns a Promise
+ */
+ Calendar.modifyEvent = function (title, location, notes, startDate, endDate, newTitle, newLocation, newNotes, newStartDate, newEndDate) { return; };
+ /**
+ * Modify an event with additional options. (iOS only)
+ *
+ * @param {string} [title] The event title
+ * @param {string} [location] The event location
+ * @param {string} [notes] The event notes
+ * @param {Date} [startDate] The event start date
+ * @param {Date} [endDate] The event end date
+ * @param {string} [newTitle] The new event title
+ * @param {string} [newLocation] The new event location
+ * @param {string} [newNotes] The new event notes
+ * @param {Date} [newStartDate] The new event start date
+ * @param {Date} [newEndDate] The new event end date
+ * @param {CalendarOptions} [options] Additional options, see `getCalendarOptions`
+ * @return Returns a Promise
+ */
+ Calendar.modifyEventWithOptions = function (title, location, notes, startDate, endDate, newTitle, newLocation, newNotes, newStartDate, newEndDate, options) { return; };
+ /**
+ * Delete an event.
+ *
+ * @param {string} [title] The event title
+ * @param {string} [location] The event location
+ * @param {string} [notes] The event notes
+ * @param {Date} [startDate] The event start date
+ * @param {Date} [endDate] The event end date
+ * @return Returns a Promise
+ */
+ Calendar.deleteEvent = function (title, location, notes, startDate, endDate) { return; };
+ /**
+ * Delete an event from the specified Calendar. (iOS only)
+ *
+ * @param {string} [title] The event title
+ * @param {string} [location] The event location
+ * @param {string} [notes] The event notes
+ * @param {Date} [startDate] The event start date
+ * @param {Date} [endDate] The event end date
+ * @param {string} calendarName
+ * @return Returns a Promise
+ */
+ Calendar.deleteEventFromNamedCalendar = function (title, location, notes, startDate, endDate, calendarName) { return; };
+ /**
+ * Open the calendar at the specified date.
+ * @return {Date} date
+ */
+ Calendar.openCalendar = function (date) { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], Calendar, "hasReadWritePermissions", null);
+ __decorate([
+ plugin_1.Cordova({ sync: true })
+ ], Calendar, "requestReadWritePermissions", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Calendar, "createCalendar", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Calendar, "deleteCalendar", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], Calendar, "getCalendarOptions", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Calendar, "createEvent", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Calendar, "createEventWithOptions", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Calendar, "createEventInteractively", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Calendar, "createEventInteractivelyWithOptions", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Calendar, "findEvent", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Calendar, "findEventWithOptions", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Calendar, "listEventsInRange", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Calendar, "listCalendars", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Calendar, "findAllEventsInNamedCalendar", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Calendar, "modifyEvent", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Calendar, "modifyEventWithOptions", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Calendar, "deleteEvent", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Calendar, "deleteEventFromNamedCalendar", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Calendar, "openCalendar", null);
+ Calendar = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-calendar',
+ pluginRef: 'plugins.calendar',
+ repo: 'https://github.com/EddyVerbruggen/Calendar-PhoneGap-Plugin',
+ platforms: ['Android', 'iOS']
+ })
+ ], Calendar);
+ return Calendar;
+}());
+exports.Calendar = Calendar;
+
+},{"./plugin":48}],17:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Camera
+ * @description
+ * Take a photo or capture video.
+ *
+ * Requires {@link module:driftyco/ionic-native} and the Cordova plugin: `cordova-plugin-camera`. For more info, please see the [Cordova Camera Plugin Docs](https://github.com/apache/cordova-plugin-camera).
+ *
+ * @usage
+ * ```js
+ * import {Camera} from 'ionic-native';
+ *
+ * Camera.getPicture(options).then((imageData) => {
+ * // imageData is either a base64 encoded string or a file URI
+ * // If it's base64:
+ * let base64Image = "data:image/jpeg;base64," + imageData;
+ * }, (err) => {
+ * });
+ * ```
+ */
+var Camera = (function () {
+ function Camera() {
+ }
+ /**
+ * Take a picture or video, or load one from the library.
+ * @param {CameraOptions} options
+ * @return Returns a Promise that resolves with Base64 encoding of the image data, or the image file URI, depending on cameraOptions, otherwise rejects with an error.
+ */
+ Camera.getPicture = function (options) { return; };
+ /**
+ * Remove intermediate image files that are kept in temporary storage after calling camera.getPicture.
+ * Applies only when the value of Camera.sourceType equals Camera.PictureSourceType.CAMERA and the Camera.destinationType equals Camera.DestinationType.FILE_URI.
+ * @return Returns a Promise
+ */
+ Camera.cleanup = function () { };
+ ;
+ /**
+ * @enum {number}
+ */
+ Camera.DestinationType = {
+ /** Return base64 encoded string. DATA_URL can be very memory intensive and cause app crashes or out of memory errors. Use FILE_URI or NATIVE_URI if possible */
+ DATA_URL: 0,
+ /** Return file uri (content://media/external/images/media/2 for Android) */
+ FILE_URI: 1,
+ /** Return native uri (eg. asset-library://... for iOS) */
+ NATIVE_URI: 2
+ };
+ /**
+ * @enum {number}
+ */
+ Camera.EncodingType = {
+ /** Return JPEG encoded image */
+ JPEG: 0,
+ /** Return PNG encoded image */
+ PNG: 1
+ };
+ /**
+ * @enum {number}
+ */
+ Camera.MediaType = {
+ /** Allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType */
+ PICTURE: 0,
+ /** Allow selection of video only, ONLY RETURNS URL */
+ VIDEO: 1,
+ /** Allow selection from all media types */
+ ALLMEDIA: 2
+ };
+ /**
+ * @enum {number}
+ */
+ Camera.PictureSourceType = {
+ /** Choose image from picture library (same as SAVEDPHOTOALBUM for Android) */
+ PHOTOLIBRARY: 0,
+ /** Take picture from camera */
+ CAMERA: 1,
+ /** Choose image from picture library (same as PHOTOLIBRARY for Android) */
+ SAVEDPHOTOALBUM: 2
+ };
+ /**
+ * Matches iOS UIPopoverArrowDirection constants to specify arrow location on popover.
+ * @enum {number}
+ */
+ Camera.PopoverArrowDirection = {
+ ARROW_UP: 1,
+ ARROW_DOWN: 2,
+ ARROW_LEFT: 4,
+ ARROW_RIGHT: 8,
+ ARROW_ANY: 15
+ };
+ /**
+ * @enum {number}
+ */
+ Camera.Direction = {
+ /** Use the back-facing camera */
+ BACK: 0,
+ /** Use the front-facing camera */
+ FRONT: 1
+ };
+ __decorate([
+ plugin_1.Cordova({
+ callbackOrder: 'reverse'
+ })
+ ], Camera, "getPicture", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['iOS']
+ })
+ ], Camera, "cleanup", null);
+ Camera = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-camera',
+ pluginRef: 'navigator.camera',
+ repo: 'https://github.com/apache/cordova-plugin-camera',
+ platforms: ['Android', 'BlackBerry', 'Browser', 'Firefox', 'FireOS', 'iOS', 'Windows', 'Windows Phone 8', 'Ubuntu']
+ })
+ ], Camera);
+ return Camera;
+}());
+exports.Camera = Camera;
+
+},{"./plugin":48}],18:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name CardIO
+ * @description
+ * @usage
+ * ```
+ * import {CardIO} from 'ionic-native';
+ *
+ * ...
+ *
+ * CardIO.canScan()
+ * .then(
+ * (res: boolean) => {
+ * if(res){
+ * let options = {
+ * requireExpiry: true,
+ * requireCCV: false,
+ * requirePostalCode: false
+ * };
+ * CardIO.scan(options);
+ * }
+ * }
+ * );
+ * ```
+ */
+var CardIO = (function () {
+ function CardIO() {
+ }
+ /**
+ * Check whether card scanning is currently available. (May vary by
+ * device, OS version, network connectivity, etc.)
+ *
+ */
+ CardIO.canScan = function () { return; };
+ /**
+ * Scan a credit card with card.io.
+ * @param options
+ */
+ CardIO.scan = function (options) { return; };
+ /**
+ * Retrieve the version of the card.io library. Useful when contacting support.
+ */
+ CardIO.version = function () { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], CardIO, "canScan", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], CardIO, "scan", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], CardIO, "version", null);
+ CardIO = __decorate([
+ plugin_1.Plugin({
+ plugin: 'https://github.com/card-io/card.io-Cordova-Plugin',
+ pluginRef: 'CardIO',
+ repo: 'https://github.com/card-io/card.io-Cordova-Plugin',
+ platforms: ['iOS', 'Android']
+ })
+ ], CardIO);
+ return CardIO;
+}());
+exports.CardIO = CardIO;
+
+},{"./plugin":48}],19:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Clipboard
+ * @description
+ * Clipboard management plugin for Cordova that supports iOS, Android, and Windows Phone 8.
+ *
+ * Requires Cordova plugin: https://github.com/VersoSolutions/CordovaClipboard
+ * For more info, please see the [Clipboard plugin docs](https://github.com/VersoSolutions/CordovaClipboard.git).
+ *
+ * @usage
+ * ```js
+ * import {Clipboard} from 'ionic-native';
+ *
+ *
+ *
+ * Clipboard.copy("Hello world");
+ *
+ * Clipboard.paste().then(
+ * (resolve : string) => {
+ * alert(resolve);
+* },
+ * (reject : string) => {
+ * alert("Error: " + reject);
+ * }
+* );
+ * );
+ * ```
+ */
+var Clipboard = (function () {
+ function Clipboard() {
+ }
+ /**
+ * Copies the given text
+ * @param text
+ * @returns {Promise}
+ */
+ Clipboard.copy = function (text) { return; };
+ /**
+ * Pastes the text stored in clipboard
+ * @returns {Promise}
+ */
+ Clipboard.paste = function () { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], Clipboard, "copy", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Clipboard, "paste", null);
+ Clipboard = __decorate([
+ plugin_1.Plugin({
+ plugin: 'https://github.com/VersoSolutions/CordovaClipboard.git',
+ pluginRef: 'cordova.plugins.clipboard',
+ repo: 'https://github.com/VersoSolutions/CordovaClipboard',
+ platforms: ['Amazon Fire OS', 'iOS', 'Android', 'BlackBerry 10', 'Windows Phone 7', 'Windows Phone 8', 'Windows', 'Firefox OS', 'Browser']
+ })
+ ], Clipboard);
+ return Clipboard;
+}());
+exports.Clipboard = Clipboard;
+
+},{"./plugin":48}],20:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Contacts
+ * @description
+ * Access and manage Contacts on the device.
+ *
+ * Requires plugin: `cordova-plugin-contacts`
+ * For full info, please see the [Cordova Contacts plugin docs](https://github.com/apache/cordova-plugin-contacts)
+ *
+ * @usage
+ *
+ * ```js
+ * import {Contacts} from 'ionic-native';
+ *
+ *
+ *
+ * Contacts.create({
+ * displayName: "Mr. Ionitron"
+ * }).then((contact) => {}, (err) => {})
+ * ```
+ *
+ *
+ */
+var Contacts = (function () {
+ function Contacts() {
+ }
+ /**
+ * Create a new Contact object.
+ *
+ * @param options {Object} Object whose properties the created Contact should have.
+ * @return {Contact} Returns the created contact
+ */
+ Contacts.create = function (options) {
+ return new Contact();
+ };
+ ;
+ /**
+ * Search for contacts in the Contacts list.
+ *
+ * Example: Contacts.find(['*'], { filter: 'Max' }) // will search for a displayName of 'Max'
+ *
+ * @param fields {string[]} Contact fields to be used as a search qualifier.
+ * A zero-length contactFields parameter is invalid and results in ContactError.INVALID_ARGUMENT_ERROR.
+ * A contactFields value of "*" searches all contact fields.
+ *
+ * @param options {Object} the options to query with:
+ * filter: The search string used to find navigator.contacts. (string) (Default: "")
+ * multiple: Determines if the find operation returns multiple navigator.contacts. (Boolean) (Default: false)
+ * desiredFields: Contact fields to be returned back. If specified, the resulting Contact object only features values for these fields. (DOMString[]) [Optional]
+ * hasPhoneNumber(Android only): Filters the search to only return contacts with a phone number informed. (Boolean) (Default: false)
+ *
+ * @return Returns a Promise that resolves with the search results (an array of Contact objects)
+ */
+ Contacts.find = function (fields, options) { return; };
+ /**
+ * Select a single Contact.
+ * @return Returns a Promise that resolves with the selected Contact
+ */
+ Contacts.pickContact = function () { return; };
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], Contacts, "create", null);
+ __decorate([
+ plugin_1.Cordova({
+ successIndex: 1,
+ errorIndex: 2
+ })
+ ], Contacts, "find", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Contacts, "pickContact", null);
+ Contacts = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-contacts',
+ pluginRef: 'navigator.contacts',
+ repo: 'https://github.com/apache/cordova-plugin-contacts'
+ })
+ ], Contacts);
+ return Contacts;
+}());
+exports.Contacts = Contacts;
+
+},{"./plugin":48}],21:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Date Picker
+ * @description
+ * The DatePicker plugin allows the user to fetch date or time using native dialogs.
+ *
+ * Platforms supported: iOS, Android, Windows
+ *
+ * Requires Cordova plugin: `cordova-plugin-datepicker`. For more info, please see the [DatePicker plugin docs](https://github.com/VitaliiBlagodir/cordova-plugin-datepicker).
+ *
+ * @usage
+ * ```js
+ * import {DatePicker} from 'ionic-native';
+ *
+ *
+ *
+ * DatePicker.show({
+ * date: new Date(),
+ * mode: 'date'
+ * }).then(
+ * date => console.log("Got date: ", date),
+ * err => console.log("Error occurred while getting date:", err)
+ * );
+ * ```
+ *
+ */
+var DatePicker = (function () {
+ function DatePicker() {
+ }
+ /**
+ * Shows the date and/or time picker dialog(s)
+ * @param options
+ * @returns {Promise} Returns a promise that resolves with the picked date and/or time, or rejects with an error.
+ */
+ DatePicker.show = function (options) { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], DatePicker, "show", null);
+ DatePicker = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-datepicker',
+ pluginRef: 'datePicker',
+ repo: 'https://github.com/VitaliiBlagodir/cordova-plugin-datepicker'
+ })
+ ], DatePicker);
+ return DatePicker;
+}());
+exports.DatePicker = DatePicker;
+
+},{"./plugin":48}],22:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name DB Meter
+ * @description This plugin defines a global DBMeter object, which permits to get the decibel values from the microphone.
+ * @usage
+ * ```ts
+ * import {DBMeter} from 'ionic-native';
+ *
+ *
+ *
+ * // Start listening
+ * let subscription = DBMeter.start().subscribe(
+ * data => console.log(data)
+ * );
+ *
+ * // Check if we are listening
+ * DBMeter.isListening().then(
+ * (isListening : boolean) => console.log(isListening)
+ * );
+ *
+ * // Stop listening
+ * subscription.unsubscribe();
+ *
+ * // Delete DBMeter instance from memory
+ * DBMeter.delete().then(
+ * () => console.log("Deleted DB Meter instance"),
+ * error => console.log("Error occurred while deleting DB Meter instance")
+ * );
+ * ```
+ */
+var DBMeter = (function () {
+ function DBMeter() {
+ }
+ /**
+ * Starts listening
+ * @return {Observable} Returns an observable. Subscribe to start listening. Unsubscribe to stop listening.
+ */
+ DBMeter.start = function () { return; };
+ /**
+ * Stops listening
+ * @private
+ */
+ DBMeter.stop = function () { return; };
+ /**
+ * Check if the DB Meter is listening
+ * @return {Promise} Returns a promise that resolves with a boolean that tells us whether the DB meter is listening
+ */
+ DBMeter.isListening = function () { return; };
+ /**
+ * Delete the DB Meter instance
+ * @return {Promise} Returns a promise that will resolve if the instance has been deleted, and rejects if errors occur.
+ */
+ DBMeter.delete = function () { return; };
+ __decorate([
+ plugin_1.Cordova({
+ observable: true,
+ clearFunction: 'stop'
+ })
+ ], DBMeter, "start", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], DBMeter, "stop", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], DBMeter, "isListening", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], DBMeter, "delete", null);
+ DBMeter = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-dbmeter',
+ pluginRef: 'DBMeter',
+ repo: 'https://github.com/akofman/cordova-plugin-dbmeter',
+ platforms: ['iOS', 'Android']
+ })
+ ], DBMeter);
+ return DBMeter;
+}());
+exports.DBMeter = DBMeter;
+
+},{"./plugin":48}],23:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Device
+ * @description
+ * Access information about the underlying device and platform.
+ *
+ * @usage
+ * ```js
+ * import {Device} from 'ionic-native';
+ *
+ *
+ *
+ * console.log('Device UUID is: ' + Device.device.uuid);
+ * ```
+ */
+var Device = (function () {
+ function Device() {
+ }
+ Object.defineProperty(Device, "device", {
+ /**
+ * Returns the whole device object.
+ *
+ * @returns {Object} The device object.
+ */
+ get: function () { return window.device; },
+ enumerable: true,
+ configurable: true
+ });
+ __decorate([
+ plugin_1.CordovaProperty
+ ], Device, "device", null);
+ Device = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-device',
+ pluginRef: 'device',
+ repo: 'https://github.com/apache/cordova-plugin-device'
+ })
+ ], Device);
+ return Device;
+}());
+exports.Device = Device;
+
+},{"./plugin":48}],24:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+var DeviceAccounts = (function () {
+ function DeviceAccounts() {
+ }
+ /**
+ * Gets all accounts registered on the Android Device
+ */
+ DeviceAccounts.get = function () { return; };
+ /**
+ * Get all accounts registered on Android device for requested type
+ */
+ DeviceAccounts.getByType = function (type) { return; };
+ /**
+ * Get all emails registered on Android device (accounts with 'com.google' type)
+ */
+ DeviceAccounts.getEmails = function () { return; };
+ /**
+ * Get the first email registered on Android device
+ */
+ DeviceAccounts.getEmail = function () { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], DeviceAccounts, "get", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], DeviceAccounts, "getByType", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], DeviceAccounts, "getEmails", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], DeviceAccounts, "getEmail", null);
+ DeviceAccounts = __decorate([
+ plugin_1.Plugin({
+ plugin: 'https://github.com/loicknuchel/cordova-device-accounts.git',
+ pluginRef: 'plugins.DeviceAccounts',
+ repo: 'https://github.com/loicknuchel/cordova-device-accounts',
+ platforms: ['Android']
+ })
+ ], DeviceAccounts);
+ return DeviceAccounts;
+}());
+exports.DeviceAccounts = DeviceAccounts;
+
+},{"./plugin":48}],25:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Device Motion
+ * @description
+ * Requires Cordova plugin: `cordova-plugin-device-motion`. For more info, please see the [Device Motion docs](https://github.com/apache/cordova-plugin-device-motion).
+ *
+ * @usage
+ * ```ts
+ * import {DeviceMotion} from 'ionic-native';
+ *
+ *
+ *
+ * // Get the device current acceleration
+ * DeviceMotion.getCurrentAcceleration().then(
+ * acceleration => console.log(acceleration),
+ * error => console.log(error)
+ * );
+ *
+ * // Watch device acceleration
+ * var subscription = DeviceMotion.watchAcceleration().subscribe(acceleration => {
+ * console.log(acceleration);
+ * });
+ *
+ * // Stop watch
+ * subscription.unsubscribe();
+ *
+ * ```
+ */
+var DeviceMotion = (function () {
+ function DeviceMotion() {
+ }
+ /**
+ * Get the current acceleration along the x, y, and z axes.
+ *
+ * @returns {Promise} Returns object with x, y, z, and timestamp properties
+ */
+ DeviceMotion.getCurrentAcceleration = function () {
+ return;
+ };
+ /**
+ * Watch the device acceleration. Clear the watch by unsubscribing from the observable.
+ *
+ * ```ts
+ * // Watch device acceleration
+ * var subscription = DeviceMotion.watchPosition().subscribe(acceleration => {
+ * console.log(acceleration);
+ * });
+ *
+ * // Stop watch
+ * subscription.unsubscribe();
+ * ```
+ * @param options
+ * @returns {Observable}
+ */
+ DeviceMotion.watchAcceleration = function (options) {
+ return;
+ };
+ __decorate([
+ plugin_1.Cordova()
+ ], DeviceMotion, "getCurrentAcceleration", null);
+ __decorate([
+ plugin_1.Cordova({
+ callbackOrder: 'reverse',
+ observable: true,
+ clearFunction: 'clearWatch'
+ })
+ ], DeviceMotion, "watchAcceleration", null);
+ DeviceMotion = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-device-motion',
+ pluginRef: 'navigator.accelerometer',
+ repo: 'https://github.com/apache/cordova-plugin-device-motion'
+ })
+ ], DeviceMotion);
+ return DeviceMotion;
+}());
+exports.DeviceMotion = DeviceMotion;
+
+},{"./plugin":48}],26:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Device Orientation
+ * @description
+ * Requires Cordova plugin: `cordova-plugin-device-orientation`. For more info, please see the [Device Orientation docs](https://github.com/apache/cordova-plugin-device-orientation).
+ *
+ * @usage
+ * ```ts
+ * import {DeviceOrientation} from 'ionic-native';
+ *
+ *
+ *
+ * // Get the device current compass heading
+ * DeviceOrientation.getCurrentHeading().then(
+ * data => console.log(data),
+ * error => console.log(error)
+ * );
+ *
+ * // Watch the device compass heading change
+ * var subscription = DeviceOrientation.watchHeading().subscribe(
+ * data => console.log(data)
+ * );
+ *
+ * // Stop watching heading change
+ * subscription.unsubscribe();
+ * ```
+ */
+var DeviceOrientation = (function () {
+ function DeviceOrientation() {
+ }
+ /**
+ * Get the current compass heading.
+ * @returns {Promise}
+ */
+ DeviceOrientation.getCurrentHeading = function () { return; };
+ /**
+ * Get the device current heading at a regular interval
+ *
+ * Stop the watch by unsubscribing from the observable
+ * @param options
+ * @returns {Observable}
+ */
+ DeviceOrientation.watchHeading = function (options) { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], DeviceOrientation, "getCurrentHeading", null);
+ __decorate([
+ plugin_1.Cordova({
+ callbackOrder: 'reverse',
+ observable: true,
+ cancelFunction: 'clearWatch'
+ })
+ ], DeviceOrientation, "watchHeading", null);
+ DeviceOrientation = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-device-orientation',
+ pluginRef: 'navigator.compass',
+ repo: 'https://github.com/apache/cordova-plugin-device-orientation'
+ })
+ ], DeviceOrientation);
+ return DeviceOrientation;
+}());
+exports.DeviceOrientation = DeviceOrientation;
+
+},{"./plugin":48}],27:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+var Diagnostic = (function () {
+ function Diagnostic() {
+ }
+ /**
+ * Checks if app is able to access device location.
+ */
+ Diagnostic.isLocationEnabled = function () {
+ // This Promise is replaced by one from the @Cordova decorator that wraps
+ // the plugin's callbacks. We provide a dummy one here so TypeScript
+ // knows that the correct return type is Promise, because there's no way
+ // for it to know the return type from a decorator.
+ // See https://github.com/Microsoft/TypeScript/issues/4881
+ return new Promise(function (res, rej) { });
+ };
+ /**
+ * Checks if Wifi is connected/enabled. On iOS this returns true if the device is connected to a network by WiFi. On Android and Windows 10 Mobile this returns true if the WiFi setting is set to enabled.
+ * On Android this requires permission. ``
+ */
+ Diagnostic.isWifiEnabled = function () {
+ // This Promise is replaced by one from the @Cordova decorator that wraps
+ // the plugin's callbacks. We provide a dummy one here so TypeScript
+ // knows that the correct return type is Promise, because there's no way
+ // for it to know the return type from a decorator.
+ // See https://github.com/Microsoft/TypeScript/issues/4881
+ return new Promise(function (res, rej) { });
+ };
+ /*
+ * Checks if the device has a camera. On Android this returns true if the device has a camera. On iOS this returns true if both the device has a camera AND the application is authorized to use it. On Windows 10 Mobile this returns true if both the device has a rear-facing camera AND the
+ * application is authorized to use it.
+ */
+ Diagnostic.isCameraEnabled = function () {
+ // This Promise is replaced by one from the @Cordova decorator that wraps
+ // the plugin's callbacks. We provide a dummy one here so TypeScript
+ // knows that the correct return type is Promise, because there's no way
+ // for it to know the return type from a decorator.
+ // See https://github.com/Microsoft/TypeScript/issues/4881
+ return new Promise(function (res, rej) { });
+ };
+ /*
+ * Checks if the device has Bluetooth capabilities and if so that Bluetooth is switched on (same on Android, iOS and Windows 10 Mobile)
+ * On Android this requires permission
+ */
+ Diagnostic.isBluetoothEnabled = function () {
+ // This Promise is replaced by one from the @Cordova decorator that wraps
+ // the plugin's callbacks. We provide a dummy one here so TypeScript
+ // knows that the correct return type is Promise, because there's no way
+ // for it to know the return type from a decorator.
+ // See https://github.com/Microsoft/TypeScript/issues/4881
+ return new Promise(function (res, rej) { });
+ };
+ /*
+ * Returns the location authorization status for the application.
+ * Note for Android: this is intended for Android 6 / API 23 and above. Calling on Android 5 / API 22 and below will always return GRANTED status as permissions are already granted at installation time.
+ *
+ * mode - (iOS-only / optional) location authorization mode: "always" or "when_in_use". If not specified, defaults to "when_in_use".
+ */
+ Diagnostic.requestLocationAuthorization = function (mode) {
+ // This Promise is replaced by one from the @Cordova decorator that wraps
+ // the plugin's callbacks. We provide a dummy one here so TypeScript
+ // knows that the correct return type is Promise, because there's no way
+ // for it to know the return type from a decorator.
+ // See https://github.com/Microsoft/TypeScript/issues/4881
+ return new Promise(function (res, rej) { });
+ };
+ /*
+ * Checks if the application is authorized to use location.
+ * Note for Android: this is intended for Android 6 / API 23 and above. Calling on Android 5 / API 22 and below will always return GRANTED status as permissions are already granted at installation time.
+ */
+ Diagnostic.isLocationAuthorized = function () {
+ // This Promise is replaced by one from the @Cordova decorator that wraps
+ // the plugin's callbacks. We provide a dummy one here so TypeScript
+ // knows that the correct return type is Promise, because there's no way
+ // for it to know the return type from a decorator.
+ // See https://github.com/Microsoft/TypeScript/issues/4881
+ return new Promise(function (res, rej) { });
+ };
+ /*
+ * Checks if camera hardware is present on device.
+ */
+ Diagnostic.isCameraPresent = function () {
+ // This Promise is replaced by one from the @Cordova decorator that wraps
+ // the plugin's callbacks. We provide a dummy one here so TypeScript
+ // knows that the correct return type is Promise, because there's no way
+ // for it to know the return type from a decorator.
+ // See https://github.com/Microsoft/TypeScript/issues/4881
+ return new Promise(function (res, rej) { });
+ };
+ /*
+ * Checks if the application is authorized to use the camera.
+ * Note for Android: this is intended for Android 6 / API 23 and above. Calling on Android 5 / API 22 and below will always return TRUE as permissions are already granted at installation time.
+ */
+ Diagnostic.isCameraAuthorized = function () {
+ // This Promise is replaced by one from the @Cordova decorator that wraps
+ // the plugin's callbacks. We provide a dummy one here so TypeScript
+ // knows that the correct return type is Promise, because there's no way
+ // for it to know the return type from a decorator.
+ // See https://github.com/Microsoft/TypeScript/issues/4881
+ return new Promise(function (res, rej) { });
+ };
+ /*
+ * Checks if location mode is set to return high-accuracy locations from GPS hardware.
+ * Returns true if Location mode is enabled and is set to either:
+ * - Device only = GPS hardware only (high accuracy)
+ * - High accuracy = GPS hardware, network triangulation and Wifi network IDs (high and low accuracy)
+ */
+ Diagnostic.isGpsLocationEnabled = function () {
+ // This Promise is replaced by one from the @Cordova decorator that wraps
+ // the plugin's callbacks. We provide a dummy one here so TypeScript
+ // knows that the correct return type is Promise, because there's no way
+ // for it to know the return type from a decorator.
+ // See https://github.com/Microsoft/TypeScript/issues/4881
+ return new Promise(function (res, rej) { });
+ };
+ /*
+ * Checks if location mode is set to return low-accuracy locations from network triangulation/WiFi access points.
+ * Returns true if Location mode is enabled and is set to either:
+ * - Battery saving = network triangulation and Wifi network IDs (low accuracy)
+ * - High accuracy = GPS hardware, network triangulation and Wifi network IDs (high and low accuracy)
+ */
+ Diagnostic.isNetworkLocationEnabled = function () {
+ // This Promise is replaced by one from the @Cordova decorator that wraps
+ // the plugin's callbacks. We provide a dummy one here so TypeScript
+ // knows that the correct return type is Promise, because there's no way
+ // for it to know the return type from a decorator.
+ // See https://github.com/Microsoft/TypeScript/issues/4881
+ return new Promise(function (res, rej) { });
+ };
+ /**
+ *
+ * Checks if remote (push) notifications are enabled.
+ * On iOS 8+, returns true if app is registered for remote notifications AND "Allow Notifications" switch is ON AND alert style is not set to "None" (i.e. "Banners" or "Alerts").
+ * On iOS <=7, returns true if app is registered for remote notifications AND alert style is not set to "None" (i.e. "Banners" or "Alerts") - same as isRegisteredForRemoteNotifications().
+ */
+ Diagnostic.isRemoteNotificationsEnabled = function () {
+ // This Promise is replaced by one from the @Cordova decorator that wraps
+ // the plugin's callbacks. We provide a dummy one here so TypeScript
+ // knows that the correct return type is Promise, because there's no way
+ // for it to know the return type from a decorator.
+ // See https://github.com/Microsoft/TypeScript/issues/4881
+ return new Promise(function (res, rej) { });
+ };
+ /**
+ *
+ * Indicates if the app is registered for remote (push) notifications on the device.
+ * On iOS 8+, returns true if the app is registered for remote notifications and received its device token, or false if registration has not occurred, has failed, or has been denied by the user. Note that user preferences for notifications in the Settings app will not affect this.
+ * On iOS <=7, returns true if app is registered for remote notifications AND alert style is not set to "None" (i.e. "Banners" or "Alerts") - same as isRemoteNotificationsEnabled().
+ */
+ Diagnostic.isRegisteredForRemoteNotifications = function () {
+ // This Promise is replaced by one from the @Cordova decorator that wraps
+ // the plugin's callbacks. We provide a dummy one here so TypeScript
+ // knows that the correct return type is Promise, because there's no way
+ // for it to know the return type from a decorator.
+ // See https://github.com/Microsoft/TypeScript/issues/4881
+ return new Promise(function (res, rej) { });
+ };
+ __decorate([
+ plugin_1.Cordova()
+ ], Diagnostic, "isLocationEnabled", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Diagnostic, "isWifiEnabled", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Diagnostic, "isCameraEnabled", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Diagnostic, "isBluetoothEnabled", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Diagnostic, "requestLocationAuthorization", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Diagnostic, "isLocationAuthorized", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Diagnostic, "isCameraPresent", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Diagnostic, "isCameraAuthorized", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Diagnostic, "isGpsLocationEnabled", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Diagnostic, "isNetworkLocationEnabled", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Diagnostic, "isRemoteNotificationsEnabled", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Diagnostic, "isRegisteredForRemoteNotifications", null);
+ Diagnostic = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova.plugins.diagnostic',
+ pluginRef: 'cordova.plugins.diagnostic',
+ repo: 'https://github.com/floatinghotpot/cordova-plugin-admob'
+ })
+ ], Diagnostic);
+ return Diagnostic;
+}());
+exports.Diagnostic = Diagnostic;
+
+},{"./plugin":48}],28:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Dialogs
+ * @description
+ * This plugin gives you ability to access and customize the device native dialogs.
+ *
+ * Requires Cordova plugin: `cordova-plugin-dialogs`. For more info, please see the [Dialogs plugin docs](https://github.com/apache/cordova-plugin-dialogs).
+ *
+ * @usage
+ * ```js
+ * import {Dialogs} from 'ionic-native';
+ *
+ *
+ *
+ *
+ * ```
+ */
+var Dialogs = (function () {
+ function Dialogs() {
+ }
+ /**
+ * Shows a custom alert or dialog box.
+ * @param message Dialog message. (String)
+ * @param title Dialog title. (String) (Optional, defaults to Alert)
+ * @param buttonName Button name. (String) (Optional, defaults to OK)
+ * @returns {Promise} Returns a blank promise once the user has dismissed the alert.
+ */
+ Dialogs.alert = function (message, title, buttonName) {
+ if (title === void 0) { title = 'Alert'; }
+ if (buttonName === void 0) { buttonName = 'OK'; }
+ return;
+ };
+ /**
+ * Displays a customizable confirmation dialog box.
+ * @param message Dialog message. (String)
+ * @param title Dialog title. (String) (Optional, defaults to Confirm)
+ * @param buttonLabels Array of strings specifying button labels. (Array) (Optional, defaults to [OK,Cancel])
+ * @returns {Promise} Returns a promise that resolves the button index that was clicked. Note that the index use one-based indexing.
+ */
+ Dialogs.confirm = function (message, title, buttonLabels) {
+ if (title === void 0) { title = 'Confirm'; }
+ if (buttonLabels === void 0) { buttonLabels = ['OK', 'Cancel']; }
+ return;
+ };
+ /**
+ * Displays a native dialog box that is more customizable than the browser's prompt function.
+ * @param message Dialog message. (String)
+ * @param title Dialog title (String) (Optional, defaults to Prompt)
+ * @param buttonLabels Array of strings specifying button labels (Array) (Optional, defaults to ["OK","Cancel"])
+ * @param defaultText Default textbox input value (String) (Optional, Default: empty string)
+ * @returns {Promise} Returns a promise that resolves an object with the button index clicked and the text entered
+ */
+ Dialogs.prompt = function (message, title, buttonLabels, defaultText) {
+ if (title === void 0) { title = 'Prompt'; }
+ if (buttonLabels === void 0) { buttonLabels = ['OK', 'Cancel']; }
+ if (defaultText === void 0) { defaultText = ''; }
+ return;
+ };
+ /**
+ * The device plays a beep sound.
+ * @param times The number of times to repeat the beep. (Number)
+ */
+ Dialogs.beep = function (times) { };
+ __decorate([
+ plugin_1.Cordova({
+ successIndex: 1,
+ errorIndex: 4
+ })
+ ], Dialogs, "alert", null);
+ __decorate([
+ plugin_1.Cordova({
+ successIndex: 1,
+ errorIndex: 4
+ })
+ ], Dialogs, "confirm", null);
+ __decorate([
+ plugin_1.Cordova({
+ successIndex: 1,
+ errorIndex: 5
+ })
+ ], Dialogs, "prompt", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], Dialogs, "beep", null);
+ Dialogs = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-dialogs',
+ pluginRef: 'navigator.notification',
+ repo: 'https://github.com/apache/cordova-plugin-dialogs.git'
+ })
+ ], Dialogs);
+ return Dialogs;
+}());
+exports.Dialogs = Dialogs;
+
+},{"./plugin":48}],29:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Email Composer
+ * @description
+ *
+ * Requires Cordova plugin: cordova-plugin-email-composer. For more info, please see the [Email Composer plugin docs](https://github.com/katzer/cordova-plugin-email-composer).
+ *
+ * @usage
+ * ```ts
+ * import {EmailComposer} from 'ionic-native';
+ *
+ *
+ * EmailComposer.isAvailable().then((available) =>{
+ * if(available) {
+ * //Now we know we can send
+ * }
+ * });
+ *
+ * let email = {
+ * to: 'max@mustermann.de',
+ * cc: 'erika@mustermann.de',
+ * bcc: ['john@doe.com', 'jane@doe.com'],
+ * attachments: [
+ * 'file://img/logo.png',
+ * 'res://icon.png',
+ * 'base64:icon.png//iVBORw0KGgoAAAANSUhEUg...',
+ * 'file://README.pdf'
+ * ],
+ * subject: 'Cordova Icons',
+ * body: 'How are you? Nice greetings from Leipzig',
+ * isHtml: true
+ * };
+ *
+ * // Send a text message using default options
+ * EmailComposer.open(email);
+ *
+ * ```
+ */
+var EmailComposer = (function () {
+ function EmailComposer() {
+ }
+ /**
+ * Verifies if sending emails is supported on the device.
+ *
+ * @param app {string?} An optional app id or uri scheme.
+ * @returns {Promise} Resolves if available, rejects if not available
+ */
+ EmailComposer.isAvailable = function (app) {
+ return new Promise(function (resolve, reject) {
+ if (app)
+ cordova.plugins.email.isAvailable(app, function (isAvailable) { if (isAvailable)
+ resolve();
+ else
+ reject(); });
+ else
+ cordova.plugins.email.isAvailable(function (isAvailable) { if (isAvailable)
+ resolve();
+ else
+ reject(); });
+ });
+ };
+ /**
+ * Adds a new mail app alias.
+ *
+ * @param alias {string} The alias name
+ * @param packageName {string} The package name
+ */
+ EmailComposer.addAlias = function (alias, packageName) { };
+ /**
+ * Displays the email composer pre-filled with data.
+ *
+ * @param email {Email} Email
+ * @param scope {any?} An optional scope for the promise
+ * @returns {Promise} Resolves promise when the EmailComposer has been opened
+ */
+ EmailComposer.open = function (email, scope) { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], EmailComposer, "addAlias", null);
+ __decorate([
+ plugin_1.Cordova({
+ successIndex: 1,
+ errorIndex: 3
+ })
+ ], EmailComposer, "open", null);
+ EmailComposer = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-email-composer',
+ pluginRef: 'cordova.plugins.email',
+ repo: 'https://github.com/katzer/cordova-plugin-email-composer.git',
+ platforms: ['Android', 'iOS', 'Windows Phone 8']
+ })
+ ], EmailComposer);
+ return EmailComposer;
+}());
+exports.EmailComposer = EmailComposer;
+
+},{"./plugin":48}],30:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Facebook
+ * @description
+ * Use the Facebook Connect plugin to obtain access to the native FB application on iOS and Android.
+ *
+ * Requires Cordova plugin: `cordova-plugin-facebook4`. For more info, please see the [Facebook Connect](https://github.com/jeduan/cordova-plugin-facebook4).
+ *
+ * #### Installation
+ *
+ * To use the FB plugin, you first have to create a new Facebook App inside of the Facebook developer portal at [https://developers.facebook.com/apps](https://developers.facebook.com/apps).
+ *
+ * [![fb-getstarted-1](/img/docs/native/Facebook/1.png)](https://developers.facebook.com/apps/)
+ *
+ * Retrieve the `App ID` and `App Name`.
+ *
+ * [![fb-getstarted-2](/img/docs/native/Facebook/2.png)](https://developers.facebook.com/apps/)
+ *
+ * Then type in the following command in your Terminal, where APP_ID and APP_NAME are the values from the Facebook Developer portal.
+ *
+ * ```bash
+ * ionic plugin add cordova-plugin-facebook4 --save --variable APP_ID="123456789" --variable APP_NAME="myApplication"
+ * ```
+ *
+ * After, you'll need to add the native platforms you'll be using to your app in the Facebook Developer portal under your app's Settings:
+ *
+ * [![fb-getstarted-3](/img/docs/native/Facebook/3.png)](https://developers.facebook.com/apps/)
+ *
+ * Click `'Add Platform'`.
+ *
+ * [![fb-getstarted-4](/img/docs/native/Facebook/4.png)](https://developers.facebook.com/apps/)
+ *
+ * At this point you'll need to open your project's [`config.xml`](https://cordova.apache.org/docs/en/latest/config_ref/index.html) file, found in the root directory of your project.
+ *
+ * Take note of the `id` for the next step:
+ * ```
+ *
+ * ```
+ *
+ * You can also edit the `id` to whatever you'd like it to be.
+ *
+ * #### iOS Install
+ * Under 'Bundle ID', add the `id` from your `config.xml` file:
+ *
+ * [![fb-getstarted-5](/img/docs/native/Facebook/5.png)](https://developers.facebook.com/apps/)
+ *
+ *
+ * #### Android Install
+ * Under 'Google Play Package Name', add the `id` from your `config.xml` file:
+ *
+ * [![fb-getstarted-6](/img/docs/native/Facebook/6.png)](https://developers.facebook.com/apps/)
+ *
+ *
+ * And that's it! You can now make calls to Facebook using the plugin.
+ *
+ * ## Events
+ *
+ * App events allow you to understand the makeup of users engaging with your app, measure the performance of your Facebook mobile app ads, and reach specific sets of your users with Facebook mobile app ads.
+ *
+ * - [iOS] [https://developers.facebook.com/docs/ios/app-events](https://developers.facebook.com/docs/ios/app-events)
+ * - [Android] [https://developers.facebook.com/docs/android/app-events](https://developers.facebook.com/docs/android/app-events)
+ * - [JS] Does not have an Events API, so the plugin functions are empty and will return an automatic success
+ *
+ * Activation events are automatically tracked for you in the plugin.
+ *
+ * Events are listed on the [insights page](https://www.facebook.com/insights/).
+ *
+ * For tracking events, see `logEvent` and `logPurchase`.
+ *
+ * @usage
+ * ```js
+ * import {Facebook} from 'ionic-native';
+ *
+ *
+ *
+ * ```
+ *
+ */
+var Facebook = (function () {
+ function Facebook() {
+ }
+ /**
+ * Browser wrapper
+ * @param appId
+ * @param version
+ */
+ Facebook.browserInit = function (appId, version) {
+ return;
+ };
+ /**
+ * Login to Facebook to authenticate this app.
+ *
+ * ```ts
+ * {
+ * status: "connected",
+ * authResponse: {
+ * session_key: true,
+ * accessToken: "kgkh3g42kh4g23kh4g2kh34g2kg4k2h4gkh3g4k2h4gk23h4gk2h34gk234gk2h34AndSoOn",
+ * expiresIn: 5183979,
+ * sig: "...",
+ * secret: "...",
+ * userID: "634565435"
+ * }
+ * }
+ * ```
+ *
+ * @param {string[]} permissions List of [permissions](https://developers.facebook.com/docs/facebook-login/permissions) this app has upon logging in.
+ * @return Returns a Promise that resolves with a status object if login succeeds, and rejects if login fails.
+ */
+ Facebook.login = function (permissions) { return; };
+ /**
+ * Logout of Facebook.
+ *
+ * For more info see the [Facebook docs](https://developers.facebook.com/docs/reference/javascript/FB.logout)
+ * @return Returns a Promise that resolves on a successful logout, and rejects if logout fails.
+ */
+ Facebook.logout = function () { return; };
+ /**
+ * Determine if a user is logged in to Facebook and has authenticated your app. There are three possible states for a user:
+ *
+ * 1) the user is logged into Facebook and has authenticated your application (connected)
+ * 2) the user is logged into Facebook but has not authenticated your application (not_authorized)
+ * 3) the user is either not logged into Facebook or explicitly logged out of your application so it doesn't attempt to connect to Facebook and thus, we don't know if they've authenticated your application or not (unknown)
+ *
+ * Resolves with a response like:
+ *
+ * ```
+ * {
+ * authResponse: {
+ * userID: "12345678912345",
+ * accessToken: "kgkh3g42kh4g23kh4g2kh34g2kg4k2h4gkh3g4k2h4gk23h4gk2h34gk234gk2h34AndSoOn",
+ * session_Key: true,
+ * expiresIn: "5183738",
+ * sig: "..."
+ * },
+ * status: "connected"
+ * }
+ * ```
+ *
+ * For more information see the [Facebook docs](https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus)
+ *
+ * @return Returns a Promise that resolves with a status, or rejects with an error
+ */
+ Facebook.getLoginStatus = function () { return; };
+ /**
+ * Get a Facebook access token for using Facebook services.
+ *
+ * @return Returns a Promise that resolves with an access token, or rejects with an error
+ */
+ Facebook.getAccessToken = function () { return; };
+ /**
+ * Show one of various Facebook dialogs. Example of options for a Share dialog:
+ *
+ * ```
+ * {
+ * method: "share",
+ * href: "http://example.com",
+ * caption: "Such caption, very feed.",
+ * description: "Much description",
+ * picture: 'http://example.com/image.png'
+ * }
+ * ```
+ *
+ * For more options see the [Cordova plugin docs](https://github.com/jeduan/cordova-plugin-facebook4#show-a-dialog) and the [Facebook docs](https://developers.facebook.com/docs/javascript/reference/FB.ui)
+ * @options {Object} options The dialog options
+ * @return Returns a Promise that resolves with success data, or rejects with an error
+ */
+ Facebook.showDialog = function (options) { return; };
+ /**
+ * Make a call to Facebook Graph API. Can take additional permissions beyond those granted on login.
+ *
+ * For more information see:
+ *
+ * Calling the Graph API - https://developers.facebook.com/docs/javascript/reference/FB.api
+ * Graph Explorer - https://developers.facebook.com/tools/explorer
+ * Graph API - https://developers.facebook.com/docs/graph-api
+ *
+ * @param {string} requestPath Graph API endpoint you want to call
+ * @param {string[]} permissions List of [permissions](https://developers.facebook.com/docs/facebook-login/permissions) for this request.
+ * @return Returns a Promise that resolves with the result of the request, or rejects with an error
+ */
+ Facebook.api = function (requestPath, permissions) { return; };
+ /**
+ * Log an event. For more information see the Events section above.
+ *
+ * @param {string} name Name of the event
+ * @param {Object} [params] An object containing extra data to log with the event
+ * @param {number} [valueToSum] any value to be added to added to a sum on each event
+ * @return
+ */
+ Facebook.logEvent = function (name, params, valueToSum) { return; };
+ /**
+ * Log a purchase. For more information see the Events section above.
+ *
+ * @param {number} value Value of the purchase.
+ * @param {string} currency The currency, as an [ISO 4217 currency code](http://en.wikipedia.org/wiki/ISO_4217)
+ * @return Returns a Promise
+ */
+ Facebook.logPurchase = function (value, currency) { return; };
+ /**
+ * Open App Invite dialog. Does not require login.
+ *
+ * For more information see:
+ *
+ * the App Invites Overview - https://developers.facebook.com/docs/app-invites/overview
+ * the App Links docs - https://developers.facebook.com/docs/applinks
+ *
+ *
+ * @param {Object} options An object containing an [App Link](https://developers.facebook.com/docs/applinks) URL to your app and an optional image URL.
+ * url: [App Link](https://developers.facebook.com/docs/applinks) to your app
+ * picture: image to be displayed in the App Invite dialog
+ *
+ * @return Returns a Promise that resolves with the result data, or rejects with an error
+ */
+ Facebook.appInvite = function (options) { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], Facebook, "browserInit", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Facebook, "login", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Facebook, "logout", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Facebook, "getLoginStatus", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Facebook, "getAccessToken", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Facebook, "showDialog", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Facebook, "api", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Facebook, "logEvent", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Facebook, "logPurchase", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Facebook, "appInvite", null);
+ Facebook = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-facebook4',
+ pluginRef: 'facebookConnectPlugin',
+ repo: 'https://github.com/jeduan/cordova-plugin-facebook4',
+ install: 'cordova plugin add cordova-plugin-facebook4 --variable APP_ID="123456789" --variable APP_NAME="myApplication"'
+ })
+ ], Facebook);
+ return Facebook;
+}());
+exports.Facebook = Facebook;
+
+},{"./plugin":48}],31:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name File
+ * @description
+ * This plugin implements a File API allowing read/write access to files residing on the device.
+ *
+ * This plugin is based on several specs, including : The HTML5 File API http://www.w3.org/TR/FileAPI/
+ * The (now-defunct) Directories and System extensions Latest: http://www.w3.org/TR/2012/WD-file-system-api-20120417/
+ * Although most of the plugin code was written when an earlier spec was current: http://www.w3.org/TR/2011/WD-file-system-api-20110419/
+ * It also implements the FileWriter spec : http://dev.w3.org/2009/dap/file-system/file-writer.html
+ */
+var File = (function () {
+ function File() {
+ }
+ // @Cordova()
+ // static getFreeDiskSpace(): Promise { return }
+ /**
+ * Check if a directory exists in a certain path, directory.
+ *
+ * @param {string} path Base FileSystem. Please refer to the iOS and Android filesystems above
+ * @param {string} dir Name of directory to check
+ * @return Returns a Promise that resolves or rejects with an error.
+ */
+ File.checkDir = function (path, dir) {
+ var resolveFn, rejectFn;
+ var promise = new Promise(function (resolve, reject) { resolveFn = resolve; rejectFn = reject; });
+ if ((/^\//.test(dir))) {
+ rejectFn('directory cannot start with \/');
+ }
+ if (!(/\/$/.test(dir))) {
+ path += '/';
+ }
+ try {
+ var directory = path + dir;
+ window.resolveLocalFileSystemURL(directory, function (fileSystem) {
+ if (fileSystem.isDirectory === true) {
+ resolveFn(fileSystem);
+ }
+ else {
+ rejectFn({ code: 13, message: 'input is not a directory' });
+ }
+ }, function (error) {
+ error.message = File.cordovaFileError[error.code];
+ rejectFn(error);
+ });
+ }
+ catch (err) {
+ err.message = File.cordovaFileError[err.code];
+ rejectFn(err);
+ }
+ return promise;
+ };
+ /**
+ * Creates a new directory in the specific path.
+ * The replace boolean value determines whether to replace an existing directory with the same name.
+ * If an existing directory exists and the replace value is false, the promise will fail and return an error.
+ *
+ * @param {string} path Base FileSystem. Please refer to the iOS and Android filesystems above
+ * @param {string} dirName Name of directory to create
+ * @param {boolean} replace If true, replaces file with same name. If false returns error
+ * @return Returns a Promise that resolves or rejects with an error.
+ */
+ File.createDir = function (path, dirName, replace) {
+ var resolveFn, rejectFn;
+ var promise = new Promise(function (resolve, reject) { resolveFn = resolve; rejectFn = reject; });
+ if ((/^\//.test(dirName))) {
+ rejectFn('directory cannot start with \/');
+ }
+ replace = !replace;
+ var options = {
+ create: true,
+ exclusive: replace
+ };
+ try {
+ window.resolveLocalFileSystemURL(path, function (fileSystem) {
+ fileSystem.getDirectory(dirName, options, function (result) {
+ resolveFn(result);
+ }, function (error) {
+ error.message = File.cordovaFileError[error.code];
+ rejectFn(error);
+ });
+ }, function (err) {
+ err.message = File.cordovaFileError[err.code];
+ rejectFn(err);
+ });
+ }
+ catch (e) {
+ e.message = File.cordovaFileError[e.code];
+ rejectFn(e);
+ }
+ return promise;
+ };
+ /**
+ * Remove a directory at a given path.
+ *
+ * @param {string} path The path to the directory
+ * @param {string} dirName The directory name
+ * @return Returns a Promise that resolves or rejects with an error.
+ */
+ File.removeDir = function (path, dirName) {
+ var resolveFn, rejectFn;
+ var promise = new Promise(function (resolve, reject) { resolveFn = resolve; rejectFn = reject; });
+ if ((/^\//.test(dirName))) {
+ rejectFn('directory cannot start with \/');
+ }
+ try {
+ window.resolveLocalFileSystemURL(path, function (fileSystem) {
+ fileSystem.getDirectory(dirName, { create: false }, function (dirEntry) {
+ dirEntry.remove(function () {
+ resolveFn({ success: true, fileRemoved: dirEntry });
+ }, function (error) {
+ error.message = File.cordovaFileError[error.code];
+ rejectFn(error);
+ });
+ }, function (err) {
+ err.message = File.cordovaFileError[err.code];
+ rejectFn(err);
+ });
+ }, function (er) {
+ er.message = File.cordovaFileError[er.code];
+ rejectFn(er);
+ });
+ }
+ catch (e) {
+ e.message = File.cordovaFileError[e.code];
+ rejectFn(e);
+ }
+ return promise;
+ };
+ /**
+ * Move a directory to a given path.
+ *
+ * @param {string} path The source path to the directory
+ * @param {string} dirName The source directory name
+ * @param {string} newPath The destionation path to the directory
+ * @param {string} newDirName The destination directory name
+ * @return Returns a Promise that resolves or rejects with an error.
+ */
+ File.moveDir = function (path, dirName, newPath, newDirName) {
+ var resolveFn, rejectFn;
+ var promise = new Promise(function (resolve, reject) { resolveFn = resolve; rejectFn = reject; });
+ newDirName = newDirName || dirName;
+ if ((/^\//.test(newDirName))) {
+ rejectFn('directory cannot start with \/');
+ }
+ try {
+ window.resolveLocalFileSystemURL(path, function (fileSystem) {
+ fileSystem.getDirectory(dirName, { create: false }, function (dirEntry) {
+ window.resolveLocalFileSystemURL(newPath, function (newDirEntry) {
+ dirEntry.moveTo(newDirEntry, newDirName, function (result) {
+ resolveFn(result);
+ }, function (error) {
+ rejectFn(error);
+ });
+ }, function (erro) {
+ rejectFn(erro);
+ });
+ }, function (err) {
+ rejectFn(err);
+ });
+ }, function (er) {
+ rejectFn(er);
+ });
+ }
+ catch (e) {
+ rejectFn(e);
+ }
+ return promise;
+ };
+ /**
+ * Copy a directory in various methods. If destination directory exists, will fail to copy.
+ *
+ * @param {string} path Base FileSystem. Please refer to the iOS and Android filesystems above
+ * @param {string} dirName Name of directory to copy
+ * @param {string} newPath Base FileSystem of new location
+ * @param {string} newDirName New name of directory to copy to (leave blank to remain the same)
+ * @return Returns a Promise that resolves or rejects with an error.
+ */
+ File.copyDir = function (path, dirName, newPath, newDirName) {
+ var resolveFn, rejectFn;
+ var promise = new Promise(function (resolve, reject) { resolveFn = resolve; rejectFn = reject; });
+ newDirName = newDirName || dirName;
+ if ((/^\//.test(newDirName))) {
+ rejectFn('directory cannot start with \/');
+ }
+ try {
+ window.resolveLocalFileSystemURL(path, function (fileSystem) {
+ fileSystem.getDirectory(dirName, { create: false, exclusive: false }, function (dirEntry) {
+ window.resolveLocalFileSystemURL(newPath, function (newDirEntry) {
+ dirEntry.copyTo(newDirEntry, newDirName, function (result) {
+ resolveFn(result);
+ }, function (error) {
+ error.message = File.cordovaFileError[error.code];
+ rejectFn(error);
+ });
+ }, function (erro) {
+ erro.message = File.cordovaFileError[erro.code];
+ rejectFn(erro);
+ });
+ }, function (err) {
+ err.message = File.cordovaFileError[err.code];
+ rejectFn(err);
+ });
+ }, function (er) {
+ er.message = File.cordovaFileError[er.code];
+ rejectFn(er);
+ });
+ }
+ catch (e) {
+ e.message = File.cordovaFileError[e.code];
+ rejectFn(e);
+ }
+ return promise;
+ };
+ /**
+ * List files and directory from a given path.
+ *
+ * @param {string} path Base FileSystem. Please refer to the iOS and Android filesystems above
+ * @param {string} dirName Name of directory
+ * @return Returns a Promise that resolves or rejects with an error.
+ */
+ File.listDir = function (path, dirName) {
+ var resolveFn, rejectFn;
+ var promise = new Promise(function (resolve, reject) { resolveFn = resolve; rejectFn = reject; });
+ if ((/^\//.test(dirName))) {
+ rejectFn('directory cannot start with \/');
+ }
+ var options = {
+ create: false,
+ exclusive: false
+ };
+ try {
+ window.resolveLocalFileSystemURL(path, function (fileSystem) {
+ fileSystem.getDirectory(dirName, options, function (parent) {
+ var reader = parent.createReader();
+ reader.readEntries(function (entries) {
+ resolveFn(entries);
+ }, function () {
+ rejectFn('DIR_READ_ERROR : ' + path + dirName);
+ });
+ }, function (error) {
+ error.message = File.cordovaFileError[error.code];
+ rejectFn(error);
+ });
+ }, function (err) {
+ err.message = File.cordovaFileError[err.code];
+ rejectFn(err);
+ });
+ }
+ catch (e) {
+ e.message = File.cordovaFileError[e.code];
+ rejectFn(e);
+ }
+ return promise;
+ };
+ /**
+ * Removes all files and the directory from a desired location.
+ *
+ * @param {string} path Base FileSystem. Please refer to the iOS and Android filesystems above
+ * @param {string} dirName Name of directory
+ * @return Returns a Promise that resolves or rejects with an error.
+ */
+ File.removeRecursively = function (path, dirName) {
+ var resolveFn, rejectFn;
+ var promise = new Promise(function (resolve, reject) { resolveFn = resolve; rejectFn = reject; });
+ if ((/^\//.test(dirName))) {
+ rejectFn('directory cannot start with \/');
+ }
+ try {
+ window.resolveLocalFileSystemURL(path, function (fileSystem) {
+ fileSystem.getDirectory(dirName, { create: false }, function (dirEntry) {
+ dirEntry.removeRecursively(function () {
+ resolveFn({ success: true, fileRemoved: dirEntry });
+ }, function (error) {
+ error.message = File.cordovaFileError[error.code];
+ rejectFn(error);
+ });
+ }, function (err) {
+ err.message = File.cordovaFileError[err.code];
+ rejectFn(err);
+ });
+ }, function (er) {
+ er.message = File.cordovaFileError[er.code];
+ rejectFn(er);
+ });
+ }
+ catch (e) {
+ e.message = File.cordovaFileError[e.code];
+ rejectFn(e);
+ }
+ return promise;
+ };
+ /**
+ * Check if a file exists in a certain path, directory.
+ *
+ * @param {string} path Base FileSystem. Please refer to the iOS and Android filesystems above
+ * @param {string} file Name of file to check
+ * @return Returns a Promise that resolves or rejects with an error.
+ */
+ File.checkFile = function (path, file) {
+ var resolveFn, rejectFn;
+ var promise = new Promise(function (resolve, reject) { resolveFn = resolve; rejectFn = reject; });
+ if ((/^\//.test(file))) {
+ rejectFn('file cannot start with \/');
+ }
+ if (!(/\/$/.test(file))) {
+ path += '/';
+ }
+ try {
+ var directory = path + file;
+ window.resolveLocalFileSystemURL(directory, function (fileSystem) {
+ if (fileSystem.isFile === true) {
+ resolveFn(fileSystem);
+ }
+ else {
+ rejectFn({ code: 13, message: 'input is not a file' });
+ }
+ }, function (error) {
+ error.message = File.cordovaFileError[error.code];
+ rejectFn(error);
+ });
+ }
+ catch (err) {
+ err.message = File.cordovaFileError[err.code];
+ rejectFn(err);
+ }
+ return promise;
+ };
+ /**
+ * Creates a new file in the specific path.
+ * The replace boolean value determines whether to replace an existing file with the same name.
+ * If an existing file exists and the replace value is false, the promise will fail and return an error.
+ *
+ * @param {string} path Base FileSystem. Please refer to the iOS and Android filesystems above
+ * @param {string} fileName Name of file to create
+ * @param {boolean} replace If true, replaces file with same name. If false returns error
+ * @return Returns a Promise that resolves or rejects with an error.
+ */
+ File.createFile = function (path, fileName, replace) {
+ var resolveFn, rejectFn;
+ var promise = new Promise(function (resolve, reject) { resolveFn = resolve; rejectFn = reject; });
+ if ((/^\//.test(fileName))) {
+ rejectFn('file-name cannot start with \/');
+ }
+ replace = !replace;
+ var options = {
+ create: true,
+ exclusive: replace
+ };
+ try {
+ window.resolveLocalFileSystemURL(path, function (fileSystem) {
+ fileSystem.getFile(fileName, options, function (result) {
+ resolveFn(result);
+ }, function (error) {
+ error.message = File.cordovaFileError[error.code];
+ rejectFn(error);
+ });
+ }, function (err) {
+ err.message = File.cordovaFileError[err.code];
+ rejectFn(err);
+ });
+ }
+ catch (e) {
+ e.message = File.cordovaFileError[e.code];
+ rejectFn(e);
+ }
+ return promise;
+ };
+ /**
+ * Removes a file from a desired location.
+ *
+ * @param {string} path Base FileSystem. Please refer to the iOS and Android filesystems above
+ * @param {string} fileName Name of file to remove
+ * @return Returns a Promise that resolves or rejects with an error.
+ */
+ File.removeFile = function (path, fileName) {
+ var resolveFn, rejectFn;
+ var promise = new Promise(function (resolve, reject) { resolveFn = resolve; rejectFn = reject; });
+ if ((/^\//.test(fileName))) {
+ rejectFn('file-name cannot start with \/');
+ }
+ try {
+ window.resolveLocalFileSystemURL(path, function (fileSystem) {
+ fileSystem.getFile(fileName, { create: false }, function (fileEntry) {
+ fileEntry.remove(function () {
+ resolveFn({ success: true, fileRemoved: fileEntry });
+ }, function (error) {
+ error.message = File.cordovaFileError[error.code];
+ rejectFn(error);
+ });
+ }, function (err) {
+ err.message = File.cordovaFileError[err.code];
+ rejectFn(err);
+ });
+ }, function (er) {
+ er.message = File.cordovaFileError[er.code];
+ rejectFn(er);
+ });
+ }
+ catch (e) {
+ e.message = File.cordovaFileError[e.code];
+ rejectFn(e);
+ }
+ return promise;
+ };
+ // static writeFile(path: string, fileName: string, text: string, replace: boolean): Promise { return }
+ // static writeExistingFile(path: string, fileName: string, text: string): Promise { return }
+ /**
+ * Read a file as string.
+ *
+ * @param {string} path Base FileSystem. Please refer to the iOS and Android filesystems above
+ * @param {string} fileName Name of file to move
+ * @return Returns a Promise that resolves or rejects with an error.
+ */
+ File.readAsText = function (path, fileName) {
+ var resolveFn, rejectFn;
+ var promise = new Promise(function (resolve, reject) { resolveFn = resolve; rejectFn = reject; });
+ if ((/^\//.test(fileName))) {
+ rejectFn('file-name cannot start with \/');
+ }
+ try {
+ window.resolveLocalFileSystemURL(path, function (fileSystem) {
+ fileSystem.getFile(fileName, { create: false }, function (fileEntry) {
+ fileEntry.file(function (file) {
+ var reader = new FileReader();
+ reader.onloadend = function (e) {
+ if (this.result !== undefined && this.result !== null) {
+ resolveFn(this.result);
+ }
+ else if (this.error !== undefined && this.error !== null) {
+ rejectFn(this.error);
+ }
+ else {
+ rejectFn({ code: null, message: 'READER_ONLOADEND_ERR' });
+ }
+ };
+ reader.readAsText(file);
+ }, function (error) {
+ error.message = File.cordovaFileError[error.code];
+ rejectFn(error);
+ });
+ }, function (err) {
+ err.message = File.cordovaFileError[err.code];
+ rejectFn(err);
+ });
+ }, function (er) {
+ er.message = File.cordovaFileError[er.code];
+ rejectFn(er);
+ });
+ }
+ catch (e) {
+ e.message = File.cordovaFileError[e.code];
+ rejectFn(e);
+ }
+ return promise;
+ };
+ // static readAsDataURL(path: string, file: string): Promise { return }
+ // static readAsBinaryString(path: string, file: string): Promise { return }
+ // static readAsArrayBuffer(path: string, file: string): Promise { return }
+ /**
+ * Move a file to a given path.
+ *
+ * @param {string} path Base FileSystem. Please refer to the iOS and Android filesystems above
+ * @param {string} fileName Name of file to move
+ * @param {string} newPath Base FileSystem of new location
+ * @param {string} newFileName New name of file to move to (leave blank to remain the same)
+ * @return Returns a Promise that resolves or rejects with an error.
+ */
+ File.moveFile = function (path, fileName, newPath, newFileName) {
+ var resolveFn, rejectFn;
+ var promise = new Promise(function (resolve, reject) { resolveFn = resolve; rejectFn = reject; });
+ newFileName = newFileName || fileName;
+ if ((/^\//.test(newFileName))) {
+ rejectFn('file-name cannot start with \/');
+ }
+ try {
+ window.resolveLocalFileSystemURL(path, function (fileSystem) {
+ fileSystem.getFile(fileName, { create: false }, function (fileEntry) {
+ window.resolveLocalFileSystemURL(newPath, function (newFileEntry) {
+ fileEntry.moveTo(newFileEntry, newFileName, function (result) {
+ resolveFn(result);
+ }, function (error) {
+ rejectFn(error);
+ });
+ }, function (err) {
+ rejectFn(err);
+ });
+ }, function (err) {
+ rejectFn(err);
+ });
+ }, function (er) {
+ rejectFn(er);
+ });
+ }
+ catch (e) {
+ rejectFn(e);
+ }
+ return promise;
+ };
+ /**
+ * Copy a file in various methods. If file exists, will fail to copy.
+ *
+ * @param {string} path Base FileSystem. Please refer to the iOS and Android filesystems above
+ * @param {string} fileName Name of file to copy
+ * @param {string} newPath Base FileSystem of new location
+ * @param {string} newFileName New name of file to copy to (leave blank to remain the same)
+ * @return Returns a Promise that resolves or rejects with an error.
+ */
+ File.copyFile = function (path, fileName, newPath, newFileName) {
+ var resolveFn, rejectFn;
+ var promise = new Promise(function (resolve, reject) { resolveFn = resolve; rejectFn = reject; });
+ newFileName = newFileName || fileName;
+ if ((/^\//.test(newFileName))) {
+ rejectFn('file-name cannot start with \/');
+ }
+ try {
+ window.resolveLocalFileSystemURL(path, function (fileSystem) {
+ fileSystem.getFile(fileName, { create: false, exclusive: false }, function (fileEntry) {
+ window.resolveLocalFileSystemURL(newPath, function (newFileEntry) {
+ fileEntry.copyTo(newFileEntry, newFileName, function (result) {
+ resolveFn(result);
+ }, function (error) {
+ error.message = File.cordovaFileError[error.code];
+ rejectFn(error);
+ });
+ }, function (erro) {
+ erro.message = File.cordovaFileError[erro.code];
+ rejectFn(erro);
+ });
+ }, function (err) {
+ err.message = File.cordovaFileError[err.code];
+ rejectFn(err);
+ });
+ }, function (er) {
+ er.message = File.cordovaFileError[er.code];
+ rejectFn(er);
+ });
+ }
+ catch (e) {
+ e.message = File.cordovaFileError[e.code];
+ rejectFn(e);
+ }
+ return promise;
+ };
+ File.cordovaFileError = {
+ 1: 'NOT_FOUND_ERR',
+ 2: 'SECURITY_ERR',
+ 3: 'ABORT_ERR',
+ 4: 'NOT_READABLE_ERR',
+ 5: 'ENCODING_ERR',
+ 6: 'NO_MODIFICATION_ALLOWED_ERR',
+ 7: 'INVALID_STATE_ERR',
+ 8: 'SYNTAX_ERR',
+ 9: 'INVALID_MODIFICATION_ERR',
+ 10: 'QUOTA_EXCEEDED_ERR',
+ 11: 'TYPE_MISMATCH_ERR',
+ 12: 'PATH_EXISTS_ERR'
+ };
+ File = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-file',
+ pluginRef: 'cordova.file',
+ repo: 'https://github.com/apache/cordova-plugin-file'
+ })
+ ], File);
+ return File;
+}());
+exports.File = File;
+
+},{"./plugin":48}],32:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Transfer
+ * @description This plugin allows you to upload and download files.
+ * Example:
+ * Create instance:
+ * const fileTransfer = new Transfer();
+ *
+ * Upload a file:
+ * fileTransfer.upload(..).then(..).catch(..);
+ *
+ * Download a file:
+ * fileTransfer.download(..).then(..).catch(..);
+ *
+ * Abort active transfer:
+ * fileTransfer.abort();
+ */
+var Transfer = (function () {
+ function Transfer() {
+ this._objectInstance = new FileTransfer();
+ }
+ /**
+ * Sends a file to a server.
+ *
+ * @param {string} fileUrl Filesystem URL representing the file on the device or a data URI. For backwards compatibility, this can also be the full path of the file on the device.
+ * @param {string} url URL of the server to receive the file, as encoded by encodeURI().
+ * @param {FileUploadOptions} options Optional parameters.
+ * @param {boolean} trustAllHosts: Optional parameter, defaults to false. If set to true, it accepts all security certificates. This is useful since Android rejects self-signed security certificates. Not recommended for production use. Supported on Android and iOS.
+ * @return Returns a Promise that resolves to a FileUploadResult and rejects with FileTransferError.
+ */
+ Transfer.prototype.upload = function (fileUrl, url, options, trustAllHosts) {
+ return;
+ };
+ /**
+ * Downloads a file from server.
+ *
+ * @param {string} source URL of the server to download the file, as encoded by encodeURI().
+ * @param {stirng} target Filesystem url representing the file on the device. For backwards compatibility, this can also be the full path of the file on the device.
+ * @param {boolean} trustAllHosts Optional parameter, defaults to false. If set to true, it accepts all security certificates. This is useful because Android rejects self-signed security certificates. Not recommended for production use. Supported on Android and iOS.
+ * @param {object} Optional parameters, currently only supports headers (such as Authorization (Basic Authentication), etc).
+ * @return Returns a Promise that resolves to a FileEntry object.
+ */
+ Transfer.prototype.download = function (source, target, trustAllHosts, options) {
+ return;
+ };
+ /**
+ * Registers a listener that gets called whenever a new chunk of data is transferred.
+ * @param {function} Listener that takes a progress event.
+ */
+ Transfer.prototype.onProgress = function (listener) {
+ this._objectInstance.onprogress = listener;
+ };
+ /**
+ * Aborts an in-progress transfer. The onerror callback is passed a FileTransferError
+ * object which has an error code of FileTransferError.ABORT_ERR.
+ */
+ Transfer.prototype.abort = function () { };
+ Transfer.FILE_NOT_FOUND_ERR = 1;
+ Transfer.INVALID_URL_ERR = 2;
+ Transfer.CONNECTION_ERR = 3;
+ Transfer.ABORT_ERR = 4;
+ Transfer.NOT_MODIFIED_ERR = 4;
+ __decorate([
+ plugin_1.CordovaInstance({
+ successIndex: 2,
+ errorIndex: 3
+ })
+ ], Transfer.prototype, "upload", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ successIndex: 2,
+ errorIndex: 3
+ })
+ ], Transfer.prototype, "download", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], Transfer.prototype, "abort", null);
+ Transfer = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-file-transfer',
+ pluginRef: 'FileTransfer',
+ repo: 'https://github.com/apache/cordova-plugin-file-transfer'
+ })
+ ], Transfer);
+ return Transfer;
+}());
+exports.Transfer = Transfer;
+
+},{"./plugin":48}],33:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Flashlight
+ * @description This plugin allows you to switch the flashlight / torch of the device on and off.
+ *
+ * Requires Cordova plugin: `cordova-plugin-flashlight`. For more info, please see the [Flashlight plugin docs](https://github.com/EddyVerbruggen/Flashlight-PhoneGap-Plugin).
+ *
+ * @usage
+ * ```js
+ * import {Flashlight} from 'ionic-native';
+ *
+ *
+ *
+ * ```
+ */
+var Flashlight = (function () {
+ function Flashlight() {
+ }
+ /**
+ * Checks if the flashlight is available
+ * @returns {Promise} Returns a promise that resolves with a boolean stating if the flashlight is available.
+ */
+ Flashlight.available = function () { return; };
+ /**
+ * Switches the flashlight on
+ * @returns {Promise}
+ */
+ Flashlight.switchOn = function () { return; };
+ /**
+ * Switches the flashlight off
+ * @returns {Promise}
+ */
+ Flashlight.switchOff = function () { return; };
+ /**
+ * Toggles the flashlight
+ * @returns {Promise}
+ */
+ Flashlight.toggle = function () { return; };
+ /**
+ * Checks if the flashlight is turned on.
+ * Returns a boolean
+ */
+ Flashlight.isSwitchedOn = function () { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], Flashlight, "available", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Flashlight, "switchOn", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Flashlight, "switchOff", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Flashlight, "toggle", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], Flashlight, "isSwitchedOn", null);
+ Flashlight = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-flashlight',
+ pluginRef: 'window.plugins.flashlight',
+ repo: 'https://github.com/EddyVerbruggen/Flashlight-PhoneGap-Plugin.git'
+ })
+ ], Flashlight);
+ return Flashlight;
+}());
+exports.Flashlight = Flashlight;
+
+},{"./plugin":48}],34:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Geolocation
+ * @description
+ * This plugin provides information about the device's location, such as latitude and longitude. Common sources of location information include Global Positioning System (GPS) and location inferred from network signals such as IP address, RFID, WiFi and Bluetooth MAC addresses, and GSM/CDMA cell IDs.
+ *
+ * This API is based on the W3C Geolocation API Specification, and only executes on devices that don't already provide an implementation.
+ *
+ * @usage
+ *
+ * ```ts
+ * import {Geolocation} from 'ionic-native';
+ *
+ *
+ *
+ * Geolocation.getCurrentPosition().then((resp) => {
+ * //resp.coords.latitude
+ * //resp.coords.longitude
+ * })
+ *
+ * let watch = Geolocation.watchPosition();
+ * watch.subscribe((data) => {
+ * //data.coords.latitude
+ * //data.coords.longitude
+ * })
+ * ```
+ */
+var Geolocation = (function () {
+ function Geolocation() {
+ }
+ /**
+ * Get the device's current position.
+ *
+ * @param {GeolocationOptions} options The [geolocation options](https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions).
+ * @return Returns a Promise that resolves with the [position](https://developer.mozilla.org/en-US/docs/Web/API/Position) of the device, or rejects with an error.
+ */
+ Geolocation.getCurrentPosition = function (options) { return; };
+ /**
+ * Watch the current device's position. Clear the watch by unsubscribing from
+ * Observable changes.
+ *
+ * ```ts
+ * var subscription = Geolocation.watchPosition().subscribe(position => {
+ * console.log(position.coords.longitude + ' ' + position.coords.latitude);
+ * });
+ *
+ * // To stop notifications
+ * subscription.unsubscribe();
+ * ```
+ *
+ * @param {GeolocationOptions} options The [geolocation options](https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions).
+ * @return Returns an Observable that notifies with the [position](https://developer.mozilla.org/en-US/docs/Web/API/Position) of the device, or errors.
+ */
+ Geolocation.watchPosition = function (options) { return; };
+ __decorate([
+ plugin_1.Cordova({
+ callbackOrder: 'reverse'
+ })
+ ], Geolocation, "getCurrentPosition", null);
+ __decorate([
+ plugin_1.Cordova({
+ callbackOrder: 'reverse',
+ observable: true,
+ clearFunction: 'clearWatch'
+ })
+ ], Geolocation, "watchPosition", null);
+ Geolocation = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-geolocation',
+ pluginRef: 'navigator.geolocation',
+ repo: 'https://github.com/apache/cordova-plugin-geolocation'
+ })
+ ], Geolocation);
+ return Geolocation;
+}());
+exports.Geolocation = Geolocation;
+
+},{"./plugin":48}],35:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Globalization
+ * @description
+ * @usage
+ * ```js
+ * import {Globalization} from 'ionic-native';
+ *
+ *
+ *
+ * ```
+ */
+var Globalization = (function () {
+ function Globalization() {
+ }
+ /**
+ * Returns the BCP-47 compliant language identifier tag to the successCallback with a properties object as a parameter. That object should have a value property with a String value.
+ * @return {Promise<{value: string}>}
+ */
+ Globalization.getPreferredLanguage = function () { return; };
+ /**
+ * Returns the BCP 47 compliant locale identifier string to the successCallback with a properties object as a parameter.
+ * @return {Promise<{value: string}>}
+ */
+ Globalization.getLocaleName = function () { return; };
+ /**
+ * Converts date to string
+ * @param date
+ * @param options
+ * @return {Promise<{value: string}>}
+ */
+ Globalization.dateToString = function (date, options) { return; };
+ /**
+ *
+ * @param dateString
+ * @param options
+ */
+ Globalization.stringToDate = function (dateString, options) { return; };
+ /**
+ *
+ * @param options
+ */
+ Globalization.getDatePattern = function (options) { return; };
+ /**
+ *
+ * @param options
+ */
+ Globalization.getDateNames = function (options) { return; };
+ /**
+ * Check if day light saving is active
+ * @param date
+ */
+ Globalization.isDayLightSavingsTime = function (date) { return; };
+ /**
+ * Get first day of week
+ */
+ Globalization.getFirstDayOfWeek = function () { return; };
+ /**
+ *
+ * @param options
+ */
+ Globalization.numberToString = function (options) { return; };
+ /**
+ *
+ * @param stringToConvert
+ * @param options
+ */
+ Globalization.stringToNumber = function (stringToConvert, options) { return; };
+ /**
+ *
+ * @param options
+ */
+ Globalization.getNumberPattern = function (options) { return; };
+ /**
+ *
+ * @param currencyCode
+ */
+ Globalization.getCurrencyPattern = function (currencyCode) { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], Globalization, "getPreferredLanguage", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Globalization, "getLocaleName", null);
+ __decorate([
+ plugin_1.Cordova({
+ successIndex: 1,
+ errorIndex: 2
+ })
+ ], Globalization, "dateToString", null);
+ __decorate([
+ plugin_1.Cordova({
+ successIndex: 1,
+ errorIndex: 2
+ })
+ ], Globalization, "stringToDate", null);
+ __decorate([
+ plugin_1.Cordova({
+ callbackOrder: 'reverse'
+ })
+ ], Globalization, "getDatePattern", null);
+ __decorate([
+ plugin_1.Cordova({
+ callbackOrder: 'reverse'
+ })
+ ], Globalization, "getDateNames", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Globalization, "isDayLightSavingsTime", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Globalization, "getFirstDayOfWeek", null);
+ __decorate([
+ plugin_1.Cordova({
+ successIndex: 1,
+ errorIndex: 2
+ })
+ ], Globalization, "numberToString", null);
+ __decorate([
+ plugin_1.Cordova({
+ successIndex: 1,
+ errorIndex: 2
+ })
+ ], Globalization, "stringToNumber", null);
+ __decorate([
+ plugin_1.Cordova({
+ callbackOrder: 'reverse'
+ })
+ ], Globalization, "getNumberPattern", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Globalization, "getCurrencyPattern", null);
+ Globalization = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-globalization',
+ pluginRef: 'navigator.globalization',
+ repo: 'https: //github.com/apache/cordova-plugin-globalization'
+ })
+ ], Globalization);
+ return Globalization;
+}());
+exports.Globalization = Globalization;
+
+},{"./plugin":48}],36:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Google Plus
+ * @description
+ * @usage
+ * ```
+ *
+ * ```
+ */
+var GooglePlus = (function () {
+ function GooglePlus() {
+ }
+ /**
+ * The login function walks the user through the Google Auth process.
+ * @param options
+ */
+ GooglePlus.login = function (options) { return; };
+ /**
+ * You can call trySilentLogin to check if they're already signed in to the app and sign them in silently if they are.
+ * @param options
+ */
+ GooglePlus.trySilentLogin = function (options) { return; };
+ /**
+ * This will clear the OAuth2 token.
+ */
+ GooglePlus.logout = function () { return; };
+ /**
+ * This will clear the OAuth2 token, forget which account was used to login, and disconnect that account from the app. This will require the user to allow the app access again next time they sign in. Be aware that this effect is not always instantaneous. It can take time to completely disconnect.
+ */
+ GooglePlus.disconnect = function () { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], GooglePlus, "login", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], GooglePlus, "trySilentLogin", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], GooglePlus, "logout", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], GooglePlus, "disconnect", null);
+ GooglePlus = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-googleplus',
+ pluginRef: 'window.plugins.googleplus',
+ repo: 'https://github.com/EddyVerbruggen/cordova-plugin-googleplus',
+ platforms: ['Web', 'Android', 'iOS'],
+ install: 'ionic plugin add cordova-plugin-googleplus --variable REVERSED_CLIENT_ID=myreversedclientid'
+ })
+ ], GooglePlus);
+ return GooglePlus;
+}());
+exports.GooglePlus = GooglePlus;
+
+},{"./plugin":48}],37:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Google Analytics
+ * @description
+ * This plugin connects to Google's native Universal Analytics SDK
+ * Prerequisites:
+ * - A Cordova 3.0+ project for iOS and/or Android
+ * - A Mobile App property through the Google Analytics Admin Console
+ * - (Android) Google Play Services SDK installed via [Android SDK Manager](https://developer.android.com/sdk/installing/adding-packages.html)
+ */
+var GoogleAnalytics = (function () {
+ function GoogleAnalytics() {
+ }
+ /**
+ * In your 'deviceready' handler, set up your Analytics tracker.
+ * https://developers.google.com/analytics/devguides/collection/analyticsjs/
+ * @param {string} id Your Google Analytics Mobile App property
+ */
+ GoogleAnalytics.startTrackerWithId = function (id) { return; };
+ /**
+ * Track a screen
+ * https://developers.google.com/analytics/devguides/collection/analyticsjs/screens
+ *
+ * @param {string} title Screen title
+ */
+ GoogleAnalytics.trackView = function (title) { return; };
+ /**
+ * Track an event
+ * https://developers.google.com/analytics/devguides/collection/analyticsjs/events
+ * @param {string} category
+ * @param {string} action
+ * @param {string} label
+ * @param {number} value
+ */
+ GoogleAnalytics.trackEvent = function (category, action, label, value) { return; };
+ /**
+ * Track an exception
+ * @param {string} description
+ * @param {boolean} fatal
+ */
+ GoogleAnalytics.trackException = function (description, fatal) { return; };
+ /**
+ * Track User Timing (App Speed)
+ * @param {string} category
+ * @param {number} intervalInMilliseconds
+ * @param {string} variable
+ * @param {string} label
+ */
+ GoogleAnalytics.trackTiming = function (category, intervalInMilliseconds, variable, label) { return; };
+ /**
+ * Add a Transaction (Ecommerce)
+ * https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#addTrans
+ * @param {string} id
+ * @param {string} affiliation
+ * @param {number} revenue
+ * @param {number} tax
+ * @param {number} shipping
+ * @param {string} currencyCode
+ */
+ GoogleAnalytics.addTransaction = function (id, affiliation, revenue, tax, shipping, currencyCode) { return; };
+ /**
+ * Add a Transaction Item (Ecommerce)
+ * https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#addItem
+ * @param {string} id
+ * @param {string} name
+ * @param {string} sku
+ * @param {string} category
+ * @param {number} price
+ * @param {number} quantity
+ * @param {string} currencyCode
+ */
+ GoogleAnalytics.addTransactionItem = function (id, name, sku, category, price, quantity, currencyCode) { return; };
+ /**
+ * Add a Custom Dimension
+ * https://developers.google.com/analytics/devguides/platform/customdimsmets
+ * @param {string} key
+ * @param {string} value
+ */
+ GoogleAnalytics.addCustomDimension = function (key, value) { return; };
+ /**
+ * Set a UserId
+ * https://developers.google.com/analytics/devguides/collection/analyticsjs/user-id
+ * @param {string} id
+ */
+ GoogleAnalytics.setUserId = function (id) { return; };
+ /**
+ * Enable verbose logging
+ */
+ GoogleAnalytics.debugMode = function () { return; };
+ /**
+ * Enable/disable automatic reporting of uncaught exceptions
+ * @param {boolean} shouldEnable
+ */
+ GoogleAnalytics.enableUncaughtExceptionReporting = function (shouldEnable) { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], GoogleAnalytics, "startTrackerWithId", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], GoogleAnalytics, "trackView", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], GoogleAnalytics, "trackEvent", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], GoogleAnalytics, "trackException", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], GoogleAnalytics, "trackTiming", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], GoogleAnalytics, "addTransaction", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], GoogleAnalytics, "addTransactionItem", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], GoogleAnalytics, "addCustomDimension", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], GoogleAnalytics, "setUserId", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], GoogleAnalytics, "debugMode", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], GoogleAnalytics, "enableUncaughtExceptionReporting", null);
+ GoogleAnalytics = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-google-analytics',
+ pluginRef: 'analytics',
+ repo: 'https://github.com/danwilson/google-analytics-plugin',
+ platforms: ['Android', 'iOS']
+ })
+ ], GoogleAnalytics);
+ return GoogleAnalytics;
+}());
+exports.GoogleAnalytics = GoogleAnalytics;
+
+},{"./plugin":48}],38:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+var Observable_1 = require('rxjs/Observable');
+var plugin_2 = require('./plugin');
+/**
+ * You can listen to these events where appropriate
+ */
+exports.GoogleMapsEvent = {
+ MAP_CLICK: 'click',
+ MAP_LONG_CLICK: 'long_click',
+ MY_LOCATION_CHANGE: 'my_location_change',
+ MY_LOCATION_BUTTON_CLICK: 'my_location_button_click',
+ INDOOR_BUILDING_FOCUSED: 'indoor_building_focused',
+ INDOOR_LEVEL_ACTIVATED: 'indoor_level_activated',
+ CAMERA_CHANGE: 'camera_change',
+ CAMERA_IDLE: 'camera_idle',
+ MAP_READY: 'map_ready',
+ MAP_LOADED: 'map_loaded',
+ MAP_WILL_MOVE: 'will_move',
+ MAP_CLOSE: 'map_close',
+ MARKER_CLICK: 'click',
+ OVERLAY_CLICK: 'overlay_click',
+ INFO_CLICK: 'info_click',
+ MARKER_DRAG: 'drag',
+ MARKER_DRAG_START: 'drag_start',
+ MARKER_DRAG_END: 'drag_end'
+};
+exports.GoogleMapsAnimation = {
+ BOUNCE: 'BOUNCE',
+ DROP: 'DROP'
+};
+/**
+ * @name Google Maps
+ * @description This plugin uses the native Google Maps SDK
+ * @usage
+ * ```
+ * import {GoogleMap, GoogleMapsEvent} from 'ionic-native';
+ *
+ * ...
+ *
+ * // somewhere in your component
+ * let map = new GoogleMap('elementID');
+ *
+ * map.on(GoogleMapsEvent.MAP_READY).subscribe(() => console.log("Map is ready!"));
+ * ```
+ */
+var GoogleMap = (function () {
+ function GoogleMap(elementId, options) {
+ this._objectInstance = plugin.google.maps.Map.getMap(document.getElementById(elementId), options);
+ }
+ /**
+ * Checks if a map object has been created.
+ * @return {Promise} returns a promise that resolves with the Map object (if it exists).
+ */
+ GoogleMap.isAvailable = function () {
+ return;
+ };
+ GoogleMap.prototype.on = function (event) {
+ var _this = this;
+ return new Observable_1.Observable(function (observer) {
+ var cb = function (data) { return observer.next(data); };
+ _this._objectInstance.on(event, cb);
+ return function () { return _this._objectInstance.off(event); };
+ });
+ };
+ GoogleMap.prototype.one = function (event) {
+ var _this = this;
+ return new Promise(function (resolve) { return _this._objectInstance.one(event, resolve); });
+ };
+ GoogleMap.prototype.setDebuggable = function (isDebuggable) {
+ };
+ GoogleMap.prototype.setClickable = function (isClickable) {
+ };
+ /**
+ * Get the position of the camera
+ */
+ GoogleMap.prototype.getCameraPosition = function () {
+ return;
+ };
+ /**
+ * Get the location of the user
+ */
+ GoogleMap.prototype.getMyLocation = function () {
+ return;
+ };
+ /**
+ * Get the visible region
+ */
+ GoogleMap.prototype.getVisibleRegion = function () {
+ return;
+ };
+ GoogleMap.prototype.showDialog = function () {
+ };
+ GoogleMap.prototype.closeDialog = function () {
+ };
+ GoogleMap.prototype.getLicenseInfo = function () {
+ return;
+ };
+ GoogleMap.prototype.setCenter = function (latLng) {
+ };
+ GoogleMap.prototype.setZoom = function (zoomLevel) {
+ };
+ GoogleMap.prototype.setMapTypeId = function (typeId) {
+ };
+ GoogleMap.prototype.setTilt = function (tiltLevel) {
+ };
+ GoogleMap.prototype.animateCamera = function (animateCameraOptions) {
+ };
+ GoogleMap.prototype.moveCamera = function (cameraPosition) {
+ };
+ GoogleMap.prototype.setMyLocationEnabled = function (enabled) {
+ };
+ GoogleMap.prototype.setIndoorEnabled = function (enabled) {
+ };
+ GoogleMap.prototype.setTrafficEnabled = function (enabled) {
+ };
+ GoogleMap.prototype.setCompassEnabled = function (enabled) {
+ };
+ GoogleMap.prototype.setAllGesturesEnabled = function (enabled) {
+ };
+ GoogleMap.prototype.addMarker = function (options) {
+ var _this = this;
+ return new Promise(function (resolve, reject) {
+ _this._objectInstance.addMarker(options, function (marker) {
+ if (marker)
+ resolve(new GoogleMapsMarker(marker));
+ else
+ reject();
+ });
+ });
+ };
+ GoogleMap.prototype.addCircle = function (options) {
+ var _this = this;
+ return new Promise(function (resolve, reject) {
+ _this._objectInstance.addCircle(options, function (circle) {
+ if (circle)
+ resolve(new GoogleMapsCircle(circle));
+ else
+ reject();
+ });
+ });
+ };
+ GoogleMap.prototype.addPolygon = function (options) {
+ var _this = this;
+ return new Promise(function (resolve, reject) {
+ _this._objectInstance.addPolygon(options, function (polygon) {
+ if (polygon)
+ resolve(new GoogleMapsPolygon(polygon));
+ else
+ reject();
+ });
+ });
+ };
+ GoogleMap.prototype.addPolyline = function (options) {
+ var _this = this;
+ return new Promise(function (resolve, reject) {
+ _this._objectInstance.addPolyline(options, function (polyline) {
+ if (polyline)
+ resolve(new GoogleMapsPolyline(polyline));
+ else
+ reject();
+ });
+ });
+ };
+ GoogleMap.prototype.addTileOverlay = function (options) {
+ var _this = this;
+ return new Promise(function (resolve, reject) {
+ _this._objectInstance.addTileOverlay(options, function (tileOverlay) {
+ if (tileOverlay)
+ resolve(new GoogleMapsTileOverlay(tileOverlay));
+ else
+ reject();
+ });
+ });
+ };
+ GoogleMap.prototype.addGroundOverlay = function (options) {
+ var _this = this;
+ return new Promise(function (resolve, reject) {
+ _this._objectInstance.addTileOverlay(options, function (groundOverlay) {
+ if (groundOverlay)
+ resolve(new GoogleMapsGroundOverlay(groundOverlay));
+ else
+ reject();
+ });
+ });
+ };
+ GoogleMap.prototype.addKmlOverlay = function (options) {
+ var _this = this;
+ return new Promise(function (resolve, reject) {
+ _this._objectInstance.addTileOverlay(options, function (kmlOverlay) {
+ if (kmlOverlay)
+ resolve(new GoogleMapsKmlOverlay(kmlOverlay));
+ else
+ reject();
+ });
+ });
+ };
+ GoogleMap.prototype.setDiv = function (domNode) {
+ };
+ GoogleMap.prototype.setVisible = function (visible) {
+ };
+ GoogleMap.prototype.setOptions = function (options) {
+ };
+ GoogleMap.prototype.setBackgroundColor = function (backgroundColor) {
+ };
+ GoogleMap.prototype.setPadding = function (top, right, bottom, left) {
+ };
+ GoogleMap.prototype.clear = function () {
+ };
+ GoogleMap.prototype.refreshLayout = function () {
+ };
+ GoogleMap.prototype.fromLatLngToPoint = function (latLng, point) {
+ return;
+ };
+ GoogleMap.prototype.fromPointToLatLng = function (point, latLng) {
+ return;
+ };
+ GoogleMap.prototype.toDataURL = function () {
+ return;
+ };
+ GoogleMap.prototype.remove = function () {
+ };
+ GoogleMap.prototype.panBy = function () {
+ };
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "setDebuggable", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "setClickable", null);
+ __decorate([
+ plugin_2.CordovaInstance()
+ ], GoogleMap.prototype, "getCameraPosition", null);
+ __decorate([
+ plugin_2.CordovaInstance()
+ ], GoogleMap.prototype, "getMyLocation", null);
+ __decorate([
+ plugin_2.CordovaInstance()
+ ], GoogleMap.prototype, "getVisibleRegion", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "showDialog", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "closeDialog", null);
+ __decorate([
+ plugin_2.CordovaInstance()
+ ], GoogleMap.prototype, "getLicenseInfo", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "setCenter", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "setZoom", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "setMapTypeId", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "setTilt", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "animateCamera", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "moveCamera", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "setMyLocationEnabled", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "setIndoorEnabled", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "setTrafficEnabled", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "setCompassEnabled", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "setAllGesturesEnabled", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "setDiv", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "setVisible", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "setOptions", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "setBackgroundColor", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "setPadding", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "clear", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "refreshLayout", null);
+ __decorate([
+ plugin_2.CordovaInstance()
+ ], GoogleMap.prototype, "fromLatLngToPoint", null);
+ __decorate([
+ plugin_2.CordovaInstance()
+ ], GoogleMap.prototype, "fromPointToLatLng", null);
+ __decorate([
+ plugin_2.CordovaInstance()
+ ], GoogleMap.prototype, "toDataURL", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "remove", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMap.prototype, "panBy", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], GoogleMap, "isAvailable", null);
+ GoogleMap = __decorate([
+ plugin_1.Plugin({
+ pluginRef: 'plugin.google.maps.Map',
+ plugin: 'cordova-plugin-googlemaps',
+ repo: 'https://github.com/mapsplugin/cordova-plugin-googlemaps'
+ })
+ ], GoogleMap);
+ return GoogleMap;
+}());
+exports.GoogleMap = GoogleMap;
+var GoogleMapsMarker = (function () {
+ function GoogleMapsMarker(_objectInstance) {
+ this._objectInstance = _objectInstance;
+ }
+ GoogleMapsMarker.prototype.addEventListener = function (event) {
+ var _this = this;
+ return new Observable_1.Observable(function (observer) {
+ var cb = function (data) {
+ observer.next(data);
+ };
+ _this._objectInstance.addEventListener(event, cb);
+ return function () { return _this._objectInstance.removeEventListener(event, cb); };
+ });
+ };
+ GoogleMapsMarker.prototype.isVisible = function () {
+ return;
+ };
+ GoogleMapsMarker.prototype.setVisible = function (visible) {
+ };
+ GoogleMapsMarker.prototype.getHashCode = function () {
+ return;
+ };
+ GoogleMapsMarker.prototype.remove = function () {
+ };
+ GoogleMapsMarker.prototype.setOpacity = function (alpha) {
+ };
+ GoogleMapsMarker.prototype.getOpacity = function () {
+ return;
+ };
+ GoogleMapsMarker.prototype.setZIndex = function () {
+ };
+ GoogleMapsMarker.prototype.setIconAnchor = function (x, y) {
+ };
+ GoogleMapsMarker.prototype.setInfoWindowAnchor = function (x, y) {
+ };
+ GoogleMapsMarker.prototype.setDraggable = function (draggable) {
+ };
+ GoogleMapsMarker.prototype.isDraggable = function () {
+ return;
+ };
+ GoogleMapsMarker.prototype.setFlat = function (flat) {
+ return;
+ };
+ GoogleMapsMarker.prototype.setIcon = function (icon) {
+ };
+ GoogleMapsMarker.prototype.setTitle = function (title) {
+ };
+ GoogleMapsMarker.prototype.getTitle = function () {
+ return;
+ };
+ GoogleMapsMarker.prototype.setSnippet = function (snippet) {
+ };
+ GoogleMapsMarker.prototype.getSnippet = function () {
+ return;
+ };
+ GoogleMapsMarker.prototype.setRotation = function (rotation) {
+ };
+ GoogleMapsMarker.prototype.getRotation = function () {
+ return;
+ };
+ GoogleMapsMarker.prototype.showInfoWindow = function () {
+ return;
+ };
+ GoogleMapsMarker.prototype.hideInfoWindow = function () {
+ return;
+ };
+ GoogleMapsMarker.prototype.setPosition = function (latLng) {
+ };
+ GoogleMapsMarker.prototype.getPosition = function () {
+ return;
+ };
+ GoogleMapsMarker.prototype.getMap = function () {
+ return;
+ };
+ GoogleMapsMarker.prototype.setAnimation = function (animation) {
+ };
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "isVisible", null);
+ __decorate([
+ plugin_2.CordovaInstance()
+ ], GoogleMapsMarker.prototype, "setVisible", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "getHashCode", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "remove", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "setOpacity", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "getOpacity", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "setZIndex", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "setIconAnchor", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "setInfoWindowAnchor", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "setDraggable", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "isDraggable", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "setFlat", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "setIcon", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "setTitle", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "getTitle", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "setSnippet", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "getSnippet", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "setRotation", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "getRotation", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "showInfoWindow", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "hideInfoWindow", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "setPosition", null);
+ __decorate([
+ plugin_2.CordovaInstance()
+ ], GoogleMapsMarker.prototype, "getPosition", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "getMap", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsMarker.prototype, "setAnimation", null);
+ return GoogleMapsMarker;
+}());
+exports.GoogleMapsMarker = GoogleMapsMarker;
+var GoogleMapsCircle = (function () {
+ function GoogleMapsCircle(_objectInstance) {
+ this._objectInstance = _objectInstance;
+ }
+ GoogleMapsCircle.prototype.addEventListener = function (event) {
+ var _this = this;
+ return new Observable_1.Observable(function (observer) {
+ var cb = function (data) { return observer.next(data); };
+ _this._objectInstance.addEventListener(event, cb);
+ return function () { return _this._objectInstance.removeEventListener(event, cb); };
+ });
+ };
+ GoogleMapsCircle.prototype.getCenter = function () {
+ return;
+ };
+ GoogleMapsCircle.prototype.getRadius = function () {
+ return;
+ };
+ GoogleMapsCircle.prototype.getStrokeColor = function () {
+ return;
+ };
+ GoogleMapsCircle.prototype.getVisible = function () {
+ return;
+ };
+ GoogleMapsCircle.prototype.getZIndex = function () {
+ return;
+ };
+ GoogleMapsCircle.prototype.remove = function () {
+ };
+ GoogleMapsCircle.prototype.setCenter = function (latLng) {
+ };
+ GoogleMapsCircle.prototype.setFillColor = function (fillColor) {
+ };
+ GoogleMapsCircle.prototype.setStrokeColor = function (strokeColor) {
+ };
+ GoogleMapsCircle.prototype.setStrokeWidth = function (strokeWidth) {
+ };
+ GoogleMapsCircle.prototype.setVisible = function (visible) {
+ };
+ GoogleMapsCircle.prototype.setZIndex = function (zIndex) {
+ };
+ GoogleMapsCircle.prototype.setRadius = function (radius) {
+ };
+ GoogleMapsCircle.prototype.getMap = function () {
+ return;
+ };
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsCircle.prototype, "getCenter", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsCircle.prototype, "getRadius", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsCircle.prototype, "getStrokeColor", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsCircle.prototype, "getVisible", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsCircle.prototype, "getZIndex", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsCircle.prototype, "remove", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsCircle.prototype, "setCenter", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsCircle.prototype, "setFillColor", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsCircle.prototype, "setStrokeColor", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsCircle.prototype, "setStrokeWidth", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsCircle.prototype, "setVisible", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsCircle.prototype, "setZIndex", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsCircle.prototype, "setRadius", null);
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsCircle.prototype, "getMap", null);
+ return GoogleMapsCircle;
+}());
+exports.GoogleMapsCircle = GoogleMapsCircle;
+var GoogleMapsPolyline = (function () {
+ function GoogleMapsPolyline(_objectInstance) {
+ this._objectInstance = _objectInstance;
+ }
+ GoogleMapsPolyline.prototype.addEventListener = function (event) {
+ var _this = this;
+ return new Observable_1.Observable(function (observer) {
+ var cb = function (data) { return observer.next(data); };
+ _this._objectInstance.addEventListener(event, cb);
+ return function () { return _this._objectInstance.removeEventListener(event, cb); };
+ });
+ };
+ GoogleMapsPolyline.prototype.getPoints = function () {
+ return;
+ };
+ GoogleMapsPolyline.prototype.getCOlor = function () {
+ return;
+ };
+ GoogleMapsPolyline.prototype.getWidth = function () {
+ return;
+ };
+ GoogleMapsPolyline.prototype.getGeodesic = function () {
+ return;
+ };
+ GoogleMapsPolyline.prototype.getZIndex = function () {
+ return;
+ };
+ GoogleMapsPolyline.prototype.remove = function () {
+ };
+ GoogleMapsPolyline.prototype.setPoints = function (points) {
+ };
+ GoogleMapsPolyline.prototype.setColor = function (color) {
+ };
+ GoogleMapsPolyline.prototype.setWidth = function (width) {
+ };
+ GoogleMapsPolyline.prototype.setVisible = function (visible) {
+ };
+ GoogleMapsPolyline.prototype.setZIndex = function (zIndex) {
+ };
+ GoogleMapsPolyline.prototype.setGeoDesic = function (geoDesic) {
+ };
+ GoogleMapsPolyline.prototype.getMap = function () {
+ return;
+ };
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolyline.prototype, "getPoints", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolyline.prototype, "getCOlor", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolyline.prototype, "getWidth", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolyline.prototype, "getGeodesic", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolyline.prototype, "getZIndex", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolyline.prototype, "remove", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolyline.prototype, "setPoints", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolyline.prototype, "setColor", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolyline.prototype, "setWidth", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolyline.prototype, "setVisible", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolyline.prototype, "setZIndex", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolyline.prototype, "setGeoDesic", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolyline.prototype, "getMap", null);
+ return GoogleMapsPolyline;
+}());
+exports.GoogleMapsPolyline = GoogleMapsPolyline;
+var GoogleMapsPolygon = (function () {
+ function GoogleMapsPolygon(_objectInstance) {
+ this._objectInstance = _objectInstance;
+ }
+ GoogleMapsPolygon.prototype.addEventListener = function (event) {
+ var _this = this;
+ return new Observable_1.Observable(function (observer) {
+ var cb = function (data) { return observer.next(data); };
+ _this._objectInstance.addEventListener(event, cb);
+ return function () { return _this._objectInstance.removeEventListener(event, cb); };
+ });
+ };
+ GoogleMapsPolygon.prototype.getPoints = function () {
+ return;
+ };
+ GoogleMapsPolygon.prototype.getStrokeColor = function () {
+ return;
+ };
+ GoogleMapsPolygon.prototype.getFillColor = function () {
+ return;
+ };
+ GoogleMapsPolygon.prototype.getStrokeWidth = function () {
+ return;
+ };
+ GoogleMapsPolygon.prototype.getGeodesic = function () {
+ return;
+ };
+ GoogleMapsPolygon.prototype.getVisible = function () {
+ return;
+ };
+ GoogleMapsPolygon.prototype.getZIndex = function () {
+ return;
+ };
+ GoogleMapsPolygon.prototype.remove = function () {
+ };
+ GoogleMapsPolygon.prototype.setPoints = function (points) {
+ };
+ GoogleMapsPolygon.prototype.setStrokeColor = function (strokeColor) {
+ };
+ GoogleMapsPolygon.prototype.setFillColor = function (fillColor) {
+ };
+ GoogleMapsPolygon.prototype.setStrokeWidth = function (strokeWidth) {
+ };
+ GoogleMapsPolygon.prototype.setVisible = function (visible) {
+ };
+ GoogleMapsPolygon.prototype.setZIndex = function (zIndex) {
+ };
+ GoogleMapsPolygon.prototype.setGeodesic = function (geodesic) {
+ };
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolygon.prototype, "getPoints", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolygon.prototype, "getStrokeColor", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolygon.prototype, "getFillColor", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolygon.prototype, "getStrokeWidth", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolygon.prototype, "getGeodesic", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolygon.prototype, "getVisible", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolygon.prototype, "getZIndex", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolygon.prototype, "remove", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolygon.prototype, "setPoints", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolygon.prototype, "setStrokeColor", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolygon.prototype, "setFillColor", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolygon.prototype, "setStrokeWidth", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolygon.prototype, "setVisible", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolygon.prototype, "setZIndex", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsPolygon.prototype, "setGeodesic", null);
+ return GoogleMapsPolygon;
+}());
+exports.GoogleMapsPolygon = GoogleMapsPolygon;
+var GoogleMapsTileOverlay = (function () {
+ function GoogleMapsTileOverlay(_objectInstance) {
+ this._objectInstance = _objectInstance;
+ }
+ GoogleMapsTileOverlay.prototype.getVisible = function () {
+ return;
+ };
+ GoogleMapsTileOverlay.prototype.setVisible = function (visible) {
+ };
+ GoogleMapsTileOverlay.prototype.getFadeIn = function () {
+ return;
+ };
+ GoogleMapsTileOverlay.prototype.setFadeIn = function (fadeIn) {
+ };
+ GoogleMapsTileOverlay.prototype.getZIndex = function () {
+ return;
+ };
+ GoogleMapsTileOverlay.prototype.setZIndex = function (zIndex) {
+ };
+ GoogleMapsTileOverlay.prototype.getOpacity = function () {
+ return;
+ };
+ GoogleMapsTileOverlay.prototype.setOpacity = function (opacity) {
+ };
+ GoogleMapsTileOverlay.prototype.clearTileCache = function () {
+ };
+ GoogleMapsTileOverlay.prototype.remove = function () {
+ };
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsTileOverlay.prototype, "getVisible", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsTileOverlay.prototype, "setVisible", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsTileOverlay.prototype, "getFadeIn", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsTileOverlay.prototype, "setFadeIn", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsTileOverlay.prototype, "getZIndex", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsTileOverlay.prototype, "setZIndex", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsTileOverlay.prototype, "getOpacity", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsTileOverlay.prototype, "setOpacity", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsTileOverlay.prototype, "clearTileCache", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsTileOverlay.prototype, "remove", null);
+ return GoogleMapsTileOverlay;
+}());
+exports.GoogleMapsTileOverlay = GoogleMapsTileOverlay;
+var GoogleMapsGroundOverlay = (function () {
+ function GoogleMapsGroundOverlay(_objectInstance) {
+ this._objectInstance = _objectInstance;
+ }
+ GoogleMapsGroundOverlay.prototype.setBearing = function (bearing) {
+ };
+ GoogleMapsGroundOverlay.prototype.getBearing = function () {
+ return;
+ };
+ GoogleMapsGroundOverlay.prototype.setOpacity = function (opacity) {
+ };
+ GoogleMapsGroundOverlay.prototype.getOpacity = function () {
+ return;
+ };
+ GoogleMapsGroundOverlay.prototype.setVisible = function (visible) {
+ };
+ GoogleMapsGroundOverlay.prototype.getVisible = function () {
+ return;
+ };
+ GoogleMapsGroundOverlay.prototype.setImage = function (image) {
+ };
+ ;
+ GoogleMapsGroundOverlay.prototype.remove = function () {
+ };
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsGroundOverlay.prototype, "setBearing", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsGroundOverlay.prototype, "getBearing", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsGroundOverlay.prototype, "setOpacity", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsGroundOverlay.prototype, "getOpacity", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsGroundOverlay.prototype, "setVisible", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsGroundOverlay.prototype, "getVisible", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsGroundOverlay.prototype, "setImage", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsGroundOverlay.prototype, "remove", null);
+ return GoogleMapsGroundOverlay;
+}());
+exports.GoogleMapsGroundOverlay = GoogleMapsGroundOverlay;
+var GoogleMapsKmlOverlay = (function () {
+ function GoogleMapsKmlOverlay(_objectInstance) {
+ this._objectInstance = _objectInstance;
+ }
+ GoogleMapsKmlOverlay.prototype.remove = function () {
+ };
+ GoogleMapsKmlOverlay.prototype.getOverlays = function () {
+ return;
+ };
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsKmlOverlay.prototype, "remove", null);
+ __decorate([
+ plugin_2.CordovaInstance({ sync: true })
+ ], GoogleMapsKmlOverlay.prototype, "getOverlays", null);
+ return GoogleMapsKmlOverlay;
+}());
+exports.GoogleMapsKmlOverlay = GoogleMapsKmlOverlay;
+var GoogleMapsLatLng = (function () {
+ function GoogleMapsLatLng(lat, lng) {
+ this.lat = lat;
+ this.lng = lng;
+ this._objectInstance = new plugin.google.maps.LatLng(lat, lng);
+ }
+ GoogleMapsLatLng.prototype.equals = function (other) {
+ return this.lat === other.lat && this.lng === other.lng;
+ };
+ GoogleMapsLatLng.prototype.toString = function () {
+ return;
+ };
+ GoogleMapsLatLng.prototype.toUrlValue = function (precision) {
+ precision = precision || 6;
+ return this.lat.toFixed(precision) + ',' + this.lng.toFixed(precision);
+ };
+ __decorate([
+ plugin_2.CordovaInstance({
+ sync: true
+ })
+ ], GoogleMapsLatLng.prototype, "toString", null);
+ return GoogleMapsLatLng;
+}());
+exports.GoogleMapsLatLng = GoogleMapsLatLng;
+
+},{"./plugin":48,"rxjs/Observable":63}],39:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Hotspot
+ * @description
+ * @usage
+ * ```js
+ * import {Hotspot, Network} from 'ionic-native';
+ *
+ * ...
+ * Hotspot.scanWifi().then((networks: Array) => {
+ * console.log(networks);
+ * });
+ * ...
+ *
+ * ```
+ */
+var Hotspot = (function () {
+ function Hotspot() {
+ }
+ Hotspot.isAvailable = function () { return; };
+ Hotspot.toggleWifi = function () { return; };
+ /**
+ * Configures and starts hotspot with SSID and Password
+ *
+ * @param {string} SSID - SSID of your new Access Point
+ * @param {string} mode - encryption mode (Open, WEP, WPA, WPA_PSK)
+ * @param {string} password - password for your new Access Point
+ *
+ * @return {Promise} - Promise to call once hotspot is started, or reject upon failure
+ */
+ Hotspot.createHotspot = function (ssid, mode, password) { return; };
+ /**
+ * Turns on Access Point
+ *
+ * @return {Promise} - true if AP is started
+ */
+ Hotspot.startHotspot = function () { return; };
+ /**
+ * Configures hotspot with SSID and Password
+ *
+ * @param {string} SSID - SSID of your new Access Point
+ * @param {string} mode - encryption mode (Open, WEP, WPA, WPA_PSK)
+ * @param {string} password - password for your new Access Point
+ *
+ * @return {Promise} - Promise to call when hotspot is configured, or reject upon failure
+ */
+ Hotspot.configureHotspot = function (ssid, mode, password) { return; };
+ /**
+ * Turns off Access Point
+ *
+ * @return {Promise} - Promise to turn off the hotspot, true on success, false on failure
+ */
+ Hotspot.stopHotspot = function () { return; };
+ /**
+ * Checks if hotspot is enabled
+ *
+ * @return {Promise} - Promise that hotspot is enabled, rejected if it is not enabled
+ */
+ Hotspot.isHotspotEnabled = function () { return; };
+ Hotspot.getAllHotspotDevices = function () { return; };
+ /**
+ * Connect to a WiFi network
+ *
+ * @param {string} ssid
+ * SSID to connect
+ * @param {string} password
+ * password to use
+ *
+ * @return {Promise}
+ * Promise that connection to the WiFi network was successfull, rejected if unsuccessful
+ */
+ Hotspot.connectToWifi = function (ssid, password) { return; };
+ /**
+ * Connect to a WiFi network
+ *
+ * @param {string} ssid
+ * SSID to connect
+ * @param {string} password
+ * Password to use
+ * @param {string} authentication
+ * Authentication modes to use (LEAP, SHARED, OPEN)
+ * @param {string[]} encryption
+ * Encryption modes to use (CCMP, TKIP, WEP104, WEP40)
+ *
+ * @return {Promise}
+ * Promise that connection to the WiFi network was successfull, rejected if unsuccessful
+ */
+ Hotspot.connectToWifiAuthEncrypt = function (ssid, password, authentication, encryption) { return; };
+ /**
+ * Add a WiFi network
+ *
+ * @param {string} ssid
+ * SSID of network
+ * @param {string} mode
+ * Authentication mode of (Open, WEP, WPA, WPA_PSK)
+ * @param {string} password
+ * Password for network
+ *
+ * @return {Promise}
+ * Promise that adding the WiFi network was successfull, rejected if unsuccessful
+ */
+ Hotspot.addWifiNetwork = function (ssid, mode, password) { return; };
+ /**
+ * Remove a WiFi network
+ *
+ * @param {string} ssid
+ * SSID of network
+ *
+ * @return {Promise}
+ * Promise that removing the WiFi network was successfull, rejected if unsuccessful
+ */
+ Hotspot.removeWifiNetwork = function (ssid) { return; };
+ Hotspot.isConnectedToInternet = function () { return; };
+ Hotspot.isConnectedToInternetViaWifi = function () { return; };
+ Hotspot.isWifiOn = function () { return; };
+ Hotspot.isWifiSupported = function () { return; };
+ Hotspot.isWifiDirectSupported = function () { return; };
+ Hotspot.scanWifi = function () { return; };
+ Hotspot.scanWifiByLevel = function () { return; };
+ Hotspot.startWifiPeriodicallyScan = function (interval, duration) { return; };
+ Hotspot.stopWifiPeriodicallyScan = function () { return; };
+ Hotspot.getNetConfig = function () { return; };
+ Hotspot.getConnectionInfo = function () { return; };
+ Hotspot.pingHost = function (ip) { return; };
+ /**
+ * Gets MAC Address associated with IP Address from ARP File
+ *
+ * @param {string} ip - IP Address that you want the MAC Address of
+ *
+ * @return {Promise} - A Promise for the MAC Address
+ */
+ Hotspot.getMacAddressOfHost = function (ip) { return; };
+ /**
+ * Checks if IP is live using DNS
+ *
+ * @param {string} ip - IP Address you want to test
+ *
+ * @return {Promise} - A Promise for whether the IP Address is reachable
+ */
+ Hotspot.isDnsLive = function (ip) { return; };
+ /**
+ * Checks if IP is live using socket And PORT
+ *
+ * @param {string} ip - IP Address you want to test
+ *
+ * @return {Promise} - A Promise for whether the IP Address is reachable
+ */
+ Hotspot.isPortLive = function (ip) { return; };
+ /**
+ * Checks if device is rooted
+ *
+ * @return {Promise} - A Promise for whether the device is rooted
+ */
+ Hotspot.isRooted = function () { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "isAvailable", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "toggleWifi", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "createHotspot", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "startHotspot", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "configureHotspot", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "stopHotspot", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "isHotspotEnabled", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "getAllHotspotDevices", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "connectToWifi", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "connectToWifiAuthEncrypt", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "addWifiNetwork", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "removeWifiNetwork", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "isConnectedToInternet", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "isConnectedToInternetViaWifi", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "isWifiOn", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "isWifiSupported", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "isWifiDirectSupported", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "scanWifi", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "scanWifiByLevel", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "startWifiPeriodicallyScan", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "stopWifiPeriodicallyScan", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "getNetConfig", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "getConnectionInfo", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "pingHost", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "getMacAddressOfHost", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "isDnsLive", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "isPortLive", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Hotspot, "isRooted", null);
+ Hotspot = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-hotspot',
+ pluginRef: 'cordova.plugins.hotspot',
+ repo: 'https://github.com/hypery2k/cordova-hotspot-plugin',
+ platforms: ['Android']
+ })
+ ], Hotspot);
+ return Hotspot;
+}());
+exports.Hotspot = Hotspot;
+
+},{"./plugin":48}],40:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Image Picker
+ * @description
+ * Cordova Plugin For Multiple Image Selection
+ *
+ * Requires Cordova plugin: `cordova-plugin-image-picker`.
+ * For more info, please see the https://github.com/wymsee/cordova-imagePicker
+ *
+ * @usage
+ * ```js
+ * import {ImagePicker} from 'ionic-native';
+ *
+ *
+ *
+ * ImagePicker.getPictures(options).then((results) => {
+ * for (var i = 0; i < results.length; i++) {
+ * console.log('Image URI: ' + results[i]);
+ * }
+ * }, (err) => {
+ * });
+ * ```
+ */
+var ImagePicker = (function () {
+ function ImagePicker() {
+ }
+ /**
+ * Pick pictures from the library.
+ * @param {ImagePickerOptions} options
+ * @return Returns a Promise that resolves the image file URI
+ * otherwise rejects with an error.
+ */
+ ImagePicker.getPictures = function (options) { return; };
+ __decorate([
+ plugin_1.Cordova({
+ callbackOrder: 'reverse'
+ })
+ ], ImagePicker, "getPictures", null);
+ ImagePicker = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-image-picker',
+ pluginRef: 'window.imagePicker',
+ repo: 'https://github.com/wymsee/cordova-imagePicker'
+ })
+ ], ImagePicker);
+ return ImagePicker;
+}());
+exports.ImagePicker = ImagePicker;
+
+},{"./plugin":48}],41:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+var InAppBrowser = (function () {
+ function InAppBrowser() {
+ }
+ /**
+ * Opens a URL in a new InAppBrowser instance, the current browser instance, or the system browser.
+ * @param url The URL to load.
+ * @param target The target in which to load the URL, an optional parameter that defaults to _self.
+ * @param options Options for the InAppBrowser. Optional, defaulting to: location=yes.
+ * The options string must not contain any blank space, and each feature's
+ * name/value pairs must be separated by a comma. Feature names are case insensitive.
+ */
+ InAppBrowser.open = function (url, target, options) { return; };
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], InAppBrowser, "open", null);
+ InAppBrowser = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-inappbrowser',
+ pluginRef: 'cordova.InAppBrowser'
+ })
+ ], InAppBrowser);
+ return InAppBrowser;
+}());
+exports.InAppBrowser = InAppBrowser;
+
+},{"./plugin":48}],42:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Insomnia
+ * @description
+ * Prevent the screen of the mobile device from falling asleep.
+ *
+ * @usage
+ * ```js
+ * import {Insomnia} from 'ionic-native';
+ *
+ * Insomnia.keepAwake()
+ * .then(
+ * () => console.log('success'),
+ * () => console.log('error')
+ * );
+ *
+ * Insomnia.allowSleepAgain()
+ * .then(
+ * () => console.log('success'),
+ * () => console.log('error')
+ * );
+ * ```
+ *
+ */
+var Insomnia = (function () {
+ function Insomnia() {
+ }
+ /**
+ * Keeps awake the application
+ * @returns {Promise}
+ */
+ Insomnia.keepAwake = function () { return; };
+ /**
+ * Allows the application to sleep again
+ * @returns {Promise}
+ */
+ Insomnia.allowSleepAgain = function () { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], Insomnia, "keepAwake", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Insomnia, "allowSleepAgain", null);
+ Insomnia = __decorate([
+ plugin_1.Plugin({
+ plugin: 'https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin.git',
+ pluginRef: 'plugins.insomnia',
+ repo: 'https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin',
+ platforms: ['Android', 'iOS', 'Windows Phone 8']
+ })
+ ], Insomnia);
+ return Insomnia;
+}());
+exports.Insomnia = Insomnia;
+
+},{"./plugin":48}],43:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Keyboard
+ * @description
+ * @usage
+ * ```js
+ * import {Keyboard} from 'ionic-native';
+ *
+ *
+ *
+ * ```
+ */
+var Keyboard = (function () {
+ function Keyboard() {
+ }
+ /**
+ * Hide the keyboard accessory bar with the next, previous and done buttons.
+ * @param hide {boolean}
+ */
+ Keyboard.hideKeyboardAccessoryBar = function (hide) {
+ console.log('hideKeyboardAccessoryBar method has been removed temporarily.');
+ };
+ /**
+ * Force keyboard to be shown.
+ */
+ Keyboard.show = function () { };
+ /**
+ * Close the keyboard if open.
+ */
+ Keyboard.close = function () { };
+ /**
+ * Prevents the native UIScrollView from moving when an input is focused.
+ * @param disable
+ */
+ Keyboard.disableScroll = function (disable) { };
+ /**
+ * Creates an observable that notifies you when the keyboard is shown. Unsubscribe to observable to cancel event watch.
+ */
+ Keyboard.onKeyboardShow = function () { return; };
+ /**
+ * Creates an observable that notifies you when the keyboard is hidden. Unsubscribe to observable to cancel event watch.
+ */
+ Keyboard.onKeyboardHide = function () { return; };
+ __decorate([
+ plugin_1.Cordova({
+ sync: true,
+ platforms: ['Android', 'BlackBerry 10', 'Windows']
+ })
+ ], Keyboard, "show", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true,
+ platforms: ['iOS', 'Android', 'BlackBerry 10', 'Windows']
+ })
+ ], Keyboard, "close", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true,
+ platforms: ['iOS', 'Windows']
+ })
+ ], Keyboard, "disableScroll", null);
+ __decorate([
+ plugin_1.Cordova({
+ eventObservable: true,
+ event: 'native.keyboardshow',
+ platforms: ['iOS', 'Android', 'BlackBerry 10', 'Windows']
+ })
+ ], Keyboard, "onKeyboardShow", null);
+ __decorate([
+ plugin_1.Cordova({
+ eventObservable: true,
+ event: 'native.keyboardhide',
+ platforms: ['iOS', 'Android', 'BlackBerry 10', 'Windows']
+ })
+ ], Keyboard, "onKeyboardHide", null);
+ Keyboard = __decorate([
+ plugin_1.Plugin({
+ plugin: 'ionic-plugin-keyboard',
+ pluginRef: 'cordova.plugins.Keyboard',
+ repo: 'https://github.com/driftyco/ionic-plugin-keyboard'
+ })
+ ], Keyboard);
+ return Keyboard;
+}());
+exports.Keyboard = Keyboard;
+
+},{"./plugin":48}],44:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Launch Navigator
+ * @description
+ * Requires Cordova plugin: uk.co.workingedge.phonegap.plugin.launchnavigator. For more info, please see the [LaunchNavigator plugin docs](https://github.com/dpa99c/phonegap-launch-navigator).
+ *
+ * @usage
+ * ```js
+ * import {LaunchNavigator} from 'ionic-native';
+ *
+ *
+ *
+ * LaunchNavigator.navigate("Toronto, ON", "London, ON")
+ * .then(
+ * success => console.log("Launched navigator"),
+ * error => console.log("Error launching navigator", error)
+ * );
+ * ```
+ */
+var LaunchNavigator = (function () {
+ function LaunchNavigator() {
+ }
+ /**
+ * Launches navigator app
+ * @param destination Location name or coordinates
+ * @param start Location name or coordinates
+ * @param options
+ * @returns {Promise}
+ */
+ LaunchNavigator.navigate = function (destination, start, options) {
+ if (start === void 0) { start = null; }
+ return;
+ };
+ __decorate([
+ plugin_1.Cordova({
+ successIndex: 2,
+ errorIndex: 3
+ })
+ ], LaunchNavigator, "navigate", null);
+ LaunchNavigator = __decorate([
+ plugin_1.Plugin({
+ plugin: 'uk.co.workingedge.phonegap.plugin.launchnavigator',
+ pluginRef: 'launchnavigator',
+ repo: 'https://github.com/dpa99c/phonegap-launch-navigator.git'
+ })
+ ], LaunchNavigator);
+ return LaunchNavigator;
+}());
+exports.LaunchNavigator = LaunchNavigator;
+
+},{"./plugin":48}],45:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Local Notifications
+ * @description
+ * This plugin allows you to display local notifications on the device
+ *
+ * @usage
+ * ```ts
+ * import {LocalNotifications} from 'ionic-native';
+ *
+ *
+ *
+ * // Schedule a single notification
+ * LocalNotifications.schedule({
+ * id: 1,
+ * text: "Single Notification",
+ * sound: isAndroid? 'file://sound.mp3': 'file://beep.caf'
+ * data: { secret: key }
+ * });
+ *
+ *
+ * // Schedule multiple notifications
+ * LocalNotifications.schedule([{
+ * id: 1,
+ * text: "Multi Notification 1",
+ * sound: isAndroid ? 'file://sound.mp3': 'file://beep.caf',
+ * data: { secret:key }
+ * },{
+ * id: 2,
+ * title: "Local Notification Example",
+ * text: "Multi Notification 2",
+ * icon: "http://example.com/icon.png"
+ * }]);
+ *
+ *
+ * // Schedule delayed notification
+ * LocalNotifications.schedule({
+ * text: "Delayed Notification",
+ * at: new Date(new Date().getTime() + 3600),
+ * led: "FF0000",
+ * sound: null
+ * });
+ * ```
+ *
+ */
+var LocalNotifications = (function () {
+ function LocalNotifications() {
+ }
+ /**
+ * Schedules a single or multiple notifications
+ * @param options
+ */
+ LocalNotifications.schedule = function (options) { };
+ /**
+ * Updates a previously scheduled notification. Must include the id in the options parameter.
+ * @param options
+ */
+ LocalNotifications.update = function (options) { };
+ /**
+ * Clears single or multiple notifications
+ * @param notificationId A single notification id, or an array of notification ids.
+ */
+ LocalNotifications.clear = function (notificationId) { return; };
+ /**
+ * Clears all notifications
+ */
+ LocalNotifications.clearAll = function () { return; };
+ /**
+ * Cancels single or multiple notifications
+ * @param notificationId A single notification id, or an array of notification ids.
+ */
+ LocalNotifications.cancel = function (notificationId) { return; };
+ /**
+ * Cancels all notifications
+ */
+ LocalNotifications.cancelAll = function () { return; };
+ /**
+ * Checks presence of a notification
+ * @param notificationId
+ */
+ LocalNotifications.isPresent = function (notificationId) { return; };
+ /**
+ * Checks is a notification is scheduled
+ * @param notificationId
+ */
+ LocalNotifications.isScheduled = function (notificationId) { return; };
+ /**
+ * Checks if a notification is triggered
+ * @param notificationId
+ */
+ LocalNotifications.isTriggered = function (notificationId) { return; };
+ /**
+ * Get all the notification ids
+ */
+ LocalNotifications.getAllIds = function () { return; };
+ /**
+ * Get the ids of triggered notifications
+ */
+ LocalNotifications.getTriggeredIds = function () { return; };
+ /**
+ * Get the ids of scheduled notifications
+ */
+ LocalNotifications.getScheduledIds = function () { return; };
+ /**
+ * Get a notification object
+ * @param notificationId The id of the notification to get
+ */
+ LocalNotifications.get = function (notificationId) { return; };
+ /**
+ * Get a scheduled notification object
+ * @param notificationId The id of the notification to get
+ */
+ LocalNotifications.getScheduled = function (notificationId) { return; };
+ /**
+ * Get a triggered notification object
+ * @param notificationId The id of the notification to get
+ */
+ LocalNotifications.getTriggered = function (notificationId) { return; };
+ /**
+ * Get all notification objects
+ */
+ LocalNotifications.getAll = function () { return; };
+ /**
+ * Get all scheduled notification objects
+ */
+ LocalNotifications.getAllScheduled = function () { return; };
+ /**
+ * Get all triggered notification objects
+ */
+ LocalNotifications.getAllTriggered = function () { return; };
+ /**
+ * Sets a callback for a specific event
+ * @param eventName The name of the event. Available events: schedule, trigger, click, update, clear, clearall, cancel, cancelall
+ * @param callback Call back function. All events return notification and state parameter. clear and clearall return state parameter only.
+ */
+ LocalNotifications.on = function (eventName, callback) { };
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], LocalNotifications, "schedule", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], LocalNotifications, "update", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], LocalNotifications, "clear", null);
+ __decorate([
+ plugin_1.Cordova({
+ successIndex: 0,
+ errorIndex: 2
+ })
+ ], LocalNotifications, "clearAll", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], LocalNotifications, "cancel", null);
+ __decorate([
+ plugin_1.Cordova({
+ successIndex: 0,
+ errorIndex: 2
+ })
+ ], LocalNotifications, "cancelAll", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], LocalNotifications, "isPresent", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], LocalNotifications, "isScheduled", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], LocalNotifications, "isTriggered", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], LocalNotifications, "getAllIds", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], LocalNotifications, "getTriggeredIds", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], LocalNotifications, "getScheduledIds", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], LocalNotifications, "get", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], LocalNotifications, "getScheduled", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], LocalNotifications, "getTriggered", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], LocalNotifications, "getAll", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], LocalNotifications, "getAllScheduled", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], LocalNotifications, "getAllTriggered", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], LocalNotifications, "on", null);
+ LocalNotifications = __decorate([
+ plugin_1.Plugin({
+ plugin: 'de.appplant.cordova.plugin.local-notification',
+ pluginRef: 'cordova.plugins.notification.local',
+ repo: 'https://github.com/katzer/cordova-plugin-local-notifications'
+ })
+ ], LocalNotifications);
+ return LocalNotifications;
+}());
+exports.LocalNotifications = LocalNotifications;
+
+},{"./plugin":48}],46:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name MediaPlugin
+ * @description
+ * @usage
+ * ```ts
+ * import {MediaPlugin} from 'ionic-native';
+ *
+ *
+ * ...
+ *
+ *
+ * // Playing a file
+ * var file = new MediaPlugin("path/to/file.mp3");
+ *
+ * // play the file
+ * file.play();
+ *
+ * // skip to 10 seconds
+ * file.seekTo(10000);
+ *
+ * // stop plying the file
+ * file.stop();
+ *
+ *
+ * ...
+ *
+ * // Recording to a file
+ * var newFile = new MediaPlugin("path/to/file.mp3");
+ * newFile.startRecord();
+ *
+ * newFile.stopRecord();
+ *
+ *
+ *
+ * ```
+ */
+var MediaPlugin = (function () {
+ // Methods
+ /**
+ * Open a media file
+ * @param src {string} A URI containing the audio content.
+ */
+ function MediaPlugin(src) {
+ // TODO handle success, error, and status
+ this._objectInstance = new Media(src);
+ }
+ /**
+ * Returns the current amplitude of the current recording.
+ */
+ MediaPlugin.prototype.getCurrentAmplitude = function () { return; };
+ /**
+ * Returns the current position within an audio file. Also updates the Media object's position parameter.
+ */
+ MediaPlugin.prototype.getCurrentPosition = function () { return; };
+ /**
+ * Returns the duration of an audio file in seconds. If the duration is unknown, it returns a value of -1.
+ */
+ MediaPlugin.prototype.getDuration = function () { return; };
+ /**
+ * Starts or resumes playing an audio file.
+ */
+ MediaPlugin.prototype.play = function (iosOptions) { };
+ /**
+ * Pauses playing an audio file.
+ */
+ MediaPlugin.prototype.pause = function () { };
+ /**
+ * Releases the underlying operating system's audio resources. This is particularly important for Android, since there are a finite amount of OpenCore instances for media playback. Applications should call the release function for any Media resource that is no longer needed.
+ */
+ MediaPlugin.prototype.release = function () { };
+ /**
+ * Sets the current position within an audio file.
+ * @param milliseconds
+ */
+ MediaPlugin.prototype.seekTo = function (milliseconds) { };
+ /**
+ * Set the volume for an audio file.
+ * @param volume The volume to set for playback. The value must be within the range of 0.0 to 1.0.
+ */
+ MediaPlugin.prototype.setVolume = function (volume) { };
+ /**
+ * Starts recording an audio file.
+ */
+ MediaPlugin.prototype.startRecord = function () { };
+ /**
+ * Stops recording
+ */
+ MediaPlugin.prototype.stopRecord = function () { };
+ /**
+ * Stops playing an audio file.
+ */
+ MediaPlugin.prototype.stop = function () { };
+ // Constants
+ MediaPlugin.MEDIA_NONE = 0;
+ MediaPlugin.MEDIA_STARTING = 1;
+ MediaPlugin.MEDIA_RUNNING = 2;
+ MediaPlugin.MEDIA_PAUSED = 3;
+ MediaPlugin.MEDIA_STOPPED = 4;
+ __decorate([
+ plugin_1.CordovaInstance()
+ ], MediaPlugin.prototype, "getCurrentAmplitude", null);
+ __decorate([
+ plugin_1.CordovaInstance()
+ ], MediaPlugin.prototype, "getCurrentPosition", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], MediaPlugin.prototype, "getDuration", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], MediaPlugin.prototype, "play", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], MediaPlugin.prototype, "pause", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], MediaPlugin.prototype, "release", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], MediaPlugin.prototype, "seekTo", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], MediaPlugin.prototype, "setVolume", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], MediaPlugin.prototype, "startRecord", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], MediaPlugin.prototype, "stopRecord", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], MediaPlugin.prototype, "stop", null);
+ MediaPlugin = __decorate([
+ plugin_1.Plugin({
+ repo: 'https://github.com/apache/cordova-plugin-media',
+ plugin: 'cordova-plugin-media',
+ pluginRef: 'Media'
+ })
+ ], MediaPlugin);
+ return MediaPlugin;
+}());
+exports.MediaPlugin = MediaPlugin;
+var MediaError = (function () {
+ function MediaError() {
+ }
+ Object.defineProperty(MediaError, "MEDIA_ERR_ABORTED", {
+ get: function () { return 1; },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(MediaError, "MEDIA_ERR_NETWORK", {
+ get: function () { return 2; },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(MediaError, "MEDIA_ERR_DECODE", {
+ get: function () { return 3; },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(MediaError, "MEDIA_ERR_NONE_SUPPORTED", {
+ get: function () { return 4; },
+ enumerable: true,
+ configurable: true
+ });
+ return MediaError;
+}());
+exports.MediaError = MediaError;
+
+},{"./plugin":48}],47:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Network
+ * @description
+ * Requires Cordova plugin: cordova-plugin-network-information. For more info, please see the [Network plugin docs](https://github.com/apache/cordova-plugin-network-information).
+ *
+ * @usage
+ * ```js
+ * import {Network, Connection} from 'ionic-native';
+ *
+ * // watch network for a disconnect
+ * let disconnectSubscription = Network.onDisconnect().subscribe(() => {
+ * console.log('network was disconnected :-( ')
+ * });
+ *
+ * // stop disconnect watch
+ * disconnectSubscription.unsubscribe();
+ *
+ *
+ * // watch network for a connection
+ * let connectSubscription = Network.onConnect().subscribe(() => {
+ * console.log('network connected!');
+*
+ * // We just got a connection but we need to wait briefly
+ *
+// before we determine the connection type. Might need to wait
+
+ * // prior to doing any api requests as well.
+ * setTimeout(() => {
+ * console.log(Network.connection);
+ * if (Network.connection === Connection.WIFI) {
+ * console.log('we got a wifi connection, woohoo!');
+ * }
+ * }, 3000);
+ * });
+ *
+ * // stop connect watch
+ * connectSubscription.unsubscribe();
+ *
+ * ```
+ */
+var Network = (function () {
+ function Network() {
+ }
+ Object.defineProperty(Network, "connection", {
+ /**
+ * Return the network connection type
+ */
+ get: function () { return navigator.connection.type; },
+ enumerable: true,
+ configurable: true
+ });
+ /**
+ * Get notified when the device goes offline
+ * @returns {Observable} Returns an observable.
+ */
+ Network.onDisconnect = function () { return; };
+ /**
+ * Get notified when the device goes online
+ * @returns {Observable} Returns an observable.
+ */
+ Network.onConnect = function () { return; };
+ __decorate([
+ plugin_1.CordovaProperty
+ ], Network, "connection", null);
+ __decorate([
+ plugin_1.Cordova({
+ eventObservable: true,
+ event: 'offline'
+ })
+ ], Network, "onDisconnect", null);
+ __decorate([
+ plugin_1.Cordova({
+ eventObservable: true,
+ event: 'online'
+ })
+ ], Network, "onConnect", null);
+ Network = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-network-information',
+ repo: 'https://github.com/apache/cordova-plugin-network-information',
+ platforms: ['Amazon Fire OS', 'iOS', 'Android', 'BlackBerry 10', 'Windows Phone 7', 'Windows Phone 8', 'Windows', 'Firefox OS', 'Browser'],
+ pluginRef: 'navigator.connection'
+ })
+ ], Network);
+ return Network;
+}());
+exports.Network = Network;
+var Connection = (function () {
+ function Connection() {
+ }
+ Object.defineProperty(Connection, "UNKNOWN", {
+ get: function () { return 'unknown'; },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Connection, "ETHERNET", {
+ get: function () { return 'ethernet'; },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Connection, "WIFI", {
+ get: function () { return 'wifi'; },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Connection, "CELL_2G", {
+ get: function () { return '2g'; },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Connection, "CELL_3G", {
+ get: function () { return '3g'; },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Connection, "CELL_4G", {
+ get: function () { return '4g'; },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Connection, "CELL", {
+ get: function () { return 'cellular'; },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Connection, "NONE", {
+ get: function () { return 'none'; },
+ enumerable: true,
+ configurable: true
+ });
+ return Connection;
+}());
+exports.Connection = Connection;
+
+},{"./plugin":48}],48:[function(require,module,exports){
+"use strict";
+var util_1 = require('../util');
+var Observable_1 = require('rxjs/Observable');
+/**
+ * @private
+ * @param pluginRef
+ * @returns {null|*}
+ */
+exports.getPlugin = function (pluginRef) {
+ return util_1.get(window, pluginRef);
+};
+/**
+ * @private
+ * @param pluginRef
+ * @returns {boolean}
+ */
+exports.isInstalled = function (pluginRef) {
+ return !!exports.getPlugin(pluginRef);
+};
+/**
+ * @private
+ * @param pluginObj
+ * @param method
+ */
+exports.pluginWarn = function (pluginObj, method) {
+ var pluginName = pluginObj.name;
+ var plugin = pluginObj.plugin;
+ if (method) {
+ console.warn('Native: tried calling ' + pluginName + '.' + method + ', but the ' + pluginName + ' plugin is not installed.');
+ }
+ else {
+ console.warn('Native: tried accessing the ' + pluginName + ' plugin but it\'s not installed.');
+ }
+ console.warn('Install the ' + pluginName + ' plugin: \'cordova plugin add ' + plugin + '\'');
+};
+/**
+ * @private
+ * @param pluginName
+ * @param method
+ */
+exports.cordovaWarn = function (pluginName, method) {
+ if (method) {
+ console.warn('Native: tried calling ' + pluginName + '.' + method + ', but Cordova is not available. Make sure to include cordova.js or run in a device/simulator');
+ }
+ else {
+ console.warn('Native: tried accessing the ' + pluginName + ' plugin but Cordova is not available. Make sure to include cordova.js or run in a device/simulator');
+ }
+};
+function setIndex(args, opts, resolve, reject) {
+ if (opts === void 0) { opts = {}; }
+ // If the plugin method expects myMethod(success, err, options)
+ if (opts.callbackOrder === 'reverse') {
+ // Get those arguments in the order [resolve, reject, ...restOfArgs]
+ args.unshift(reject);
+ args.unshift(resolve);
+ }
+ else if (typeof opts.successIndex !== 'undefined' || typeof opts.errorIndex !== 'undefined') {
+ // If we've specified a success/error index
+ args.splice(opts.successIndex, 0, resolve);
+ args.splice(opts.errorIndex, 0, reject);
+ }
+ else {
+ // Otherwise, let's tack them on to the end of the argument list
+ // which is 90% of cases
+ args.push(resolve);
+ args.push(reject);
+ }
+ return args;
+}
+function callCordovaPlugin(pluginObj, methodName, args, opts, resolve, reject) {
+ // Try to figure out where the success/error callbacks need to be bound
+ // to our promise resolve/reject handlers.
+ if (opts === void 0) { opts = {}; }
+ args = setIndex(args, opts, resolve, reject);
+ var pluginInstance = exports.getPlugin(pluginObj.pluginRef);
+ if (!pluginInstance) {
+ // Do this check in here in the case that the Web API for this plugin is available (for example, Geolocation).
+ if (!window.cordova) {
+ exports.cordovaWarn(pluginObj.name, methodName);
+ return {
+ error: 'cordova_not_available'
+ };
+ }
+ exports.pluginWarn(pluginObj, methodName);
+ return {
+ error: 'plugin_not_installed'
+ };
+ }
+ // TODO: Illegal invocation needs window context
+ return util_1.get(window, pluginObj.pluginRef)[methodName].apply(pluginInstance, args);
+}
+function getPromise(cb) {
+ if (window.Promise) {
+ // console.log('Native promises available...');
+ return new Promise(function (resolve, reject) {
+ cb(resolve, reject);
+ });
+ }
+ else if (window.angular) {
+ var $q_1 = window.angular.injector(['ng']).get('$q');
+ // console.log('Loaded $q', $q);
+ return $q_1(function (resolve, reject) {
+ cb(resolve, reject);
+ });
+ }
+ else {
+ console.error('No Promise support or polyfill found. To enable Ionic Native support, please add the es6-promise polyfill before this script, or run with a library like Angular 1/2 or on a recent browser.');
+ }
+}
+function wrapPromise(pluginObj, methodName, args, opts) {
+ if (opts === void 0) { opts = {}; }
+ var pluginResult, rej;
+ var p = getPromise(function (resolve, reject) {
+ pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts, resolve, reject);
+ rej = reject;
+ });
+ // Angular throws an error on unhandled rejection, but in this case we have already printed
+ // a warning that Cordova is undefined or the plugin is uninstalled, so there is no reason
+ // to error
+ if (pluginResult && pluginResult.error) {
+ p.catch(function () { });
+ rej(pluginResult.error);
+ }
+ return p;
+}
+function wrapObservable(pluginObj, methodName, args, opts) {
+ if (opts === void 0) { opts = {}; }
+ return new Observable_1.Observable(function (observer) {
+ var pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts, observer.next.bind(observer), observer.error.bind(observer));
+ if (pluginResult && pluginResult.error) {
+ observer.error(pluginResult.error);
+ }
+ return function () {
+ try {
+ if (opts.clearWithArgs) {
+ return util_1.get(window, pluginObj.pluginRef)[opts.clearFunction].apply(pluginObj, args);
+ }
+ return util_1.get(window, pluginObj.pluginRef)[opts.clearFunction].call(pluginObj, pluginResult);
+ }
+ catch (e) {
+ console.warn('Unable to clear the previous observable watch for', pluginObj.name, methodName);
+ console.error(e);
+ }
+ };
+ });
+}
+function callInstance(pluginObj, methodName, args, opts, resolve, reject) {
+ if (opts === void 0) { opts = {}; }
+ args = setIndex(args, opts, resolve, reject);
+ return pluginObj._objectInstance[methodName].apply(pluginObj._objectInstance, args);
+}
+function wrapInstance(pluginObj, methodName, opts) {
+ if (opts === void 0) { opts = {}; }
+ return function () {
+ var args = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ args[_i - 0] = arguments[_i];
+ }
+ if (opts.sync) {
+ return callInstance(pluginObj, methodName, args, opts);
+ }
+ else if (opts.observable) {
+ return new Observable_1.Observable(function (observer) {
+ var pluginResult = callInstance(pluginObj, methodName, args, opts, observer.next.bind(observer), observer.error.bind(observer));
+ return function () {
+ try {
+ if (opts.clearWithArgs) {
+ return pluginObj._objectInstance[opts.clearFunction].apply(pluginObj._objectInstance, args);
+ }
+ return pluginObj._objectInstance[opts.clearFunction].call(pluginObj, pluginResult);
+ }
+ catch (e) {
+ console.warn('Unable to clear the previous observable watch for', pluginObj.name, methodName);
+ console.error(e);
+ }
+ };
+ });
+ }
+ else {
+ return getPromise(function (resolve, reject) {
+ callInstance(pluginObj, methodName, args, opts, resolve, reject);
+ });
+ }
+ };
+}
+/**
+ * Wrap the event with an observable
+ * @param event
+ * @returns {Observable}
+ */
+function wrapEventObservable(event) {
+ return new Observable_1.Observable(function (observer) {
+ var callback = function (status) { return observer.next(status); };
+ window.addEventListener(event, callback, false);
+ return function () { return window.removeEventListener(event, callback, false); };
+ });
+}
+/**
+ * @private
+ * @param pluginObj
+ * @param methodName
+ * @param opts
+ * @returns {function(...[any]): (undefined|*|Observable|*|*)}
+ */
+exports.wrap = function (pluginObj, methodName, opts) {
+ if (opts === void 0) { opts = {}; }
+ return function () {
+ var args = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ args[_i - 0] = arguments[_i];
+ }
+ if (opts.sync)
+ return callCordovaPlugin(pluginObj, methodName, args, opts);
+ else if (opts.observable)
+ return wrapObservable(pluginObj, methodName, args, opts);
+ else if (opts.eventObservable && opts.event)
+ return wrapEventObservable(opts.event);
+ else
+ return wrapPromise(pluginObj, methodName, args, opts);
+ };
+};
+/**
+ * @private
+ *
+ * Class decorator specifying Plugin metadata. Required for all plugins.
+ *
+ * @usage
+ * ```ts
+ * @Plugin({
+ * name: 'MyPlugin',
+ * plugin: 'cordova-plugin-myplugin',
+ * pluginRef: 'window.myplugin'
+ * })
+ * export class MyPlugin {
+ *
+ * // Plugin wrappers, properties, and functions go here ...
+ *
+ * }
+ * ```
+ */
+function Plugin(config) {
+ return function (cls) {
+ // Add these fields to the class
+ for (var k in config) {
+ cls[k] = config[k];
+ }
+ cls['installed'] = function () {
+ return !!exports.getPlugin(config.pluginRef);
+ };
+ return cls;
+ };
+}
+exports.Plugin = Plugin;
+/**
+ * @private
+ *
+ * Wrap a stub function in a call to a Cordova plugin, checking if both Cordova
+ * and the required plugin are installed.
+ */
+function Cordova(opts) {
+ if (opts === void 0) { opts = {}; }
+ return function (target, methodName, descriptor) {
+ var originalMethod = descriptor.value;
+ return {
+ value: function () {
+ var args = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ args[_i - 0] = arguments[_i];
+ }
+ return exports.wrap(this, methodName, opts).apply(this, args);
+ }
+ };
+ };
+}
+exports.Cordova = Cordova;
+/**
+ * @private
+ *
+ * Wrap an instance method
+ */
+function CordovaInstance(opts) {
+ if (opts === void 0) { opts = {}; }
+ return function (target, methodName) {
+ return {
+ value: function () {
+ var args = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ args[_i - 0] = arguments[_i];
+ }
+ return wrapInstance(this, methodName, opts).apply(this, args);
+ }
+ };
+ };
+}
+exports.CordovaInstance = CordovaInstance;
+/**
+ * @private
+ *
+ *
+ * Before calling the original method, ensure Cordova and the plugin are installed.
+ */
+function CordovaProperty(target, key, descriptor) {
+ var originalMethod = descriptor.get;
+ descriptor.get = function () {
+ var args = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ args[_i - 0] = arguments[_i];
+ }
+ if (!window.cordova) {
+ exports.cordovaWarn(this.name, null);
+ return {};
+ }
+ var pluginInstance = exports.getPlugin(this.pluginRef);
+ if (!pluginInstance) {
+ exports.pluginWarn(this, key);
+ return {};
+ }
+ return originalMethod.apply(this, args);
+ };
+ return descriptor;
+}
+exports.CordovaProperty = CordovaProperty;
+/**
+ * @private
+ * @param target
+ * @param key
+ * @param descriptor
+ * @constructor
+ */
+function InstanceProperty(target, key, descriptor) {
+ descriptor.get = function () {
+ return this._objectInstance[key];
+ };
+ descriptor.get = function () {
+ var args = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ args[_i - 0] = arguments[_i];
+ }
+ return this._objectInstance[key] = args[0];
+ };
+ return descriptor;
+}
+exports.InstanceProperty = InstanceProperty;
+
+},{"../util":62,"rxjs/Observable":63}],49:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Push
+ * @description
+ * Register and receive push notifications.
+ *
+ * Requires Cordova plugin: `phonegap-plugin-push`. For more info, please see the [Push plugin docs](https://github.com/phonegap/phonegap-plugin-push).
+ *
+ * For TypeScript users, see the [Push plugin docs about using TypeScript for custom notifications](https://github.com/phonegap/phonegap-plugin-push/blob/master/docs/TYPESCRIPT.md).
+ *
+ * @usage
+ * ```js
+ * import {Push} from 'ionic-native';
+ *
+ *
+ *
+ * ```
+ */
+var Push = (function () {
+ function Push() {
+ }
+ /**
+ * Initialize the plugin on the native side.
+ *
+ * ```
+ * var push = Push.init({
+ * android: {
+ * senderID: "12345679"
+ * },
+ * ios: {
+ * alert: "true",
+ * badge: true,
+ * sound: 'false'
+ * },
+ * windows: {}
+ * });
+ * ```
+ *
+ * @param {PushOptions} options The Push [options](https://github.com/phonegap/phonegap-plugin-push/blob/master/docs/API.md#parameters).
+ * @return {PushNotification} Returns a new [PushNotification](https://github.com/phonegap/phonegap-plugin-push/blob/master/docs/API.md#pushonevent-callback) object.
+ */
+ Push.init = function (options) { return; };
+ /**
+ * Check whether the push notification permission has been granted.
+ * @return {Promise} Returns a Promise that resolves with an object with one property: isEnabled, a boolean that indicates if permission has been granted.
+ */
+ Push.hasPermission = function () { return; };
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], Push, "init", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Push, "hasPermission", null);
+ Push = __decorate([
+ plugin_1.Plugin({
+ plugin: 'phonegap-plugin-push',
+ pluginRef: 'PushNotification',
+ repo: 'https://github.com/phonegap/phonegap-plugin-push'
+ })
+ ], Push);
+ return Push;
+}());
+exports.Push = Push;
+
+},{"./plugin":48}],50:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name SafariViewController
+ * @description
+ * @usage
+ * ```
+ * import {SafariViewController} from 'ionic-native';
+ *
+ * ...
+ *
+ * SafariViewController.isAvailable()
+ * .then(
+ * (available) => {
+ * if(available){
+ *
+ * SafariViewController.show({
+ * utl: 'http://ionic.io',
+ * hidden: false,
+ * animated: false,
+ * transition: 'curl',
+ * enterReaderModeIfAvailable: true,
+ * tintColor: '#ff0000'
+ * })
+ * .then(
+ * (result: any) => {
+ * if(result.event === 'opened') console.log("Opened");
+ * else if(result.event === 'loaded') console.log("Loaded");
+ * else if(result.event === 'closed') console.log("Closed");
+ * },
+ * (error: any) => console.error(error)
+ * );
+ *
+ * } else {
+ * // use fallback browser, example InAppBrowser
+ * }
+ * }
+ * );
+ * ```
+ */
+var SafariViewController = (function () {
+ function SafariViewController() {
+ }
+ /**
+ * Checks if SafariViewController is available
+ */
+ SafariViewController.isAvailable = function () { return; };
+ /**
+ * Shows Safari View Controller
+ * @param options
+ */
+ SafariViewController.show = function (options) { };
+ /**
+ * Hides Safari View Controller
+ */
+ SafariViewController.hide = function () { };
+ /**
+ * Tries to connect to the Chrome's custom tabs service. you must call this method before calling any of the other methods listed below.
+ */
+ SafariViewController.connectToService = function () { return; };
+ /**
+ * Call this method whenever there's a chance the user will open an external url.
+ */
+ SafariViewController.warmUp = function () { return; };
+ /**
+ * For even better performance optimization, call this methods if there's more than a 50% chance the user will open a certain URL.
+ * @param url
+ */
+ SafariViewController.mayLaunchUrl = function (url) { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], SafariViewController, "isAvailable", null);
+ __decorate([
+ plugin_1.Cordova({
+ callbackOrder: 'reverse'
+ })
+ ], SafariViewController, "show", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], SafariViewController, "hide", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], SafariViewController, "connectToService", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], SafariViewController, "warmUp", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], SafariViewController, "mayLaunchUrl", null);
+ SafariViewController = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-safariviewcontroller',
+ pluginRef: 'SafariViewController',
+ platforms: ['iOS'],
+ repo: 'https://github.com/EddyVerbruggen/cordova-plugin-safariviewcontroller'
+ })
+ ], SafariViewController);
+ return SafariViewController;
+}());
+exports.SafariViewController = SafariViewController;
+
+},{"./plugin":48}],51:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+var Screenshot = (function () {
+ function Screenshot() {
+ }
+ /**
+ * Takes screenshot and saves the image
+ *
+ * @param {string} format. Format can take the value of either 'jpg' or 'png'
+ * On ios, only 'jpg' format is supported
+ * @param {number} quality. Determines the quality of the screenshot.
+ * Default quality is set to 100.
+ * @param {string} filename. Name of the file as stored on the storage
+ */
+ Screenshot.save = function (format, quality, filename) {
+ return new Promise(function (resolve, reject) {
+ navigator.screenshot.save(function (error, result) {
+ if (error) {
+ reject(error);
+ }
+ else {
+ resolve(result);
+ }
+ }, format, quality, filename);
+ });
+ };
+ /**
+ * Takes screenshot and returns the image as an URI
+ *
+ * @param {number} quality. Determines the quality of the screenshot.
+ * Default quality is set to 100.
+ */
+ Screenshot.URI = function (quality) {
+ return new Promise(function (resolve, reject) {
+ navigator.screenshot.URI(function (error, result) {
+ if (error) {
+ reject(error);
+ }
+ else {
+ resolve(result);
+ }
+ }, quality);
+ });
+ };
+ Screenshot = __decorate([
+ plugin_1.Plugin({
+ plugin: 'https://github.com/gitawego/cordova-screenshot.git',
+ pluginRef: 'navigator.screenshot',
+ repo: 'https://github.com/gitawego/cordova-screenshot.git'
+ })
+ ], Screenshot);
+ return Screenshot;
+}());
+exports.Screenshot = Screenshot;
+
+},{"./plugin":48}],52:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name SMS
+ * @description
+ *
+ * Requires Cordova plugin: cordova-plugin-sms. For more info, please see the [SMS plugin docs](https://github.com/cordova-sms/cordova-sms-plugin).
+ *
+ * @usage
+ * ```ts
+ * import {SMS} from 'ionic-native';
+ *
+ *
+ *
+ * // Send a text message using default options
+ * SMS.send('416123456','Hello world!');
+ *
+ * ```
+ */
+var SMS = (function () {
+ function SMS() {
+ }
+ /**
+ * Sends sms to a number
+ * @param phoneNumber {string|Array} Phone number
+ * @param message {string} Message
+ * @param options {SmsOptions} Options
+ * @returns {Promise} Resolves promise when the SMS has been sent
+ */
+ SMS.send = function (phoneNumber, message, options) { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], SMS, "send", null);
+ SMS = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-sms-plugin',
+ pluginRef: 'sms',
+ repo: 'https://github.com/cordova-sms/cordova-sms-plugin',
+ platforms: ['Android', 'iOS', 'Windows Phone 8']
+ })
+ ], SMS);
+ return SMS;
+}());
+exports.SMS = SMS;
+
+},{"./plugin":48}],53:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Social Sharing
+ * @description
+ * Share text, files, images, and links via social networks, sms, and email.
+ * @usage
+ * ```js
+ * import {SocialSharing} from 'ionic-native';
+ *
+ * ...
+ * // TODO add usage info
+ * ```
+ */
+var SocialSharing = (function () {
+ function SocialSharing() {
+ }
+ /**
+ * Shares using the share sheet
+ * @param message {string} The message you would like to share.
+ * @param subject {string} The subject
+ * @param file {string|Array} URL(s) to file(s) or image(s), local path(s) to file(s) or image(s), or base64 data of an image. Only the first file/image will be used on Windows Phone.
+ * @param url {string} A URL to share
+ */
+ SocialSharing.share = function (message, subject, file, url) { };
+ /**
+ * Checks if you can share via a specific app.
+ * @param appName App name or package name. Examples: instagram or com.apple.social.facebook
+ */
+ SocialSharing.canShareVia = function (appName) { return; };
+ /**
+ * Shares directly to Twitter
+ * @param message
+ * @param image
+ * @param url
+ */
+ SocialSharing.shareViaTwitter = function (message, image, url) { };
+ /**
+ * Shares directly to Facebook
+ * @param message {string}
+ * @param image {string}
+ * @param url {string}
+ */
+ SocialSharing.shareViaFacebook = function (message, image, url) { return; };
+ /**
+ * Shares directly to Facebook with a paste message hint
+ * @param message {string}
+ * @param image {string}
+ * @param url {string}
+ * @param pasteMessageHint {string}
+ */
+ SocialSharing.shareViaFacebookWithPasteMessageHint = function (message, image, url, pasteMessageHint) { return; };
+ /**
+ * Shares directly to Instagram
+ * @param message {string}
+ * @param image {string}
+ */
+ SocialSharing.shareViaInstagram = function (message, image) { return; };
+ /**
+ * Shares directly to WhatsApp
+ * @param message {string}
+ * @param image {string}
+ * @param url {string}
+ */
+ SocialSharing.shareViaWhatsApp = function (message, image, url) { return; };
+ /**
+ * Shares directly to a WhatsApp Contact
+ * @param receiver {string} Pass phone number on Android, and Addressbook ID (abid) on iOS
+ * @param message {string} Message to send
+ * @param image {string} Image to send (does not work on iOS
+ * @param url {string} Link to send
+ */
+ SocialSharing.shareViaWhatsAppToReceiver = function (receiver, message, image, url) { return; };
+ /**
+ * Share via SMS
+ * @param messge {string} message to send
+ * @param phoneNumber {string} Number or multiple numbers seperated by commas
+ */
+ SocialSharing.shareViaSMS = function (messge, phoneNumber) { return; };
+ /**
+ * Share via Email
+ * @param message {string}
+ * @param subject {string}
+ * @param to {Array}
+ * @param cc {Array}
+ * @param bcc {Array}
+ * @param files {string|Array} URL or local path to file(s) to attach
+ */
+ SocialSharing.shareViaEmail = function (message, subject, to, cc, bcc, files) { return; };
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], SocialSharing, "share", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['iOS', 'Android']
+ })
+ ], SocialSharing, "canShareVia", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true,
+ platforms: ['iOS', 'Android']
+ })
+ ], SocialSharing, "shareViaTwitter", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['iOS', 'Android']
+ })
+ ], SocialSharing, "shareViaFacebook", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['iOS', 'Android']
+ })
+ ], SocialSharing, "shareViaFacebookWithPasteMessageHint", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['iOS', 'Android']
+ })
+ ], SocialSharing, "shareViaInstagram", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['iOS', 'Android']
+ })
+ ], SocialSharing, "shareViaWhatsApp", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['iOS', 'Android']
+ })
+ ], SocialSharing, "shareViaWhatsAppToReceiver", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['iOS', 'Android']
+ })
+ ], SocialSharing, "shareViaSMS", null);
+ __decorate([
+ plugin_1.Cordova({
+ platforms: ['iOS', 'Android']
+ })
+ ], SocialSharing, "shareViaEmail", null);
+ SocialSharing = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-x-socialsharing',
+ pluginRef: 'window.plugins.socialsharing',
+ repo: 'https://github.com/EddyVerbruggen/SocialSharing-PhoneGap-Plugin',
+ platforms: ['iOS', 'Android', 'Windows Phone']
+ })
+ ], SocialSharing);
+ return SocialSharing;
+}());
+exports.SocialSharing = SocialSharing;
+
+},{"./plugin":48}],54:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Spinner Dialog
+ * @description
+ * @usage
+ * ```js
+ * import {SpinnerDialog} from 'ionic-native';
+ *
+ *
+ *
+ * SpinnerDialog.show();
+ *
+ * SpinnerDialog.hide();
+ * ```
+ */
+var SpinnerDialog = (function () {
+ function SpinnerDialog() {
+ }
+ /**
+ * Shows the spinner dialog
+ * @param title {string} Spinner title (shows on Android only)
+ * @param message {string} Spinner message
+ * @param cancelCallback {boolean|function} Set to false to set spinner not cancelable. Or provide a function to call when the user cancels the spinner.
+ * @param iOSOptions {object} Options for iOS only
+ */
+ SpinnerDialog.show = function (title, message, cancelCallback, iOSOptions) { };
+ /**
+ * Hides the spinner dialog if visible
+ */
+ SpinnerDialog.hide = function () { };
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], SpinnerDialog, "show", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], SpinnerDialog, "hide", null);
+ SpinnerDialog = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-spinner-dialog',
+ pluginRef: 'window.plugins.spinnerDialog',
+ repo: 'https://github.com/Paldom/SpinnerDialog',
+ platforms: ['Android', 'iOS', 'Windows Phone 8']
+ })
+ ], SpinnerDialog);
+ return SpinnerDialog;
+}());
+exports.SpinnerDialog = SpinnerDialog;
+
+},{"./plugin":48}],55:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Splashscreen
+ * @description This plugin displays and hides a splash screen during application launch. The methods below allows showing and hiding the splashscreen after the app has loaded.
+ * @usage
+ * ```ts
+ * import {Splashscreen} from 'ionic-native';
+ *
+ *
+ *
+ * Splashscreen.show();
+ *
+ * Splashscreen.hide();
+ * ```
+ */
+var Splashscreen = (function () {
+ function Splashscreen() {
+ }
+ /**
+ * Shows the splashscreen
+ */
+ Splashscreen.show = function () { };
+ /**
+ * Hides the splashscreen
+ */
+ Splashscreen.hide = function () { };
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], Splashscreen, "show", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], Splashscreen, "hide", null);
+ Splashscreen = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-splashscreen',
+ pluginRef: 'navigator.splashscreen',
+ repo: 'https://github.com/apache/cordova-plugin-splashscreen'
+ })
+ ], Splashscreen);
+ return Splashscreen;
+}());
+exports.Splashscreen = Splashscreen;
+
+},{"./plugin":48}],56:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name SQLite
+ */
+var SQLite = (function () {
+ function SQLite(config) {
+ var _this = this;
+ new Promise(function (resolve, reject) {
+ sqlitePlugin.openDatabase(config, resolve, reject);
+ }).then(function (db) { return _this._objectInstance = db; }, function (error) { return console.warn(error); });
+ }
+ Object.defineProperty(SQLite.prototype, "databaseFeatures", {
+ get: function () {
+ return this._objectInstance.databaseFeatures;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ SQLite.prototype.addTransaction = function (transaction) { };
+ SQLite.prototype.transaction = function (fn) { return; };
+ SQLite.prototype.readTransaction = function (fn) { return; };
+ SQLite.prototype.startNextTransaction = function () { };
+ SQLite.prototype.close = function () { return; };
+ SQLite.prototype.start = function () { };
+ SQLite.prototype.executeSql = function (statement, params) { return; };
+ SQLite.prototype.addSatement = function (sql, values) { return; };
+ SQLite.prototype.sqlBatch = function (sqlStatements) { return; };
+ SQLite.prototype.abortallPendingTransactions = function () { };
+ SQLite.prototype.handleStatementSuccess = function (handler, response) { };
+ SQLite.prototype.handleStatementFailure = function (handler, response) { };
+ SQLite.prototype.run = function () { };
+ SQLite.prototype.abort = function (txFailure) { };
+ SQLite.prototype.finish = function () { };
+ SQLite.prototype.abortFromQ = function (sqlerror) { };
+ SQLite.echoTest = function () { return; };
+ SQLite.deleteDatabase = function (first) { return; };
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], SQLite.prototype, "addTransaction", null);
+ __decorate([
+ plugin_1.CordovaInstance()
+ ], SQLite.prototype, "transaction", null);
+ __decorate([
+ plugin_1.CordovaInstance()
+ ], SQLite.prototype, "readTransaction", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], SQLite.prototype, "startNextTransaction", null);
+ __decorate([
+ plugin_1.CordovaInstance()
+ ], SQLite.prototype, "close", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], SQLite.prototype, "start", null);
+ __decorate([
+ plugin_1.CordovaInstance()
+ ], SQLite.prototype, "executeSql", null);
+ __decorate([
+ plugin_1.CordovaInstance()
+ ], SQLite.prototype, "addSatement", null);
+ __decorate([
+ plugin_1.CordovaInstance()
+ ], SQLite.prototype, "sqlBatch", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], SQLite.prototype, "abortallPendingTransactions", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], SQLite.prototype, "handleStatementSuccess", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], SQLite.prototype, "handleStatementFailure", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], SQLite.prototype, "run", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], SQLite.prototype, "abort", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], SQLite.prototype, "finish", null);
+ __decorate([
+ plugin_1.CordovaInstance({
+ sync: true
+ })
+ ], SQLite.prototype, "abortFromQ", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], SQLite, "echoTest", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], SQLite, "deleteDatabase", null);
+ SQLite = __decorate([
+ plugin_1.Plugin({
+ pluginRef: 'sqlitePlugin',
+ plugin: 'cordova-sqlite-storage',
+ repo: 'https://github.com/litehelpers/Cordova-sqlite-storage'
+ })
+ ], SQLite);
+ return SQLite;
+}());
+exports.SQLite = SQLite;
+
+},{"./plugin":48}],57:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Status Bar
+ * @description
+ * Manage the appearance of the native status bar.
+ *
+ * Requires Cordova plugin: `cordova-plugin-statusbar`. For more info, please see the [StatusBar plugin docs](https://github.com/apache/cordova-plugin-statusbar).
+ *
+ * @usage
+ * ```ts
+ * import {StatusBar} from 'ionic-native';
+ *
+ *
+ *
+ * StatuBar.overlaysWebView(true);
+ *
+ * StatusBar.
+ * ```
+ *
+ */
+var StatusBar = (function () {
+ function StatusBar() {
+ }
+ /**
+ * Set whether the status bar overlays the main app view. The default
+ * is true.
+ *
+ * @param {boolean} doesOverlay Whether the status bar overlays the main app view.
+ */
+ StatusBar.overlaysWebView = function (doesOverlay) { };
+ ;
+ /**
+ * Use the default statusbar (dark text, for light backgrounds).
+ */
+ StatusBar.styleDefault = function () { };
+ ;
+ /**
+ * Use the lightContent statusbar (light text, for dark backgrounds).
+ */
+ StatusBar.styleLightContent = function () { };
+ ;
+ /**
+ * Use the blackTranslucent statusbar (light text, for dark backgrounds).
+ */
+ StatusBar.styleBlackTranslucent = function () { };
+ ;
+ /**
+ * Use the blackOpaque statusbar (light text, for dark backgrounds).
+ */
+ StatusBar.styleBlackOpaque = function () { };
+ ;
+ /**
+ * Set the status bar to a specific named color. Valid options:
+ * black, darkGray, lightGray, white, gray, red, green, blue, cyan, yellow, magenta, orange, purple, brown.
+ *
+ * iOS note: you must call StatusBar.overlaysWebView(false) to enable color changing.
+ *
+ * @param {string} colorName The name of the color (from above)
+ */
+ StatusBar.backgroundColorByName = function (colorName) { };
+ ;
+ /**
+ * Set the status bar to a specific hex color (CSS shorthand supported!).
+ *
+ * iOS note: you must call StatusBar.overlaysWebView(false) to enable color changing.
+ *
+ * @param {string} hexString The hex value of the color.
+ */
+ StatusBar.backgroundColorByHexString = function (hexString) { };
+ ;
+ /**
+ * Hide the StatusBar
+ */
+ StatusBar.hide = function () { };
+ ;
+ /**
+ * Show the StatusBar
+ */
+ StatusBar.show = function () { };
+ ;
+ Object.defineProperty(StatusBar, "isVisible", {
+ /**
+ * Whether the StatusBar is currently visible or not.
+ */
+ get: function () { return window.StatusBar.isVisible; },
+ enumerable: true,
+ configurable: true
+ });
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], StatusBar, "overlaysWebView", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], StatusBar, "styleDefault", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], StatusBar, "styleLightContent", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], StatusBar, "styleBlackTranslucent", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], StatusBar, "styleBlackOpaque", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], StatusBar, "backgroundColorByName", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], StatusBar, "backgroundColorByHexString", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], StatusBar, "hide", null);
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], StatusBar, "show", null);
+ __decorate([
+ plugin_1.CordovaProperty
+ ], StatusBar, "isVisible", null);
+ StatusBar = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-statusbar',
+ pluginRef: 'StatusBar',
+ repo: 'https://github.com/apache/cordova-plugin-statusbar'
+ })
+ ], StatusBar);
+ return StatusBar;
+}());
+exports.StatusBar = StatusBar;
+
+},{"./plugin":48}],58:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Toast
+ * @description
+ * This plugin allows you to show a native Toast (a little text popup) on iOS, Android and WP8. It's great for showing a non intrusive native notification which is guaranteed always in the viewport of the browser.
+ *
+ * Requires Cordova plugin: `cordova-plugin-x-toast`. For more info, please see the [Toast plugin docs](https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin).
+ *
+ * @usage
+ * ```ts
+ * import {Toast} from 'ionic-native';
+ *
+ *
+ *
+ * Toast.show("I'm a toast", 5000, "center").subscribe(
+ * toast => {
+ * console.log(toast);
+ * }
+ * );
+ * ```
+ */
+var Toast = (function () {
+ function Toast() {
+ }
+ /**
+ * Show a native toast for the given duration at the specified position.
+ *
+ * @param {string} message The message to display.
+ * @param {string} duration Duration to show the toast, either 'short', 'long' or any number of milliseconds: '1500'.
+ * @param {string} position Where to position the toast, either 'top', 'center', or 'bottom'.
+ * @return {Observable} Returns an Observable that notifies first on success and then when tapped, rejects on error.
+ */
+ Toast.show = function (message, duration, position) { return; };
+ /**
+ * Manually hide any currently visible toast.
+ * @return {Promise} Returns a Promise that resolves on success.
+ */
+ Toast.hide = function () { return; };
+ /**
+ * Show a native toast with the given options.
+ *
+ * @param {Object} options Options for showing a toast. Available options:
+ * message The message to display.
+ * duration Duration to show the toast, either 'short', 'long' or any number of milliseconds: '1500'.
+ * position Where to position the toast, either 'top', 'center', or 'bottom'.
+ * addPixelsY Offset in pixels to move the toast up or down from its specified position.
+ *
+ * @return {Observable} Returns an Observable that notifies first on success and then when tapped, rejects on error.
+ */
+ Toast.showWithOptions = function (options) { return; };
+ /**
+ * Shorthand for `show(message, 'short', 'top')`.
+ * @return {Observable} Returns an Observable that notifies first on success and then when tapped, rejects on error.
+ */
+ Toast.showShortTop = function (message) { return; };
+ /**
+ * Shorthand for `show(message, 'short', 'center')`.
+ * @return {Observable} Returns an Observable that notifies first on success and then when tapped, rejects on error.
+ */
+ Toast.showShortCenter = function (message) { return; };
+ /**
+ * Shorthand for `show(message, 'short', 'bottom')`.
+ * @return {Observable} Returns an Observable that notifies first on success and then when tapped, rejects on error.
+ */
+ Toast.showShortBottom = function (message) { return; };
+ /**
+ * Shorthand for `show(message, 'long', 'top')`.
+ * @return {Observable} Returns an Observable that notifies first on success and then when tapped, rejects on error.
+ */
+ Toast.showLongTop = function (message) { return; };
+ /**
+ * Shorthand for `show(message, 'long', 'center')`.
+ * @return {Observable} Returns an Observable that notifies first on success and then when tapped, rejects on error.
+ */
+ Toast.showLongCenter = function (message) { return; };
+ /**
+ * Shorthand for `show(message, 'long', 'bottom')`.
+ * @return {Observable} Returns an Observable that notifies first on success and then when tapped, rejects on error.
+ */
+ Toast.showLongBottom = function (message) { return; };
+ __decorate([
+ plugin_1.Cordova({
+ observable: true,
+ clearFunction: 'hide'
+ })
+ ], Toast, "show", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], Toast, "hide", null);
+ __decorate([
+ plugin_1.Cordova({
+ observable: true,
+ clearFunction: 'hide'
+ })
+ ], Toast, "showWithOptions", null);
+ __decorate([
+ plugin_1.Cordova({
+ observable: true,
+ clearFunction: 'hide'
+ })
+ ], Toast, "showShortTop", null);
+ __decorate([
+ plugin_1.Cordova({
+ observable: true,
+ clearFunction: 'hide'
+ })
+ ], Toast, "showShortCenter", null);
+ __decorate([
+ plugin_1.Cordova({
+ observable: true,
+ clearFunction: 'hide'
+ })
+ ], Toast, "showShortBottom", null);
+ __decorate([
+ plugin_1.Cordova({
+ observable: true,
+ clearFunction: 'hide'
+ })
+ ], Toast, "showLongTop", null);
+ __decorate([
+ plugin_1.Cordova({
+ observable: true,
+ clearFunction: 'hide'
+ })
+ ], Toast, "showLongCenter", null);
+ __decorate([
+ plugin_1.Cordova({
+ observable: true,
+ clearFunction: 'hide'
+ })
+ ], Toast, "showLongBottom", null);
+ Toast = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-x-toast',
+ pluginRef: 'plugins.toast',
+ repo: 'https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin'
+ })
+ ], Toast);
+ return Toast;
+}());
+exports.Toast = Toast;
+
+},{"./plugin":48}],59:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name TouchID
+ * @description
+ * Scan the fingerprint of a user with the TouchID sensor.
+ *
+ * Requires Cordova plugin: `cordova-plugin-touch-id`. For more info, please see the [TouchID plugin docs](https://github.com/EddyVerbruggen/cordova-plugin-touch-id).
+ *
+ * ### Error Codes
+ *
+ * The plugin will reject for various reasons. Your app will most likely need to respond to the cases differently.
+ *
+ * Here is a list of some of the error codes:
+ *
+ * - `-1` - Fingerprint scan failed more than 3 times
+ * - `-2` or `-128` - User tapped the 'Cancel' button
+ * - `-3` - User tapped the 'Enter Passcode' or 'Enter Password' button
+ * - `-4` - The scan was cancelled by the system (Home button for example)
+ * - `-6` - TouchID is not Available
+ * - `-8` - TouchID is locked out from too many tries
+ * @usage
+ * ```js
+ * import {TouchID} from 'ionic-native';
+ *
+ *
+ *
+ * ```
+ */
+var TouchID = (function () {
+ function TouchID() {
+ }
+ /**
+ * Whether TouchID is available or not.
+ *
+ * @return {Promise} Returns a Promise that resolves if yes, rejects if no.
+ */
+ TouchID.prototype.isAvailable = function () { return; };
+ /**
+ * Show TouchID dialog and wait for a fingerprint scan. If user taps 'Enter Password' button, brings up standard system passcode screen.
+ *
+ * @param {string} message The message to display
+ * @return {Promise} Returns a Promise the resolves if the fingerprint scan was successful, rejects with an error code (see above).
+ */
+ TouchID.verifyFingerprint = function (message) { return; };
+ /**
+ * Show TouchID dialog and wait for a fingerprint scan. If user taps 'Enter Password' button, rejects with code '-3' (see above).
+ *
+ * @param {string} message The message to display
+ * @return {Promise} Returns a Promise the resolves if the fingerprint scan was successful, rejects with an error code (see above).
+ */
+ TouchID.verifyFingerprintWithCustomPasswordFallback = function (message) { return; };
+ /**
+ * Show TouchID dialog with custom 'Enter Password' message and wait for a fingerprint scan. If user taps 'Enter Password' button, rejects with code '-3' (see above).
+ *
+ * @param {string} message The message to display
+ * @param {string} enterPasswordLabel Custom text for the 'Enter Password' button
+ * @return {Promise} Returns a Promise the resolves if the fingerprint scan was successful, rejects with an error code (see above).
+ */
+ TouchID.verifyFingerprintWithCustomPasswordFallbackAndEnterPasswordLabel = function (message, enterPasswordLabel) { return; };
+ __decorate([
+ plugin_1.Cordova()
+ ], TouchID.prototype, "isAvailable", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], TouchID, "verifyFingerprint", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], TouchID, "verifyFingerprintWithCustomPasswordFallback", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], TouchID, "verifyFingerprintWithCustomPasswordFallbackAndEnterPasswordLabel", null);
+ TouchID = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-touch-id',
+ pluginRef: 'plugins.touchid',
+ repo: 'https://github.com/EddyVerbruggen/cordova-plugin-touch-id'
+ })
+ ], TouchID);
+ return TouchID;
+}());
+exports.TouchID = TouchID;
+
+},{"./plugin":48}],60:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+/**
+ * @name Vibration
+ * @description Vibrates the device
+ * @usage
+ * ```ts
+ * import {Vibration} from 'ionic-native';
+ *
+ *
+ *
+ * // Vibrate the device for a second
+ * Vibration.vibrate(1000);
+ *
+ * // Vibrate 2 seconds
+ * // Pause for 1 second
+ * // Vibrate for 2 seconds
+ * // Patterns work on Android and Windows only
+ * Vibration.vibrate([2000,1000,2000]);
+ *
+ * // Stop any current vibrations immediately
+ * // Works on Android and Windows only
+ * Vibration.vibrate(0);
+ * ```
+ */
+var Vibration = (function () {
+ function Vibration() {
+ }
+ /**
+ * Vibrates the device for given amount of time.
+ * @param time {Number|Array} Milliseconds to vibrate the device. If passed an array of numbers, it will define a vibration pattern. Pass 0 to stop any vibration immediately.
+ */
+ Vibration.vibrate = function (time) { };
+ __decorate([
+ plugin_1.Cordova({
+ sync: true
+ })
+ ], Vibration, "vibrate", null);
+ Vibration = __decorate([
+ plugin_1.Plugin({
+ plugin: 'cordova-plugin-vibration',
+ pluginRef: 'navigator',
+ repo: 'https://github.com/apache/cordova-plugin-vibration'
+ })
+ ], Vibration);
+ return Vibration;
+}());
+exports.Vibration = Vibration;
+
+},{"./plugin":48}],61:[function(require,module,exports){
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var plugin_1 = require('./plugin');
+var WebIntent = (function () {
+ function WebIntent() {
+ }
+ Object.defineProperty(WebIntent, "ACTION_VIEW", {
+ get: function () {
+ return window.plugins.webintent.ACTION_VIEW;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(WebIntent, "EXTRA_TEXT", {
+ get: function () {
+ return window.plugins.webintent.EXTRA_TEXT;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ WebIntent.startActivity = function (options) { return; };
+ WebIntent.hasExtra = function (extra) { return; };
+ WebIntent.getExtra = function (extra) { return; };
+ WebIntent.getUri = function () { return; };
+ ;
+ WebIntent.onNewIntent = function () { return; };
+ ;
+ WebIntent.sendBroadcast = function (options) { return; };
+ __decorate([
+ plugin_1.CordovaProperty
+ ], WebIntent, "ACTION_VIEW", null);
+ __decorate([
+ plugin_1.CordovaProperty
+ ], WebIntent, "EXTRA_TEXT", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], WebIntent, "startActivity", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], WebIntent, "hasExtra", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], WebIntent, "getExtra", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], WebIntent, "getUri", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], WebIntent, "onNewIntent", null);
+ __decorate([
+ plugin_1.Cordova()
+ ], WebIntent, "sendBroadcast", null);
+ WebIntent = __decorate([
+ plugin_1.Plugin({
+ plugin: 'https://github.com/Initsogar/cordova-webintent.git',
+ pluginRef: 'window.plugins.webintent',
+ repo: 'https://github.com/Initsogar/cordova-webintent.git'
+ })
+ ], WebIntent);
+ return WebIntent;
+}());
+exports.WebIntent = WebIntent;
+
+},{"./plugin":48}],62:[function(require,module,exports){
+"use strict";
+function get(obj, path) {
+ for (var i = 0, path = path.split('.'), len = path.length; i < len; i++) {
+ if (!obj) {
+ return null;
+ }
+ obj = obj[path[i]];
+ }
+ return obj;
+}
+exports.get = get;
+;
+
+},{}],63:[function(require,module,exports){
+"use strict";
+var root_1 = require('./util/root');
+var toSubscriber_1 = require('./util/toSubscriber');
+var $$observable = require('symbol-observable');
+/**
+ * A representation of any set of values over any amount of time. This the most basic building block
+ * of RxJS.
+ *
+ * @class Observable
+ */
+var Observable = (function () {
+ /**
+ * @constructor
+ * @param {Function} subscribe the function that is called when the Observable is
+ * initially subscribed to. This function is given a Subscriber, to which new values
+ * can be `next`ed, or an `error` method can be called to raise an error, or
+ * `complete` can be called to notify of a successful completion.
+ */
+ function Observable(subscribe) {
+ this._isScalar = false;
+ if (subscribe) {
+ this._subscribe = subscribe;
+ }
+ }
+ /**
+ * Creates a new Observable, with this Observable as the source, and the passed
+ * operator defined as the new observable's operator.
+ * @method lift
+ * @param {Operator} operator the operator defining the operation to take on the observable
+ * @return {Observable} a new observable with the Operator applied
+ */
+ Observable.prototype.lift = function (operator) {
+ var observable = new Observable();
+ observable.source = this;
+ observable.operator = operator;
+ return observable;
+ };
+ /**
+ * Registers handlers for handling emitted values, error and completions from the observable, and
+ * executes the observable's subscriber function, which will take action to set up the underlying data stream
+ * @method subscribe
+ * @param {PartialObserver|Function} observerOrNext (optional) either an observer defining all functions to be called,
+ * or the first of three possible handlers, which is the handler for each value emitted from the observable.
+ * @param {Function} error (optional) a handler for a terminal event resulting from an error. If no error handler is provided,
+ * the error will be thrown as unhandled
+ * @param {Function} complete (optional) a handler for a terminal event resulting from successful completion.
+ * @return {ISubscription} a subscription reference to the registered handlers
+ */
+ Observable.prototype.subscribe = function (observerOrNext, error, complete) {
+ var operator = this.operator;
+ var sink = toSubscriber_1.toSubscriber(observerOrNext, error, complete);
+ if (operator) {
+ operator.call(sink, this);
+ }
+ else {
+ sink.add(this._subscribe(sink));
+ }
+ if (sink.syncErrorThrowable) {
+ sink.syncErrorThrowable = false;
+ if (sink.syncErrorThrown) {
+ throw sink.syncErrorValue;
+ }
+ }
+ return sink;
+ };
+ /**
+ * @method forEach
+ * @param {Function} next a handler for each value emitted by the observable
+ * @param {PromiseConstructor} [PromiseCtor] a constructor function used to instantiate the Promise
+ * @return {Promise} a promise that either resolves on observable completion or
+ * rejects with the handled error
+ */
+ Observable.prototype.forEach = function (next, PromiseCtor) {
+ var _this = this;
+ if (!PromiseCtor) {
+ if (root_1.root.Rx && root_1.root.Rx.config && root_1.root.Rx.config.Promise) {
+ PromiseCtor = root_1.root.Rx.config.Promise;
+ }
+ else if (root_1.root.Promise) {
+ PromiseCtor = root_1.root.Promise;
+ }
+ }
+ if (!PromiseCtor) {
+ throw new Error('no Promise impl found');
+ }
+ return new PromiseCtor(function (resolve, reject) {
+ var subscription = _this.subscribe(function (value) {
+ if (subscription) {
+ // if there is a subscription, then we can surmise
+ // the next handling is asynchronous. Any errors thrown
+ // need to be rejected explicitly and unsubscribe must be
+ // called manually
+ try {
+ next(value);
+ }
+ catch (err) {
+ reject(err);
+ subscription.unsubscribe();
+ }
+ }
+ else {
+ // if there is NO subscription, then we're getting a nexted
+ // value synchronously during subscription. We can just call it.
+ // If it errors, Observable's `subscribe` imple will ensure the
+ // unsubscription logic is called, then synchronously rethrow the error.
+ // After that, Promise will trap the error and send it
+ // down the rejection path.
+ next(value);
+ }
+ }, reject, resolve);
+ });
+ };
+ Observable.prototype._subscribe = function (subscriber) {
+ return this.source.subscribe(subscriber);
+ };
+ /**
+ * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable
+ * @method Symbol.observable
+ * @return {Observable} this instance of the observable
+ */
+ Observable.prototype[$$observable] = function () {
+ return this;
+ };
+ // HACK: Since TypeScript inherits static properties too, we have to
+ // fight against TypeScript here so Subject can have a different static create signature
+ /**
+ * Creates a new cold Observable by calling the Observable constructor
+ * @static true
+ * @owner Observable
+ * @method create
+ * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor
+ * @return {Observable} a new cold observable
+ */
+ Observable.create = function (subscribe) {
+ return new Observable(subscribe);
+ };
+ return Observable;
+}());
+exports.Observable = Observable;
+
+},{"./util/root":75,"./util/toSubscriber":76,"symbol-observable":67}],64:[function(require,module,exports){
+"use strict";
+exports.empty = {
+ isUnsubscribed: true,
+ next: function (value) { },
+ error: function (err) { throw err; },
+ complete: function () { }
+};
+
+},{}],65:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || function (d, b) {
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+};
+var isFunction_1 = require('./util/isFunction');
+var Subscription_1 = require('./Subscription');
+var Observer_1 = require('./Observer');
+var rxSubscriber_1 = require('./symbol/rxSubscriber');
+/**
+ * Implements the {@link Observer} interface and extends the
+ * {@link Subscription} class. While the {@link Observer} is the public API for
+ * consuming the values of an {@link Observable}, all Observers get converted to
+ * a Subscriber, in order to provide Subscription-like capabilities such as
+ * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for
+ * implementing operators, but it is rarely used as a public API.
+ *
+ * @class Subscriber
+ */
+var Subscriber = (function (_super) {
+ __extends(Subscriber, _super);
+ /**
+ * @param {Observer|function(value: T): void} [destinationOrNext] A partially
+ * defined Observer or a `next` callback function.
+ * @param {function(e: ?any): void} [error] The `error` callback of an
+ * Observer.
+ * @param {function(): void} [complete] The `complete` callback of an
+ * Observer.
+ */
+ function Subscriber(destinationOrNext, error, complete) {
+ _super.call(this);
+ this.syncErrorValue = null;
+ this.syncErrorThrown = false;
+ this.syncErrorThrowable = false;
+ this.isStopped = false;
+ switch (arguments.length) {
+ case 0:
+ this.destination = Observer_1.empty;
+ break;
+ case 1:
+ if (!destinationOrNext) {
+ this.destination = Observer_1.empty;
+ break;
+ }
+ if (typeof destinationOrNext === 'object') {
+ if (destinationOrNext instanceof Subscriber) {
+ this.destination = destinationOrNext;
+ this.destination.add(this);
+ }
+ else {
+ this.syncErrorThrowable = true;
+ this.destination = new SafeSubscriber(this, destinationOrNext);
+ }
+ break;
+ }
+ default:
+ this.syncErrorThrowable = true;
+ this.destination = new SafeSubscriber(this, destinationOrNext, error, complete);
+ break;
+ }
+ }
+ Subscriber.prototype[rxSubscriber_1.$$rxSubscriber] = function () { return this; };
+ /**
+ * A static factory for a Subscriber, given a (potentially partial) definition
+ * of an Observer.
+ * @param {function(x: ?T): void} [next] The `next` callback of an Observer.
+ * @param {function(e: ?any): void} [error] The `error` callback of an
+ * Observer.
+ * @param {function(): void} [complete] The `complete` callback of an
+ * Observer.
+ * @return {Subscriber} A Subscriber wrapping the (partially defined)
+ * Observer represented by the given arguments.
+ */
+ Subscriber.create = function (next, error, complete) {
+ var subscriber = new Subscriber(next, error, complete);
+ subscriber.syncErrorThrowable = false;
+ return subscriber;
+ };
+ /**
+ * The {@link Observer} callback to receive notifications of type `next` from
+ * the Observable, with a value. The Observable may call this method 0 or more
+ * times.
+ * @param {T} [value] The `next` value.
+ * @return {void}
+ */
+ Subscriber.prototype.next = function (value) {
+ if (!this.isStopped) {
+ this._next(value);
+ }
+ };
+ /**
+ * The {@link Observer} callback to receive notifications of type `error` from
+ * the Observable, with an attached {@link Error}. Notifies the Observer that
+ * the Observable has experienced an error condition.
+ * @param {any} [err] The `error` exception.
+ * @return {void}
+ */
+ Subscriber.prototype.error = function (err) {
+ if (!this.isStopped) {
+ this.isStopped = true;
+ this._error(err);
+ }
+ };
+ /**
+ * The {@link Observer} callback to receive a valueless notification of type
+ * `complete` from the Observable. Notifies the Observer that the Observable
+ * has finished sending push-based notifications.
+ * @return {void}
+ */
+ Subscriber.prototype.complete = function () {
+ if (!this.isStopped) {
+ this.isStopped = true;
+ this._complete();
+ }
+ };
+ Subscriber.prototype.unsubscribe = function () {
+ if (this.isUnsubscribed) {
+ return;
+ }
+ this.isStopped = true;
+ _super.prototype.unsubscribe.call(this);
+ };
+ Subscriber.prototype._next = function (value) {
+ this.destination.next(value);
+ };
+ Subscriber.prototype._error = function (err) {
+ this.destination.error(err);
+ this.unsubscribe();
+ };
+ Subscriber.prototype._complete = function () {
+ this.destination.complete();
+ this.unsubscribe();
+ };
+ return Subscriber;
+}(Subscription_1.Subscription));
+exports.Subscriber = Subscriber;
+/**
+ * We need this JSDoc comment for affecting ESDoc.
+ * @ignore
+ * @extends {Ignored}
+ */
+var SafeSubscriber = (function (_super) {
+ __extends(SafeSubscriber, _super);
+ function SafeSubscriber(_parent, observerOrNext, error, complete) {
+ _super.call(this);
+ this._parent = _parent;
+ var next;
+ var context = this;
+ if (isFunction_1.isFunction(observerOrNext)) {
+ next = observerOrNext;
+ }
+ else if (observerOrNext) {
+ context = observerOrNext;
+ next = observerOrNext.next;
+ error = observerOrNext.error;
+ complete = observerOrNext.complete;
+ if (isFunction_1.isFunction(context.unsubscribe)) {
+ this.add(context.unsubscribe.bind(context));
+ }
+ context.unsubscribe = this.unsubscribe.bind(this);
+ }
+ this._context = context;
+ this._next = next;
+ this._error = error;
+ this._complete = complete;
+ }
+ SafeSubscriber.prototype.next = function (value) {
+ if (!this.isStopped && this._next) {
+ var _parent = this._parent;
+ if (!_parent.syncErrorThrowable) {
+ this.__tryOrUnsub(this._next, value);
+ }
+ else if (this.__tryOrSetError(_parent, this._next, value)) {
+ this.unsubscribe();
+ }
+ }
+ };
+ SafeSubscriber.prototype.error = function (err) {
+ if (!this.isStopped) {
+ var _parent = this._parent;
+ if (this._error) {
+ if (!_parent.syncErrorThrowable) {
+ this.__tryOrUnsub(this._error, err);
+ this.unsubscribe();
+ }
+ else {
+ this.__tryOrSetError(_parent, this._error, err);
+ this.unsubscribe();
+ }
+ }
+ else if (!_parent.syncErrorThrowable) {
+ this.unsubscribe();
+ throw err;
+ }
+ else {
+ _parent.syncErrorValue = err;
+ _parent.syncErrorThrown = true;
+ this.unsubscribe();
+ }
+ }
+ };
+ SafeSubscriber.prototype.complete = function () {
+ if (!this.isStopped) {
+ var _parent = this._parent;
+ if (this._complete) {
+ if (!_parent.syncErrorThrowable) {
+ this.__tryOrUnsub(this._complete);
+ this.unsubscribe();
+ }
+ else {
+ this.__tryOrSetError(_parent, this._complete);
+ this.unsubscribe();
+ }
+ }
+ else {
+ this.unsubscribe();
+ }
+ }
+ };
+ SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) {
+ try {
+ fn.call(this._context, value);
+ }
+ catch (err) {
+ this.unsubscribe();
+ throw err;
+ }
+ };
+ SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) {
+ try {
+ fn.call(this._context, value);
+ }
+ catch (err) {
+ parent.syncErrorValue = err;
+ parent.syncErrorThrown = true;
+ return true;
+ }
+ return false;
+ };
+ SafeSubscriber.prototype._unsubscribe = function () {
+ var _parent = this._parent;
+ this._context = null;
+ this._parent = null;
+ _parent.unsubscribe();
+ };
+ return SafeSubscriber;
+}(Subscriber));
+
+},{"./Observer":64,"./Subscription":66,"./symbol/rxSubscriber":69,"./util/isFunction":73}],66:[function(require,module,exports){
+"use strict";
+var isArray_1 = require('./util/isArray');
+var isObject_1 = require('./util/isObject');
+var isFunction_1 = require('./util/isFunction');
+var tryCatch_1 = require('./util/tryCatch');
+var errorObject_1 = require('./util/errorObject');
+var UnsubscriptionError_1 = require('./util/UnsubscriptionError');
+/**
+ * Represents a disposable resource, such as the execution of an Observable. A
+ * Subscription has one important method, `unsubscribe`, that takes no argument
+ * and just disposes the resource held by the subscription.
+ *
+ * Additionally, subscriptions may be grouped together through the `add()`
+ * method, which will attach a child Subscription to the current Subscription.
+ * When a Subscription is unsubscribed, all its children (and its grandchildren)
+ * will be unsubscribed as well.
+ *
+ * @class Subscription
+ */
+var Subscription = (function () {
+ /**
+ * @param {function(): void} [unsubscribe] A function describing how to
+ * perform the disposal of resources when the `unsubscribe` method is called.
+ */
+ function Subscription(unsubscribe) {
+ /**
+ * A flag to indicate whether this Subscription has already been unsubscribed.
+ * @type {boolean}
+ */
+ this.isUnsubscribed = false;
+ if (unsubscribe) {
+ this._unsubscribe = unsubscribe;
+ }
+ }
+ /**
+ * Disposes the resources held by the subscription. May, for instance, cancel
+ * an ongoing Observable execution or cancel any other type of work that
+ * started when the Subscription was created.
+ * @return {void}
+ */
+ Subscription.prototype.unsubscribe = function () {
+ var hasErrors = false;
+ var errors;
+ if (this.isUnsubscribed) {
+ return;
+ }
+ this.isUnsubscribed = true;
+ var _a = this, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions;
+ this._subscriptions = null;
+ if (isFunction_1.isFunction(_unsubscribe)) {
+ var trial = tryCatch_1.tryCatch(_unsubscribe).call(this);
+ if (trial === errorObject_1.errorObject) {
+ hasErrors = true;
+ (errors = errors || []).push(errorObject_1.errorObject.e);
+ }
+ }
+ if (isArray_1.isArray(_subscriptions)) {
+ var index = -1;
+ var len = _subscriptions.length;
+ while (++index < len) {
+ var sub = _subscriptions[index];
+ if (isObject_1.isObject(sub)) {
+ var trial = tryCatch_1.tryCatch(sub.unsubscribe).call(sub);
+ if (trial === errorObject_1.errorObject) {
+ hasErrors = true;
+ errors = errors || [];
+ var err = errorObject_1.errorObject.e;
+ if (err instanceof UnsubscriptionError_1.UnsubscriptionError) {
+ errors = errors.concat(err.errors);
+ }
+ else {
+ errors.push(err);
+ }
+ }
+ }
+ }
+ }
+ if (hasErrors) {
+ throw new UnsubscriptionError_1.UnsubscriptionError(errors);
+ }
+ };
+ /**
+ * Adds a tear down to be called during the unsubscribe() of this
+ * Subscription.
+ *
+ * If the tear down being added is a subscription that is already
+ * unsubscribed, is the same reference `add` is being called on, or is
+ * `Subscription.EMPTY`, it will not be added.
+ *
+ * If this subscription is already in an `isUnsubscribed` state, the passed
+ * tear down logic will be executed immediately.
+ *
+ * @param {TeardownLogic} teardown The additional logic to execute on
+ * teardown.
+ * @return {Subscription} Returns the Subscription used or created to be
+ * added to the inner subscriptions list. This Subscription can be used with
+ * `remove()` to remove the passed teardown logic from the inner subscriptions
+ * list.
+ */
+ Subscription.prototype.add = function (teardown) {
+ if (!teardown || (teardown === this) || (teardown === Subscription.EMPTY)) {
+ return;
+ }
+ var sub = teardown;
+ switch (typeof teardown) {
+ case 'function':
+ sub = new Subscription(teardown);
+ case 'object':
+ if (sub.isUnsubscribed || typeof sub.unsubscribe !== 'function') {
+ break;
+ }
+ else if (this.isUnsubscribed) {
+ sub.unsubscribe();
+ }
+ else {
+ (this._subscriptions || (this._subscriptions = [])).push(sub);
+ }
+ break;
+ default:
+ throw new Error('Unrecognized teardown ' + teardown + ' added to Subscription.');
+ }
+ return sub;
+ };
+ /**
+ * Removes a Subscription from the internal list of subscriptions that will
+ * unsubscribe during the unsubscribe process of this Subscription.
+ * @param {Subscription} subscription The subscription to remove.
+ * @return {void}
+ */
+ Subscription.prototype.remove = function (subscription) {
+ // HACK: This might be redundant because of the logic in `add()`
+ if (subscription == null || (subscription === this) || (subscription === Subscription.EMPTY)) {
+ return;
+ }
+ var subscriptions = this._subscriptions;
+ if (subscriptions) {
+ var subscriptionIndex = subscriptions.indexOf(subscription);
+ if (subscriptionIndex !== -1) {
+ subscriptions.splice(subscriptionIndex, 1);
+ }
+ }
+ };
+ Subscription.EMPTY = (function (empty) {
+ empty.isUnsubscribed = true;
+ return empty;
+ }(new Subscription()));
+ return Subscription;
+}());
+exports.Subscription = Subscription;
+
+},{"./util/UnsubscriptionError":70,"./util/errorObject":71,"./util/isArray":72,"./util/isFunction":73,"./util/isObject":74,"./util/tryCatch":77}],67:[function(require,module,exports){
+(function (global){
+/* global window */
+'use strict';
+
+module.exports = require('./ponyfill')(global || window || this);
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./ponyfill":68}],68:[function(require,module,exports){
+'use strict';
+
+module.exports = function symbolObservablePonyfill(root) {
+ var result;
+ var Symbol = root.Symbol;
+
+ if (typeof Symbol === 'function') {
+ if (Symbol.observable) {
+ result = Symbol.observable;
+ } else {
+ result = Symbol('observable');
+ Symbol.observable = result;
+ }
+ } else {
+ result = '@@observable';
+ }
+
+ return result;
+};
+
+},{}],69:[function(require,module,exports){
+"use strict";
+var root_1 = require('../util/root');
+var Symbol = root_1.root.Symbol;
+exports.$$rxSubscriber = (typeof Symbol === 'function' && typeof Symbol.for === 'function') ?
+ Symbol.for('rxSubscriber') : '@@rxSubscriber';
+
+},{"../util/root":75}],70:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || function (d, b) {
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+};
+/**
+ * An error thrown when one or more errors have occurred during the
+ * `unsubscribe` of a {@link Subscription}.
+ */
+var UnsubscriptionError = (function (_super) {
+ __extends(UnsubscriptionError, _super);
+ function UnsubscriptionError(errors) {
+ _super.call(this);
+ this.errors = errors;
+ this.name = 'UnsubscriptionError';
+ this.message = errors ? errors.length + " errors occurred during unsubscription:\n" + errors.map(function (err, i) { return ((i + 1) + ") " + err.toString()); }).join('\n') : '';
+ }
+ return UnsubscriptionError;
+}(Error));
+exports.UnsubscriptionError = UnsubscriptionError;
+
+},{}],71:[function(require,module,exports){
+"use strict";
+// typeof any so that it we don't have to cast when comparing a result to the error object
+exports.errorObject = { e: {} };
+
+},{}],72:[function(require,module,exports){
+"use strict";
+exports.isArray = Array.isArray || (function (x) { return x && typeof x.length === 'number'; });
+
+},{}],73:[function(require,module,exports){
+"use strict";
+function isFunction(x) {
+ return typeof x === 'function';
+}
+exports.isFunction = isFunction;
+
+},{}],74:[function(require,module,exports){
+"use strict";
+function isObject(x) {
+ return x != null && typeof x === 'object';
+}
+exports.isObject = isObject;
+
+},{}],75:[function(require,module,exports){
+(function (global){
+"use strict";
+var objectTypes = {
+ 'boolean': false,
+ 'function': true,
+ 'object': true,
+ 'number': false,
+ 'string': false,
+ 'undefined': false
+};
+exports.root = (objectTypes[typeof self] && self) || (objectTypes[typeof window] && window);
+/* tslint:disable:no-unused-variable */
+var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;
+var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;
+var freeGlobal = objectTypes[typeof global] && global;
+if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {
+ exports.root = freeGlobal;
+}
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],76:[function(require,module,exports){
+"use strict";
+var Subscriber_1 = require('../Subscriber');
+var rxSubscriber_1 = require('../symbol/rxSubscriber');
+function toSubscriber(nextOrObserver, error, complete) {
+ if (nextOrObserver) {
+ if (nextOrObserver instanceof Subscriber_1.Subscriber) {
+ return nextOrObserver;
+ }
+ if (nextOrObserver[rxSubscriber_1.$$rxSubscriber]) {
+ return nextOrObserver[rxSubscriber_1.$$rxSubscriber]();
+ }
+ }
+ if (!nextOrObserver && !error && !complete) {
+ return new Subscriber_1.Subscriber();
+ }
+ return new Subscriber_1.Subscriber(nextOrObserver, error, complete);
+}
+exports.toSubscriber = toSubscriber;
+
+},{"../Subscriber":65,"../symbol/rxSubscriber":69}],77:[function(require,module,exports){
+"use strict";
+var errorObject_1 = require('./errorObject');
+var tryCatchTarget;
+function tryCatcher() {
+ try {
+ return tryCatchTarget.apply(this, arguments);
+ }
+ catch (e) {
+ errorObject_1.errorObject.e = e;
+ return errorObject_1.errorObject;
+ }
+}
+function tryCatch(fn) {
+ tryCatchTarget = fn;
+ return tryCatcher;
+}
+exports.tryCatch = tryCatch;
+;
+
+},{"./errorObject":71}]},{},[1]);
diff --git a/www/lib/ionic/css/ionic.css b/www/lib/ionic/css/ionic.css
new file mode 100644
index 0000000..9dd5268
--- /dev/null
+++ b/www/lib/ionic/css/ionic.css
@@ -0,0 +1,9813 @@
+@charset "UTF-8";
+/*!
+ * Copyright 2015 Drifty Co.
+ * http://drifty.com/
+ *
+ * Ionic, v1.3.1
+ * A powerful HTML5 mobile app framework.
+ * http://ionicframework.com/
+ *
+ * By @maxlynch, @benjsperry, @adamdbradley <3
+ *
+ * Licensed under the MIT license. Please see LICENSE for more information.
+ *
+ */
+/*!
+ Ionicons, v2.0.1
+ Created by Ben Sperry for the Ionic Framework, http://ionicons.com/
+ https://twitter.com/benjsperry https://twitter.com/ionicframework
+ MIT License: https://github.com/driftyco/ionicons
+
+ Android-style icons originally built by Google’s
+ Material Design Icons: https://github.com/google/material-design-icons
+ used under CC BY http://creativecommons.org/licenses/by/4.0/
+ Modified icons to fit ionicon’s grid from original.
+*/
+@font-face {
+ font-family: "Ionicons";
+ src: url("../fonts/ionicons.eot?v=2.0.1");
+ src: url("../fonts/ionicons.eot?v=2.0.1#iefix") format("embedded-opentype"), url("../fonts/ionicons.ttf?v=2.0.1") format("truetype"), url("../fonts/ionicons.woff?v=2.0.1") format("woff"), url("../fonts/ionicons.woff") format("woff"), url("../fonts/ionicons.svg?v=2.0.1#Ionicons") format("svg");
+ font-weight: normal;
+ font-style: normal; }
+
+.ion, .ionicons,
+.ion-alert:before,
+.ion-alert-circled:before,
+.ion-android-add:before,
+.ion-android-add-circle:before,
+.ion-android-alarm-clock:before,
+.ion-android-alert:before,
+.ion-android-apps:before,
+.ion-android-archive:before,
+.ion-android-arrow-back:before,
+.ion-android-arrow-down:before,
+.ion-android-arrow-dropdown:before,
+.ion-android-arrow-dropdown-circle:before,
+.ion-android-arrow-dropleft:before,
+.ion-android-arrow-dropleft-circle:before,
+.ion-android-arrow-dropright:before,
+.ion-android-arrow-dropright-circle:before,
+.ion-android-arrow-dropup:before,
+.ion-android-arrow-dropup-circle:before,
+.ion-android-arrow-forward:before,
+.ion-android-arrow-up:before,
+.ion-android-attach:before,
+.ion-android-bar:before,
+.ion-android-bicycle:before,
+.ion-android-boat:before,
+.ion-android-bookmark:before,
+.ion-android-bulb:before,
+.ion-android-bus:before,
+.ion-android-calendar:before,
+.ion-android-call:before,
+.ion-android-camera:before,
+.ion-android-cancel:before,
+.ion-android-car:before,
+.ion-android-cart:before,
+.ion-android-chat:before,
+.ion-android-checkbox:before,
+.ion-android-checkbox-blank:before,
+.ion-android-checkbox-outline:before,
+.ion-android-checkbox-outline-blank:before,
+.ion-android-checkmark-circle:before,
+.ion-android-clipboard:before,
+.ion-android-close:before,
+.ion-android-cloud:before,
+.ion-android-cloud-circle:before,
+.ion-android-cloud-done:before,
+.ion-android-cloud-outline:before,
+.ion-android-color-palette:before,
+.ion-android-compass:before,
+.ion-android-contact:before,
+.ion-android-contacts:before,
+.ion-android-contract:before,
+.ion-android-create:before,
+.ion-android-delete:before,
+.ion-android-desktop:before,
+.ion-android-document:before,
+.ion-android-done:before,
+.ion-android-done-all:before,
+.ion-android-download:before,
+.ion-android-drafts:before,
+.ion-android-exit:before,
+.ion-android-expand:before,
+.ion-android-favorite:before,
+.ion-android-favorite-outline:before,
+.ion-android-film:before,
+.ion-android-folder:before,
+.ion-android-folder-open:before,
+.ion-android-funnel:before,
+.ion-android-globe:before,
+.ion-android-hand:before,
+.ion-android-hangout:before,
+.ion-android-happy:before,
+.ion-android-home:before,
+.ion-android-image:before,
+.ion-android-laptop:before,
+.ion-android-list:before,
+.ion-android-locate:before,
+.ion-android-lock:before,
+.ion-android-mail:before,
+.ion-android-map:before,
+.ion-android-menu:before,
+.ion-android-microphone:before,
+.ion-android-microphone-off:before,
+.ion-android-more-horizontal:before,
+.ion-android-more-vertical:before,
+.ion-android-navigate:before,
+.ion-android-notifications:before,
+.ion-android-notifications-none:before,
+.ion-android-notifications-off:before,
+.ion-android-open:before,
+.ion-android-options:before,
+.ion-android-people:before,
+.ion-android-person:before,
+.ion-android-person-add:before,
+.ion-android-phone-landscape:before,
+.ion-android-phone-portrait:before,
+.ion-android-pin:before,
+.ion-android-plane:before,
+.ion-android-playstore:before,
+.ion-android-print:before,
+.ion-android-radio-button-off:before,
+.ion-android-radio-button-on:before,
+.ion-android-refresh:before,
+.ion-android-remove:before,
+.ion-android-remove-circle:before,
+.ion-android-restaurant:before,
+.ion-android-sad:before,
+.ion-android-search:before,
+.ion-android-send:before,
+.ion-android-settings:before,
+.ion-android-share:before,
+.ion-android-share-alt:before,
+.ion-android-star:before,
+.ion-android-star-half:before,
+.ion-android-star-outline:before,
+.ion-android-stopwatch:before,
+.ion-android-subway:before,
+.ion-android-sunny:before,
+.ion-android-sync:before,
+.ion-android-textsms:before,
+.ion-android-time:before,
+.ion-android-train:before,
+.ion-android-unlock:before,
+.ion-android-upload:before,
+.ion-android-volume-down:before,
+.ion-android-volume-mute:before,
+.ion-android-volume-off:before,
+.ion-android-volume-up:before,
+.ion-android-walk:before,
+.ion-android-warning:before,
+.ion-android-watch:before,
+.ion-android-wifi:before,
+.ion-aperture:before,
+.ion-archive:before,
+.ion-arrow-down-a:before,
+.ion-arrow-down-b:before,
+.ion-arrow-down-c:before,
+.ion-arrow-expand:before,
+.ion-arrow-graph-down-left:before,
+.ion-arrow-graph-down-right:before,
+.ion-arrow-graph-up-left:before,
+.ion-arrow-graph-up-right:before,
+.ion-arrow-left-a:before,
+.ion-arrow-left-b:before,
+.ion-arrow-left-c:before,
+.ion-arrow-move:before,
+.ion-arrow-resize:before,
+.ion-arrow-return-left:before,
+.ion-arrow-return-right:before,
+.ion-arrow-right-a:before,
+.ion-arrow-right-b:before,
+.ion-arrow-right-c:before,
+.ion-arrow-shrink:before,
+.ion-arrow-swap:before,
+.ion-arrow-up-a:before,
+.ion-arrow-up-b:before,
+.ion-arrow-up-c:before,
+.ion-asterisk:before,
+.ion-at:before,
+.ion-backspace:before,
+.ion-backspace-outline:before,
+.ion-bag:before,
+.ion-battery-charging:before,
+.ion-battery-empty:before,
+.ion-battery-full:before,
+.ion-battery-half:before,
+.ion-battery-low:before,
+.ion-beaker:before,
+.ion-beer:before,
+.ion-bluetooth:before,
+.ion-bonfire:before,
+.ion-bookmark:before,
+.ion-bowtie:before,
+.ion-briefcase:before,
+.ion-bug:before,
+.ion-calculator:before,
+.ion-calendar:before,
+.ion-camera:before,
+.ion-card:before,
+.ion-cash:before,
+.ion-chatbox:before,
+.ion-chatbox-working:before,
+.ion-chatboxes:before,
+.ion-chatbubble:before,
+.ion-chatbubble-working:before,
+.ion-chatbubbles:before,
+.ion-checkmark:before,
+.ion-checkmark-circled:before,
+.ion-checkmark-round:before,
+.ion-chevron-down:before,
+.ion-chevron-left:before,
+.ion-chevron-right:before,
+.ion-chevron-up:before,
+.ion-clipboard:before,
+.ion-clock:before,
+.ion-close:before,
+.ion-close-circled:before,
+.ion-close-round:before,
+.ion-closed-captioning:before,
+.ion-cloud:before,
+.ion-code:before,
+.ion-code-download:before,
+.ion-code-working:before,
+.ion-coffee:before,
+.ion-compass:before,
+.ion-compose:before,
+.ion-connection-bars:before,
+.ion-contrast:before,
+.ion-crop:before,
+.ion-cube:before,
+.ion-disc:before,
+.ion-document:before,
+.ion-document-text:before,
+.ion-drag:before,
+.ion-earth:before,
+.ion-easel:before,
+.ion-edit:before,
+.ion-egg:before,
+.ion-eject:before,
+.ion-email:before,
+.ion-email-unread:before,
+.ion-erlenmeyer-flask:before,
+.ion-erlenmeyer-flask-bubbles:before,
+.ion-eye:before,
+.ion-eye-disabled:before,
+.ion-female:before,
+.ion-filing:before,
+.ion-film-marker:before,
+.ion-fireball:before,
+.ion-flag:before,
+.ion-flame:before,
+.ion-flash:before,
+.ion-flash-off:before,
+.ion-folder:before,
+.ion-fork:before,
+.ion-fork-repo:before,
+.ion-forward:before,
+.ion-funnel:before,
+.ion-gear-a:before,
+.ion-gear-b:before,
+.ion-grid:before,
+.ion-hammer:before,
+.ion-happy:before,
+.ion-happy-outline:before,
+.ion-headphone:before,
+.ion-heart:before,
+.ion-heart-broken:before,
+.ion-help:before,
+.ion-help-buoy:before,
+.ion-help-circled:before,
+.ion-home:before,
+.ion-icecream:before,
+.ion-image:before,
+.ion-images:before,
+.ion-information:before,
+.ion-information-circled:before,
+.ion-ionic:before,
+.ion-ios-alarm:before,
+.ion-ios-alarm-outline:before,
+.ion-ios-albums:before,
+.ion-ios-albums-outline:before,
+.ion-ios-americanfootball:before,
+.ion-ios-americanfootball-outline:before,
+.ion-ios-analytics:before,
+.ion-ios-analytics-outline:before,
+.ion-ios-arrow-back:before,
+.ion-ios-arrow-down:before,
+.ion-ios-arrow-forward:before,
+.ion-ios-arrow-left:before,
+.ion-ios-arrow-right:before,
+.ion-ios-arrow-thin-down:before,
+.ion-ios-arrow-thin-left:before,
+.ion-ios-arrow-thin-right:before,
+.ion-ios-arrow-thin-up:before,
+.ion-ios-arrow-up:before,
+.ion-ios-at:before,
+.ion-ios-at-outline:before,
+.ion-ios-barcode:before,
+.ion-ios-barcode-outline:before,
+.ion-ios-baseball:before,
+.ion-ios-baseball-outline:before,
+.ion-ios-basketball:before,
+.ion-ios-basketball-outline:before,
+.ion-ios-bell:before,
+.ion-ios-bell-outline:before,
+.ion-ios-body:before,
+.ion-ios-body-outline:before,
+.ion-ios-bolt:before,
+.ion-ios-bolt-outline:before,
+.ion-ios-book:before,
+.ion-ios-book-outline:before,
+.ion-ios-bookmarks:before,
+.ion-ios-bookmarks-outline:before,
+.ion-ios-box:before,
+.ion-ios-box-outline:before,
+.ion-ios-briefcase:before,
+.ion-ios-briefcase-outline:before,
+.ion-ios-browsers:before,
+.ion-ios-browsers-outline:before,
+.ion-ios-calculator:before,
+.ion-ios-calculator-outline:before,
+.ion-ios-calendar:before,
+.ion-ios-calendar-outline:before,
+.ion-ios-camera:before,
+.ion-ios-camera-outline:before,
+.ion-ios-cart:before,
+.ion-ios-cart-outline:before,
+.ion-ios-chatboxes:before,
+.ion-ios-chatboxes-outline:before,
+.ion-ios-chatbubble:before,
+.ion-ios-chatbubble-outline:before,
+.ion-ios-checkmark:before,
+.ion-ios-checkmark-empty:before,
+.ion-ios-checkmark-outline:before,
+.ion-ios-circle-filled:before,
+.ion-ios-circle-outline:before,
+.ion-ios-clock:before,
+.ion-ios-clock-outline:before,
+.ion-ios-close:before,
+.ion-ios-close-empty:before,
+.ion-ios-close-outline:before,
+.ion-ios-cloud:before,
+.ion-ios-cloud-download:before,
+.ion-ios-cloud-download-outline:before,
+.ion-ios-cloud-outline:before,
+.ion-ios-cloud-upload:before,
+.ion-ios-cloud-upload-outline:before,
+.ion-ios-cloudy:before,
+.ion-ios-cloudy-night:before,
+.ion-ios-cloudy-night-outline:before,
+.ion-ios-cloudy-outline:before,
+.ion-ios-cog:before,
+.ion-ios-cog-outline:before,
+.ion-ios-color-filter:before,
+.ion-ios-color-filter-outline:before,
+.ion-ios-color-wand:before,
+.ion-ios-color-wand-outline:before,
+.ion-ios-compose:before,
+.ion-ios-compose-outline:before,
+.ion-ios-contact:before,
+.ion-ios-contact-outline:before,
+.ion-ios-copy:before,
+.ion-ios-copy-outline:before,
+.ion-ios-crop:before,
+.ion-ios-crop-strong:before,
+.ion-ios-download:before,
+.ion-ios-download-outline:before,
+.ion-ios-drag:before,
+.ion-ios-email:before,
+.ion-ios-email-outline:before,
+.ion-ios-eye:before,
+.ion-ios-eye-outline:before,
+.ion-ios-fastforward:before,
+.ion-ios-fastforward-outline:before,
+.ion-ios-filing:before,
+.ion-ios-filing-outline:before,
+.ion-ios-film:before,
+.ion-ios-film-outline:before,
+.ion-ios-flag:before,
+.ion-ios-flag-outline:before,
+.ion-ios-flame:before,
+.ion-ios-flame-outline:before,
+.ion-ios-flask:before,
+.ion-ios-flask-outline:before,
+.ion-ios-flower:before,
+.ion-ios-flower-outline:before,
+.ion-ios-folder:before,
+.ion-ios-folder-outline:before,
+.ion-ios-football:before,
+.ion-ios-football-outline:before,
+.ion-ios-game-controller-a:before,
+.ion-ios-game-controller-a-outline:before,
+.ion-ios-game-controller-b:before,
+.ion-ios-game-controller-b-outline:before,
+.ion-ios-gear:before,
+.ion-ios-gear-outline:before,
+.ion-ios-glasses:before,
+.ion-ios-glasses-outline:before,
+.ion-ios-grid-view:before,
+.ion-ios-grid-view-outline:before,
+.ion-ios-heart:before,
+.ion-ios-heart-outline:before,
+.ion-ios-help:before,
+.ion-ios-help-empty:before,
+.ion-ios-help-outline:before,
+.ion-ios-home:before,
+.ion-ios-home-outline:before,
+.ion-ios-infinite:before,
+.ion-ios-infinite-outline:before,
+.ion-ios-information:before,
+.ion-ios-information-empty:before,
+.ion-ios-information-outline:before,
+.ion-ios-ionic-outline:before,
+.ion-ios-keypad:before,
+.ion-ios-keypad-outline:before,
+.ion-ios-lightbulb:before,
+.ion-ios-lightbulb-outline:before,
+.ion-ios-list:before,
+.ion-ios-list-outline:before,
+.ion-ios-location:before,
+.ion-ios-location-outline:before,
+.ion-ios-locked:before,
+.ion-ios-locked-outline:before,
+.ion-ios-loop:before,
+.ion-ios-loop-strong:before,
+.ion-ios-medical:before,
+.ion-ios-medical-outline:before,
+.ion-ios-medkit:before,
+.ion-ios-medkit-outline:before,
+.ion-ios-mic:before,
+.ion-ios-mic-off:before,
+.ion-ios-mic-outline:before,
+.ion-ios-minus:before,
+.ion-ios-minus-empty:before,
+.ion-ios-minus-outline:before,
+.ion-ios-monitor:before,
+.ion-ios-monitor-outline:before,
+.ion-ios-moon:before,
+.ion-ios-moon-outline:before,
+.ion-ios-more:before,
+.ion-ios-more-outline:before,
+.ion-ios-musical-note:before,
+.ion-ios-musical-notes:before,
+.ion-ios-navigate:before,
+.ion-ios-navigate-outline:before,
+.ion-ios-nutrition:before,
+.ion-ios-nutrition-outline:before,
+.ion-ios-paper:before,
+.ion-ios-paper-outline:before,
+.ion-ios-paperplane:before,
+.ion-ios-paperplane-outline:before,
+.ion-ios-partlysunny:before,
+.ion-ios-partlysunny-outline:before,
+.ion-ios-pause:before,
+.ion-ios-pause-outline:before,
+.ion-ios-paw:before,
+.ion-ios-paw-outline:before,
+.ion-ios-people:before,
+.ion-ios-people-outline:before,
+.ion-ios-person:before,
+.ion-ios-person-outline:before,
+.ion-ios-personadd:before,
+.ion-ios-personadd-outline:before,
+.ion-ios-photos:before,
+.ion-ios-photos-outline:before,
+.ion-ios-pie:before,
+.ion-ios-pie-outline:before,
+.ion-ios-pint:before,
+.ion-ios-pint-outline:before,
+.ion-ios-play:before,
+.ion-ios-play-outline:before,
+.ion-ios-plus:before,
+.ion-ios-plus-empty:before,
+.ion-ios-plus-outline:before,
+.ion-ios-pricetag:before,
+.ion-ios-pricetag-outline:before,
+.ion-ios-pricetags:before,
+.ion-ios-pricetags-outline:before,
+.ion-ios-printer:before,
+.ion-ios-printer-outline:before,
+.ion-ios-pulse:before,
+.ion-ios-pulse-strong:before,
+.ion-ios-rainy:before,
+.ion-ios-rainy-outline:before,
+.ion-ios-recording:before,
+.ion-ios-recording-outline:before,
+.ion-ios-redo:before,
+.ion-ios-redo-outline:before,
+.ion-ios-refresh:before,
+.ion-ios-refresh-empty:before,
+.ion-ios-refresh-outline:before,
+.ion-ios-reload:before,
+.ion-ios-reverse-camera:before,
+.ion-ios-reverse-camera-outline:before,
+.ion-ios-rewind:before,
+.ion-ios-rewind-outline:before,
+.ion-ios-rose:before,
+.ion-ios-rose-outline:before,
+.ion-ios-search:before,
+.ion-ios-search-strong:before,
+.ion-ios-settings:before,
+.ion-ios-settings-strong:before,
+.ion-ios-shuffle:before,
+.ion-ios-shuffle-strong:before,
+.ion-ios-skipbackward:before,
+.ion-ios-skipbackward-outline:before,
+.ion-ios-skipforward:before,
+.ion-ios-skipforward-outline:before,
+.ion-ios-snowy:before,
+.ion-ios-speedometer:before,
+.ion-ios-speedometer-outline:before,
+.ion-ios-star:before,
+.ion-ios-star-half:before,
+.ion-ios-star-outline:before,
+.ion-ios-stopwatch:before,
+.ion-ios-stopwatch-outline:before,
+.ion-ios-sunny:before,
+.ion-ios-sunny-outline:before,
+.ion-ios-telephone:before,
+.ion-ios-telephone-outline:before,
+.ion-ios-tennisball:before,
+.ion-ios-tennisball-outline:before,
+.ion-ios-thunderstorm:before,
+.ion-ios-thunderstorm-outline:before,
+.ion-ios-time:before,
+.ion-ios-time-outline:before,
+.ion-ios-timer:before,
+.ion-ios-timer-outline:before,
+.ion-ios-toggle:before,
+.ion-ios-toggle-outline:before,
+.ion-ios-trash:before,
+.ion-ios-trash-outline:before,
+.ion-ios-undo:before,
+.ion-ios-undo-outline:before,
+.ion-ios-unlocked:before,
+.ion-ios-unlocked-outline:before,
+.ion-ios-upload:before,
+.ion-ios-upload-outline:before,
+.ion-ios-videocam:before,
+.ion-ios-videocam-outline:before,
+.ion-ios-volume-high:before,
+.ion-ios-volume-low:before,
+.ion-ios-wineglass:before,
+.ion-ios-wineglass-outline:before,
+.ion-ios-world:before,
+.ion-ios-world-outline:before,
+.ion-ipad:before,
+.ion-iphone:before,
+.ion-ipod:before,
+.ion-jet:before,
+.ion-key:before,
+.ion-knife:before,
+.ion-laptop:before,
+.ion-leaf:before,
+.ion-levels:before,
+.ion-lightbulb:before,
+.ion-link:before,
+.ion-load-a:before,
+.ion-load-b:before,
+.ion-load-c:before,
+.ion-load-d:before,
+.ion-location:before,
+.ion-lock-combination:before,
+.ion-locked:before,
+.ion-log-in:before,
+.ion-log-out:before,
+.ion-loop:before,
+.ion-magnet:before,
+.ion-male:before,
+.ion-man:before,
+.ion-map:before,
+.ion-medkit:before,
+.ion-merge:before,
+.ion-mic-a:before,
+.ion-mic-b:before,
+.ion-mic-c:before,
+.ion-minus:before,
+.ion-minus-circled:before,
+.ion-minus-round:before,
+.ion-model-s:before,
+.ion-monitor:before,
+.ion-more:before,
+.ion-mouse:before,
+.ion-music-note:before,
+.ion-navicon:before,
+.ion-navicon-round:before,
+.ion-navigate:before,
+.ion-network:before,
+.ion-no-smoking:before,
+.ion-nuclear:before,
+.ion-outlet:before,
+.ion-paintbrush:before,
+.ion-paintbucket:before,
+.ion-paper-airplane:before,
+.ion-paperclip:before,
+.ion-pause:before,
+.ion-person:before,
+.ion-person-add:before,
+.ion-person-stalker:before,
+.ion-pie-graph:before,
+.ion-pin:before,
+.ion-pinpoint:before,
+.ion-pizza:before,
+.ion-plane:before,
+.ion-planet:before,
+.ion-play:before,
+.ion-playstation:before,
+.ion-plus:before,
+.ion-plus-circled:before,
+.ion-plus-round:before,
+.ion-podium:before,
+.ion-pound:before,
+.ion-power:before,
+.ion-pricetag:before,
+.ion-pricetags:before,
+.ion-printer:before,
+.ion-pull-request:before,
+.ion-qr-scanner:before,
+.ion-quote:before,
+.ion-radio-waves:before,
+.ion-record:before,
+.ion-refresh:before,
+.ion-reply:before,
+.ion-reply-all:before,
+.ion-ribbon-a:before,
+.ion-ribbon-b:before,
+.ion-sad:before,
+.ion-sad-outline:before,
+.ion-scissors:before,
+.ion-search:before,
+.ion-settings:before,
+.ion-share:before,
+.ion-shuffle:before,
+.ion-skip-backward:before,
+.ion-skip-forward:before,
+.ion-social-android:before,
+.ion-social-android-outline:before,
+.ion-social-angular:before,
+.ion-social-angular-outline:before,
+.ion-social-apple:before,
+.ion-social-apple-outline:before,
+.ion-social-bitcoin:before,
+.ion-social-bitcoin-outline:before,
+.ion-social-buffer:before,
+.ion-social-buffer-outline:before,
+.ion-social-chrome:before,
+.ion-social-chrome-outline:before,
+.ion-social-codepen:before,
+.ion-social-codepen-outline:before,
+.ion-social-css3:before,
+.ion-social-css3-outline:before,
+.ion-social-designernews:before,
+.ion-social-designernews-outline:before,
+.ion-social-dribbble:before,
+.ion-social-dribbble-outline:before,
+.ion-social-dropbox:before,
+.ion-social-dropbox-outline:before,
+.ion-social-euro:before,
+.ion-social-euro-outline:before,
+.ion-social-facebook:before,
+.ion-social-facebook-outline:before,
+.ion-social-foursquare:before,
+.ion-social-foursquare-outline:before,
+.ion-social-freebsd-devil:before,
+.ion-social-github:before,
+.ion-social-github-outline:before,
+.ion-social-google:before,
+.ion-social-google-outline:before,
+.ion-social-googleplus:before,
+.ion-social-googleplus-outline:before,
+.ion-social-hackernews:before,
+.ion-social-hackernews-outline:before,
+.ion-social-html5:before,
+.ion-social-html5-outline:before,
+.ion-social-instagram:before,
+.ion-social-instagram-outline:before,
+.ion-social-javascript:before,
+.ion-social-javascript-outline:before,
+.ion-social-linkedin:before,
+.ion-social-linkedin-outline:before,
+.ion-social-markdown:before,
+.ion-social-nodejs:before,
+.ion-social-octocat:before,
+.ion-social-pinterest:before,
+.ion-social-pinterest-outline:before,
+.ion-social-python:before,
+.ion-social-reddit:before,
+.ion-social-reddit-outline:before,
+.ion-social-rss:before,
+.ion-social-rss-outline:before,
+.ion-social-sass:before,
+.ion-social-skype:before,
+.ion-social-skype-outline:before,
+.ion-social-snapchat:before,
+.ion-social-snapchat-outline:before,
+.ion-social-tumblr:before,
+.ion-social-tumblr-outline:before,
+.ion-social-tux:before,
+.ion-social-twitch:before,
+.ion-social-twitch-outline:before,
+.ion-social-twitter:before,
+.ion-social-twitter-outline:before,
+.ion-social-usd:before,
+.ion-social-usd-outline:before,
+.ion-social-vimeo:before,
+.ion-social-vimeo-outline:before,
+.ion-social-whatsapp:before,
+.ion-social-whatsapp-outline:before,
+.ion-social-windows:before,
+.ion-social-windows-outline:before,
+.ion-social-wordpress:before,
+.ion-social-wordpress-outline:before,
+.ion-social-yahoo:before,
+.ion-social-yahoo-outline:before,
+.ion-social-yen:before,
+.ion-social-yen-outline:before,
+.ion-social-youtube:before,
+.ion-social-youtube-outline:before,
+.ion-soup-can:before,
+.ion-soup-can-outline:before,
+.ion-speakerphone:before,
+.ion-speedometer:before,
+.ion-spoon:before,
+.ion-star:before,
+.ion-stats-bars:before,
+.ion-steam:before,
+.ion-stop:before,
+.ion-thermometer:before,
+.ion-thumbsdown:before,
+.ion-thumbsup:before,
+.ion-toggle:before,
+.ion-toggle-filled:before,
+.ion-transgender:before,
+.ion-trash-a:before,
+.ion-trash-b:before,
+.ion-trophy:before,
+.ion-tshirt:before,
+.ion-tshirt-outline:before,
+.ion-umbrella:before,
+.ion-university:before,
+.ion-unlocked:before,
+.ion-upload:before,
+.ion-usb:before,
+.ion-videocamera:before,
+.ion-volume-high:before,
+.ion-volume-low:before,
+.ion-volume-medium:before,
+.ion-volume-mute:before,
+.ion-wand:before,
+.ion-waterdrop:before,
+.ion-wifi:before,
+.ion-wineglass:before,
+.ion-woman:before,
+.ion-wrench:before,
+.ion-xbox:before {
+ display: inline-block;
+ font-family: "Ionicons";
+ speak: none;
+ font-style: normal;
+ font-weight: normal;
+ font-variant: normal;
+ text-transform: none;
+ text-rendering: auto;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale; }
+
+.ion-alert:before {
+ content: ""; }
+
+.ion-alert-circled:before {
+ content: ""; }
+
+.ion-android-add:before {
+ content: ""; }
+
+.ion-android-add-circle:before {
+ content: ""; }
+
+.ion-android-alarm-clock:before {
+ content: ""; }
+
+.ion-android-alert:before {
+ content: ""; }
+
+.ion-android-apps:before {
+ content: ""; }
+
+.ion-android-archive:before {
+ content: ""; }
+
+.ion-android-arrow-back:before {
+ content: ""; }
+
+.ion-android-arrow-down:before {
+ content: ""; }
+
+.ion-android-arrow-dropdown:before {
+ content: ""; }
+
+.ion-android-arrow-dropdown-circle:before {
+ content: ""; }
+
+.ion-android-arrow-dropleft:before {
+ content: ""; }
+
+.ion-android-arrow-dropleft-circle:before {
+ content: ""; }
+
+.ion-android-arrow-dropright:before {
+ content: ""; }
+
+.ion-android-arrow-dropright-circle:before {
+ content: ""; }
+
+.ion-android-arrow-dropup:before {
+ content: ""; }
+
+.ion-android-arrow-dropup-circle:before {
+ content: ""; }
+
+.ion-android-arrow-forward:before {
+ content: ""; }
+
+.ion-android-arrow-up:before {
+ content: ""; }
+
+.ion-android-attach:before {
+ content: ""; }
+
+.ion-android-bar:before {
+ content: ""; }
+
+.ion-android-bicycle:before {
+ content: ""; }
+
+.ion-android-boat:before {
+ content: ""; }
+
+.ion-android-bookmark:before {
+ content: ""; }
+
+.ion-android-bulb:before {
+ content: ""; }
+
+.ion-android-bus:before {
+ content: ""; }
+
+.ion-android-calendar:before {
+ content: ""; }
+
+.ion-android-call:before {
+ content: ""; }
+
+.ion-android-camera:before {
+ content: ""; }
+
+.ion-android-cancel:before {
+ content: ""; }
+
+.ion-android-car:before {
+ content: ""; }
+
+.ion-android-cart:before {
+ content: ""; }
+
+.ion-android-chat:before {
+ content: ""; }
+
+.ion-android-checkbox:before {
+ content: ""; }
+
+.ion-android-checkbox-blank:before {
+ content: ""; }
+
+.ion-android-checkbox-outline:before {
+ content: ""; }
+
+.ion-android-checkbox-outline-blank:before {
+ content: ""; }
+
+.ion-android-checkmark-circle:before {
+ content: ""; }
+
+.ion-android-clipboard:before {
+ content: ""; }
+
+.ion-android-close:before {
+ content: ""; }
+
+.ion-android-cloud:before {
+ content: ""; }
+
+.ion-android-cloud-circle:before {
+ content: ""; }
+
+.ion-android-cloud-done:before {
+ content: ""; }
+
+.ion-android-cloud-outline:before {
+ content: ""; }
+
+.ion-android-color-palette:before {
+ content: ""; }
+
+.ion-android-compass:before {
+ content: ""; }
+
+.ion-android-contact:before {
+ content: ""; }
+
+.ion-android-contacts:before {
+ content: ""; }
+
+.ion-android-contract:before {
+ content: ""; }
+
+.ion-android-create:before {
+ content: ""; }
+
+.ion-android-delete:before {
+ content: ""; }
+
+.ion-android-desktop:before {
+ content: ""; }
+
+.ion-android-document:before {
+ content: ""; }
+
+.ion-android-done:before {
+ content: ""; }
+
+.ion-android-done-all:before {
+ content: ""; }
+
+.ion-android-download:before {
+ content: ""; }
+
+.ion-android-drafts:before {
+ content: ""; }
+
+.ion-android-exit:before {
+ content: ""; }
+
+.ion-android-expand:before {
+ content: ""; }
+
+.ion-android-favorite:before {
+ content: ""; }
+
+.ion-android-favorite-outline:before {
+ content: ""; }
+
+.ion-android-film:before {
+ content: ""; }
+
+.ion-android-folder:before {
+ content: ""; }
+
+.ion-android-folder-open:before {
+ content: ""; }
+
+.ion-android-funnel:before {
+ content: ""; }
+
+.ion-android-globe:before {
+ content: ""; }
+
+.ion-android-hand:before {
+ content: ""; }
+
+.ion-android-hangout:before {
+ content: ""; }
+
+.ion-android-happy:before {
+ content: ""; }
+
+.ion-android-home:before {
+ content: ""; }
+
+.ion-android-image:before {
+ content: ""; }
+
+.ion-android-laptop:before {
+ content: ""; }
+
+.ion-android-list:before {
+ content: ""; }
+
+.ion-android-locate:before {
+ content: ""; }
+
+.ion-android-lock:before {
+ content: ""; }
+
+.ion-android-mail:before {
+ content: ""; }
+
+.ion-android-map:before {
+ content: ""; }
+
+.ion-android-menu:before {
+ content: ""; }
+
+.ion-android-microphone:before {
+ content: ""; }
+
+.ion-android-microphone-off:before {
+ content: ""; }
+
+.ion-android-more-horizontal:before {
+ content: ""; }
+
+.ion-android-more-vertical:before {
+ content: ""; }
+
+.ion-android-navigate:before {
+ content: ""; }
+
+.ion-android-notifications:before {
+ content: ""; }
+
+.ion-android-notifications-none:before {
+ content: ""; }
+
+.ion-android-notifications-off:before {
+ content: ""; }
+
+.ion-android-open:before {
+ content: ""; }
+
+.ion-android-options:before {
+ content: ""; }
+
+.ion-android-people:before {
+ content: ""; }
+
+.ion-android-person:before {
+ content: ""; }
+
+.ion-android-person-add:before {
+ content: ""; }
+
+.ion-android-phone-landscape:before {
+ content: ""; }
+
+.ion-android-phone-portrait:before {
+ content: ""; }
+
+.ion-android-pin:before {
+ content: ""; }
+
+.ion-android-plane:before {
+ content: ""; }
+
+.ion-android-playstore:before {
+ content: ""; }
+
+.ion-android-print:before {
+ content: ""; }
+
+.ion-android-radio-button-off:before {
+ content: ""; }
+
+.ion-android-radio-button-on:before {
+ content: ""; }
+
+.ion-android-refresh:before {
+ content: ""; }
+
+.ion-android-remove:before {
+ content: ""; }
+
+.ion-android-remove-circle:before {
+ content: ""; }
+
+.ion-android-restaurant:before {
+ content: ""; }
+
+.ion-android-sad:before {
+ content: ""; }
+
+.ion-android-search:before {
+ content: ""; }
+
+.ion-android-send:before {
+ content: ""; }
+
+.ion-android-settings:before {
+ content: ""; }
+
+.ion-android-share:before {
+ content: ""; }
+
+.ion-android-share-alt:before {
+ content: ""; }
+
+.ion-android-star:before {
+ content: ""; }
+
+.ion-android-star-half:before {
+ content: ""; }
+
+.ion-android-star-outline:before {
+ content: ""; }
+
+.ion-android-stopwatch:before {
+ content: ""; }
+
+.ion-android-subway:before {
+ content: ""; }
+
+.ion-android-sunny:before {
+ content: ""; }
+
+.ion-android-sync:before {
+ content: ""; }
+
+.ion-android-textsms:before {
+ content: ""; }
+
+.ion-android-time:before {
+ content: ""; }
+
+.ion-android-train:before {
+ content: ""; }
+
+.ion-android-unlock:before {
+ content: ""; }
+
+.ion-android-upload:before {
+ content: ""; }
+
+.ion-android-volume-down:before {
+ content: ""; }
+
+.ion-android-volume-mute:before {
+ content: ""; }
+
+.ion-android-volume-off:before {
+ content: ""; }
+
+.ion-android-volume-up:before {
+ content: ""; }
+
+.ion-android-walk:before {
+ content: ""; }
+
+.ion-android-warning:before {
+ content: ""; }
+
+.ion-android-watch:before {
+ content: ""; }
+
+.ion-android-wifi:before {
+ content: ""; }
+
+.ion-aperture:before {
+ content: ""; }
+
+.ion-archive:before {
+ content: ""; }
+
+.ion-arrow-down-a:before {
+ content: ""; }
+
+.ion-arrow-down-b:before {
+ content: ""; }
+
+.ion-arrow-down-c:before {
+ content: ""; }
+
+.ion-arrow-expand:before {
+ content: ""; }
+
+.ion-arrow-graph-down-left:before {
+ content: ""; }
+
+.ion-arrow-graph-down-right:before {
+ content: ""; }
+
+.ion-arrow-graph-up-left:before {
+ content: ""; }
+
+.ion-arrow-graph-up-right:before {
+ content: ""; }
+
+.ion-arrow-left-a:before {
+ content: ""; }
+
+.ion-arrow-left-b:before {
+ content: ""; }
+
+.ion-arrow-left-c:before {
+ content: ""; }
+
+.ion-arrow-move:before {
+ content: ""; }
+
+.ion-arrow-resize:before {
+ content: ""; }
+
+.ion-arrow-return-left:before {
+ content: ""; }
+
+.ion-arrow-return-right:before {
+ content: ""; }
+
+.ion-arrow-right-a:before {
+ content: ""; }
+
+.ion-arrow-right-b:before {
+ content: ""; }
+
+.ion-arrow-right-c:before {
+ content: ""; }
+
+.ion-arrow-shrink:before {
+ content: ""; }
+
+.ion-arrow-swap:before {
+ content: ""; }
+
+.ion-arrow-up-a:before {
+ content: ""; }
+
+.ion-arrow-up-b:before {
+ content: ""; }
+
+.ion-arrow-up-c:before {
+ content: ""; }
+
+.ion-asterisk:before {
+ content: ""; }
+
+.ion-at:before {
+ content: ""; }
+
+.ion-backspace:before {
+ content: ""; }
+
+.ion-backspace-outline:before {
+ content: ""; }
+
+.ion-bag:before {
+ content: ""; }
+
+.ion-battery-charging:before {
+ content: ""; }
+
+.ion-battery-empty:before {
+ content: ""; }
+
+.ion-battery-full:before {
+ content: ""; }
+
+.ion-battery-half:before {
+ content: ""; }
+
+.ion-battery-low:before {
+ content: ""; }
+
+.ion-beaker:before {
+ content: ""; }
+
+.ion-beer:before {
+ content: ""; }
+
+.ion-bluetooth:before {
+ content: ""; }
+
+.ion-bonfire:before {
+ content: ""; }
+
+.ion-bookmark:before {
+ content: ""; }
+
+.ion-bowtie:before {
+ content: ""; }
+
+.ion-briefcase:before {
+ content: ""; }
+
+.ion-bug:before {
+ content: ""; }
+
+.ion-calculator:before {
+ content: ""; }
+
+.ion-calendar:before {
+ content: ""; }
+
+.ion-camera:before {
+ content: ""; }
+
+.ion-card:before {
+ content: ""; }
+
+.ion-cash:before {
+ content: ""; }
+
+.ion-chatbox:before {
+ content: ""; }
+
+.ion-chatbox-working:before {
+ content: ""; }
+
+.ion-chatboxes:before {
+ content: ""; }
+
+.ion-chatbubble:before {
+ content: ""; }
+
+.ion-chatbubble-working:before {
+ content: ""; }
+
+.ion-chatbubbles:before {
+ content: ""; }
+
+.ion-checkmark:before {
+ content: ""; }
+
+.ion-checkmark-circled:before {
+ content: ""; }
+
+.ion-checkmark-round:before {
+ content: ""; }
+
+.ion-chevron-down:before {
+ content: ""; }
+
+.ion-chevron-left:before {
+ content: ""; }
+
+.ion-chevron-right:before {
+ content: ""; }
+
+.ion-chevron-up:before {
+ content: ""; }
+
+.ion-clipboard:before {
+ content: ""; }
+
+.ion-clock:before {
+ content: ""; }
+
+.ion-close:before {
+ content: ""; }
+
+.ion-close-circled:before {
+ content: ""; }
+
+.ion-close-round:before {
+ content: ""; }
+
+.ion-closed-captioning:before {
+ content: ""; }
+
+.ion-cloud:before {
+ content: ""; }
+
+.ion-code:before {
+ content: ""; }
+
+.ion-code-download:before {
+ content: ""; }
+
+.ion-code-working:before {
+ content: ""; }
+
+.ion-coffee:before {
+ content: ""; }
+
+.ion-compass:before {
+ content: ""; }
+
+.ion-compose:before {
+ content: ""; }
+
+.ion-connection-bars:before {
+ content: ""; }
+
+.ion-contrast:before {
+ content: ""; }
+
+.ion-crop:before {
+ content: ""; }
+
+.ion-cube:before {
+ content: ""; }
+
+.ion-disc:before {
+ content: ""; }
+
+.ion-document:before {
+ content: ""; }
+
+.ion-document-text:before {
+ content: ""; }
+
+.ion-drag:before {
+ content: ""; }
+
+.ion-earth:before {
+ content: ""; }
+
+.ion-easel:before {
+ content: ""; }
+
+.ion-edit:before {
+ content: ""; }
+
+.ion-egg:before {
+ content: ""; }
+
+.ion-eject:before {
+ content: ""; }
+
+.ion-email:before {
+ content: ""; }
+
+.ion-email-unread:before {
+ content: ""; }
+
+.ion-erlenmeyer-flask:before {
+ content: ""; }
+
+.ion-erlenmeyer-flask-bubbles:before {
+ content: ""; }
+
+.ion-eye:before {
+ content: ""; }
+
+.ion-eye-disabled:before {
+ content: ""; }
+
+.ion-female:before {
+ content: ""; }
+
+.ion-filing:before {
+ content: ""; }
+
+.ion-film-marker:before {
+ content: ""; }
+
+.ion-fireball:before {
+ content: ""; }
+
+.ion-flag:before {
+ content: ""; }
+
+.ion-flame:before {
+ content: ""; }
+
+.ion-flash:before {
+ content: ""; }
+
+.ion-flash-off:before {
+ content: ""; }
+
+.ion-folder:before {
+ content: ""; }
+
+.ion-fork:before {
+ content: ""; }
+
+.ion-fork-repo:before {
+ content: ""; }
+
+.ion-forward:before {
+ content: ""; }
+
+.ion-funnel:before {
+ content: ""; }
+
+.ion-gear-a:before {
+ content: ""; }
+
+.ion-gear-b:before {
+ content: ""; }
+
+.ion-grid:before {
+ content: ""; }
+
+.ion-hammer:before {
+ content: ""; }
+
+.ion-happy:before {
+ content: ""; }
+
+.ion-happy-outline:before {
+ content: ""; }
+
+.ion-headphone:before {
+ content: ""; }
+
+.ion-heart:before {
+ content: ""; }
+
+.ion-heart-broken:before {
+ content: ""; }
+
+.ion-help:before {
+ content: ""; }
+
+.ion-help-buoy:before {
+ content: ""; }
+
+.ion-help-circled:before {
+ content: ""; }
+
+.ion-home:before {
+ content: ""; }
+
+.ion-icecream:before {
+ content: ""; }
+
+.ion-image:before {
+ content: ""; }
+
+.ion-images:before {
+ content: ""; }
+
+.ion-information:before {
+ content: ""; }
+
+.ion-information-circled:before {
+ content: ""; }
+
+.ion-ionic:before {
+ content: ""; }
+
+.ion-ios-alarm:before {
+ content: ""; }
+
+.ion-ios-alarm-outline:before {
+ content: ""; }
+
+.ion-ios-albums:before {
+ content: ""; }
+
+.ion-ios-albums-outline:before {
+ content: ""; }
+
+.ion-ios-americanfootball:before {
+ content: ""; }
+
+.ion-ios-americanfootball-outline:before {
+ content: ""; }
+
+.ion-ios-analytics:before {
+ content: ""; }
+
+.ion-ios-analytics-outline:before {
+ content: ""; }
+
+.ion-ios-arrow-back:before {
+ content: ""; }
+
+.ion-ios-arrow-down:before {
+ content: ""; }
+
+.ion-ios-arrow-forward:before {
+ content: ""; }
+
+.ion-ios-arrow-left:before {
+ content: ""; }
+
+.ion-ios-arrow-right:before {
+ content: ""; }
+
+.ion-ios-arrow-thin-down:before {
+ content: ""; }
+
+.ion-ios-arrow-thin-left:before {
+ content: ""; }
+
+.ion-ios-arrow-thin-right:before {
+ content: ""; }
+
+.ion-ios-arrow-thin-up:before {
+ content: ""; }
+
+.ion-ios-arrow-up:before {
+ content: ""; }
+
+.ion-ios-at:before {
+ content: ""; }
+
+.ion-ios-at-outline:before {
+ content: ""; }
+
+.ion-ios-barcode:before {
+ content: ""; }
+
+.ion-ios-barcode-outline:before {
+ content: ""; }
+
+.ion-ios-baseball:before {
+ content: ""; }
+
+.ion-ios-baseball-outline:before {
+ content: ""; }
+
+.ion-ios-basketball:before {
+ content: ""; }
+
+.ion-ios-basketball-outline:before {
+ content: ""; }
+
+.ion-ios-bell:before {
+ content: ""; }
+
+.ion-ios-bell-outline:before {
+ content: ""; }
+
+.ion-ios-body:before {
+ content: ""; }
+
+.ion-ios-body-outline:before {
+ content: ""; }
+
+.ion-ios-bolt:before {
+ content: ""; }
+
+.ion-ios-bolt-outline:before {
+ content: ""; }
+
+.ion-ios-book:before {
+ content: ""; }
+
+.ion-ios-book-outline:before {
+ content: ""; }
+
+.ion-ios-bookmarks:before {
+ content: ""; }
+
+.ion-ios-bookmarks-outline:before {
+ content: ""; }
+
+.ion-ios-box:before {
+ content: ""; }
+
+.ion-ios-box-outline:before {
+ content: ""; }
+
+.ion-ios-briefcase:before {
+ content: ""; }
+
+.ion-ios-briefcase-outline:before {
+ content: ""; }
+
+.ion-ios-browsers:before {
+ content: ""; }
+
+.ion-ios-browsers-outline:before {
+ content: ""; }
+
+.ion-ios-calculator:before {
+ content: ""; }
+
+.ion-ios-calculator-outline:before {
+ content: ""; }
+
+.ion-ios-calendar:before {
+ content: ""; }
+
+.ion-ios-calendar-outline:before {
+ content: ""; }
+
+.ion-ios-camera:before {
+ content: ""; }
+
+.ion-ios-camera-outline:before {
+ content: ""; }
+
+.ion-ios-cart:before {
+ content: ""; }
+
+.ion-ios-cart-outline:before {
+ content: ""; }
+
+.ion-ios-chatboxes:before {
+ content: ""; }
+
+.ion-ios-chatboxes-outline:before {
+ content: ""; }
+
+.ion-ios-chatbubble:before {
+ content: ""; }
+
+.ion-ios-chatbubble-outline:before {
+ content: ""; }
+
+.ion-ios-checkmark:before {
+ content: ""; }
+
+.ion-ios-checkmark-empty:before {
+ content: ""; }
+
+.ion-ios-checkmark-outline:before {
+ content: ""; }
+
+.ion-ios-circle-filled:before {
+ content: ""; }
+
+.ion-ios-circle-outline:before {
+ content: ""; }
+
+.ion-ios-clock:before {
+ content: ""; }
+
+.ion-ios-clock-outline:before {
+ content: ""; }
+
+.ion-ios-close:before {
+ content: ""; }
+
+.ion-ios-close-empty:before {
+ content: ""; }
+
+.ion-ios-close-outline:before {
+ content: ""; }
+
+.ion-ios-cloud:before {
+ content: ""; }
+
+.ion-ios-cloud-download:before {
+ content: ""; }
+
+.ion-ios-cloud-download-outline:before {
+ content: ""; }
+
+.ion-ios-cloud-outline:before {
+ content: ""; }
+
+.ion-ios-cloud-upload:before {
+ content: ""; }
+
+.ion-ios-cloud-upload-outline:before {
+ content: ""; }
+
+.ion-ios-cloudy:before {
+ content: ""; }
+
+.ion-ios-cloudy-night:before {
+ content: ""; }
+
+.ion-ios-cloudy-night-outline:before {
+ content: ""; }
+
+.ion-ios-cloudy-outline:before {
+ content: ""; }
+
+.ion-ios-cog:before {
+ content: ""; }
+
+.ion-ios-cog-outline:before {
+ content: ""; }
+
+.ion-ios-color-filter:before {
+ content: ""; }
+
+.ion-ios-color-filter-outline:before {
+ content: ""; }
+
+.ion-ios-color-wand:before {
+ content: ""; }
+
+.ion-ios-color-wand-outline:before {
+ content: ""; }
+
+.ion-ios-compose:before {
+ content: ""; }
+
+.ion-ios-compose-outline:before {
+ content: ""; }
+
+.ion-ios-contact:before {
+ content: ""; }
+
+.ion-ios-contact-outline:before {
+ content: ""; }
+
+.ion-ios-copy:before {
+ content: ""; }
+
+.ion-ios-copy-outline:before {
+ content: ""; }
+
+.ion-ios-crop:before {
+ content: ""; }
+
+.ion-ios-crop-strong:before {
+ content: ""; }
+
+.ion-ios-download:before {
+ content: ""; }
+
+.ion-ios-download-outline:before {
+ content: ""; }
+
+.ion-ios-drag:before {
+ content: ""; }
+
+.ion-ios-email:before {
+ content: ""; }
+
+.ion-ios-email-outline:before {
+ content: ""; }
+
+.ion-ios-eye:before {
+ content: ""; }
+
+.ion-ios-eye-outline:before {
+ content: ""; }
+
+.ion-ios-fastforward:before {
+ content: ""; }
+
+.ion-ios-fastforward-outline:before {
+ content: ""; }
+
+.ion-ios-filing:before {
+ content: ""; }
+
+.ion-ios-filing-outline:before {
+ content: ""; }
+
+.ion-ios-film:before {
+ content: ""; }
+
+.ion-ios-film-outline:before {
+ content: ""; }
+
+.ion-ios-flag:before {
+ content: ""; }
+
+.ion-ios-flag-outline:before {
+ content: ""; }
+
+.ion-ios-flame:before {
+ content: ""; }
+
+.ion-ios-flame-outline:before {
+ content: ""; }
+
+.ion-ios-flask:before {
+ content: ""; }
+
+.ion-ios-flask-outline:before {
+ content: ""; }
+
+.ion-ios-flower:before {
+ content: ""; }
+
+.ion-ios-flower-outline:before {
+ content: ""; }
+
+.ion-ios-folder:before {
+ content: ""; }
+
+.ion-ios-folder-outline:before {
+ content: ""; }
+
+.ion-ios-football:before {
+ content: ""; }
+
+.ion-ios-football-outline:before {
+ content: ""; }
+
+.ion-ios-game-controller-a:before {
+ content: ""; }
+
+.ion-ios-game-controller-a-outline:before {
+ content: ""; }
+
+.ion-ios-game-controller-b:before {
+ content: ""; }
+
+.ion-ios-game-controller-b-outline:before {
+ content: ""; }
+
+.ion-ios-gear:before {
+ content: ""; }
+
+.ion-ios-gear-outline:before {
+ content: ""; }
+
+.ion-ios-glasses:before {
+ content: ""; }
+
+.ion-ios-glasses-outline:before {
+ content: ""; }
+
+.ion-ios-grid-view:before {
+ content: ""; }
+
+.ion-ios-grid-view-outline:before {
+ content: ""; }
+
+.ion-ios-heart:before {
+ content: ""; }
+
+.ion-ios-heart-outline:before {
+ content: ""; }
+
+.ion-ios-help:before {
+ content: ""; }
+
+.ion-ios-help-empty:before {
+ content: ""; }
+
+.ion-ios-help-outline:before {
+ content: ""; }
+
+.ion-ios-home:before {
+ content: ""; }
+
+.ion-ios-home-outline:before {
+ content: ""; }
+
+.ion-ios-infinite:before {
+ content: ""; }
+
+.ion-ios-infinite-outline:before {
+ content: ""; }
+
+.ion-ios-information:before {
+ content: ""; }
+
+.ion-ios-information-empty:before {
+ content: ""; }
+
+.ion-ios-information-outline:before {
+ content: ""; }
+
+.ion-ios-ionic-outline:before {
+ content: ""; }
+
+.ion-ios-keypad:before {
+ content: ""; }
+
+.ion-ios-keypad-outline:before {
+ content: ""; }
+
+.ion-ios-lightbulb:before {
+ content: ""; }
+
+.ion-ios-lightbulb-outline:before {
+ content: ""; }
+
+.ion-ios-list:before {
+ content: ""; }
+
+.ion-ios-list-outline:before {
+ content: ""; }
+
+.ion-ios-location:before {
+ content: ""; }
+
+.ion-ios-location-outline:before {
+ content: ""; }
+
+.ion-ios-locked:before {
+ content: ""; }
+
+.ion-ios-locked-outline:before {
+ content: ""; }
+
+.ion-ios-loop:before {
+ content: ""; }
+
+.ion-ios-loop-strong:before {
+ content: ""; }
+
+.ion-ios-medical:before {
+ content: ""; }
+
+.ion-ios-medical-outline:before {
+ content: ""; }
+
+.ion-ios-medkit:before {
+ content: ""; }
+
+.ion-ios-medkit-outline:before {
+ content: ""; }
+
+.ion-ios-mic:before {
+ content: ""; }
+
+.ion-ios-mic-off:before {
+ content: ""; }
+
+.ion-ios-mic-outline:before {
+ content: ""; }
+
+.ion-ios-minus:before {
+ content: ""; }
+
+.ion-ios-minus-empty:before {
+ content: ""; }
+
+.ion-ios-minus-outline:before {
+ content: ""; }
+
+.ion-ios-monitor:before {
+ content: ""; }
+
+.ion-ios-monitor-outline:before {
+ content: ""; }
+
+.ion-ios-moon:before {
+ content: ""; }
+
+.ion-ios-moon-outline:before {
+ content: ""; }
+
+.ion-ios-more:before {
+ content: ""; }
+
+.ion-ios-more-outline:before {
+ content: ""; }
+
+.ion-ios-musical-note:before {
+ content: ""; }
+
+.ion-ios-musical-notes:before {
+ content: ""; }
+
+.ion-ios-navigate:before {
+ content: ""; }
+
+.ion-ios-navigate-outline:before {
+ content: ""; }
+
+.ion-ios-nutrition:before {
+ content: ""; }
+
+.ion-ios-nutrition-outline:before {
+ content: ""; }
+
+.ion-ios-paper:before {
+ content: ""; }
+
+.ion-ios-paper-outline:before {
+ content: ""; }
+
+.ion-ios-paperplane:before {
+ content: ""; }
+
+.ion-ios-paperplane-outline:before {
+ content: ""; }
+
+.ion-ios-partlysunny:before {
+ content: ""; }
+
+.ion-ios-partlysunny-outline:before {
+ content: ""; }
+
+.ion-ios-pause:before {
+ content: ""; }
+
+.ion-ios-pause-outline:before {
+ content: ""; }
+
+.ion-ios-paw:before {
+ content: ""; }
+
+.ion-ios-paw-outline:before {
+ content: ""; }
+
+.ion-ios-people:before {
+ content: ""; }
+
+.ion-ios-people-outline:before {
+ content: ""; }
+
+.ion-ios-person:before {
+ content: ""; }
+
+.ion-ios-person-outline:before {
+ content: ""; }
+
+.ion-ios-personadd:before {
+ content: ""; }
+
+.ion-ios-personadd-outline:before {
+ content: ""; }
+
+.ion-ios-photos:before {
+ content: ""; }
+
+.ion-ios-photos-outline:before {
+ content: ""; }
+
+.ion-ios-pie:before {
+ content: ""; }
+
+.ion-ios-pie-outline:before {
+ content: ""; }
+
+.ion-ios-pint:before {
+ content: ""; }
+
+.ion-ios-pint-outline:before {
+ content: ""; }
+
+.ion-ios-play:before {
+ content: ""; }
+
+.ion-ios-play-outline:before {
+ content: ""; }
+
+.ion-ios-plus:before {
+ content: ""; }
+
+.ion-ios-plus-empty:before {
+ content: ""; }
+
+.ion-ios-plus-outline:before {
+ content: ""; }
+
+.ion-ios-pricetag:before {
+ content: ""; }
+
+.ion-ios-pricetag-outline:before {
+ content: ""; }
+
+.ion-ios-pricetags:before {
+ content: ""; }
+
+.ion-ios-pricetags-outline:before {
+ content: ""; }
+
+.ion-ios-printer:before {
+ content: ""; }
+
+.ion-ios-printer-outline:before {
+ content: ""; }
+
+.ion-ios-pulse:before {
+ content: ""; }
+
+.ion-ios-pulse-strong:before {
+ content: ""; }
+
+.ion-ios-rainy:before {
+ content: ""; }
+
+.ion-ios-rainy-outline:before {
+ content: ""; }
+
+.ion-ios-recording:before {
+ content: ""; }
+
+.ion-ios-recording-outline:before {
+ content: ""; }
+
+.ion-ios-redo:before {
+ content: ""; }
+
+.ion-ios-redo-outline:before {
+ content: ""; }
+
+.ion-ios-refresh:before {
+ content: ""; }
+
+.ion-ios-refresh-empty:before {
+ content: ""; }
+
+.ion-ios-refresh-outline:before {
+ content: ""; }
+
+.ion-ios-reload:before {
+ content: ""; }
+
+.ion-ios-reverse-camera:before {
+ content: ""; }
+
+.ion-ios-reverse-camera-outline:before {
+ content: ""; }
+
+.ion-ios-rewind:before {
+ content: ""; }
+
+.ion-ios-rewind-outline:before {
+ content: ""; }
+
+.ion-ios-rose:before {
+ content: ""; }
+
+.ion-ios-rose-outline:before {
+ content: ""; }
+
+.ion-ios-search:before {
+ content: ""; }
+
+.ion-ios-search-strong:before {
+ content: ""; }
+
+.ion-ios-settings:before {
+ content: ""; }
+
+.ion-ios-settings-strong:before {
+ content: ""; }
+
+.ion-ios-shuffle:before {
+ content: ""; }
+
+.ion-ios-shuffle-strong:before {
+ content: ""; }
+
+.ion-ios-skipbackward:before {
+ content: ""; }
+
+.ion-ios-skipbackward-outline:before {
+ content: ""; }
+
+.ion-ios-skipforward:before {
+ content: ""; }
+
+.ion-ios-skipforward-outline:before {
+ content: ""; }
+
+.ion-ios-snowy:before {
+ content: ""; }
+
+.ion-ios-speedometer:before {
+ content: ""; }
+
+.ion-ios-speedometer-outline:before {
+ content: ""; }
+
+.ion-ios-star:before {
+ content: ""; }
+
+.ion-ios-star-half:before {
+ content: ""; }
+
+.ion-ios-star-outline:before {
+ content: ""; }
+
+.ion-ios-stopwatch:before {
+ content: ""; }
+
+.ion-ios-stopwatch-outline:before {
+ content: ""; }
+
+.ion-ios-sunny:before {
+ content: ""; }
+
+.ion-ios-sunny-outline:before {
+ content: ""; }
+
+.ion-ios-telephone:before {
+ content: ""; }
+
+.ion-ios-telephone-outline:before {
+ content: ""; }
+
+.ion-ios-tennisball:before {
+ content: ""; }
+
+.ion-ios-tennisball-outline:before {
+ content: ""; }
+
+.ion-ios-thunderstorm:before {
+ content: ""; }
+
+.ion-ios-thunderstorm-outline:before {
+ content: ""; }
+
+.ion-ios-time:before {
+ content: ""; }
+
+.ion-ios-time-outline:before {
+ content: ""; }
+
+.ion-ios-timer:before {
+ content: ""; }
+
+.ion-ios-timer-outline:before {
+ content: ""; }
+
+.ion-ios-toggle:before {
+ content: ""; }
+
+.ion-ios-toggle-outline:before {
+ content: ""; }
+
+.ion-ios-trash:before {
+ content: ""; }
+
+.ion-ios-trash-outline:before {
+ content: ""; }
+
+.ion-ios-undo:before {
+ content: ""; }
+
+.ion-ios-undo-outline:before {
+ content: ""; }
+
+.ion-ios-unlocked:before {
+ content: ""; }
+
+.ion-ios-unlocked-outline:before {
+ content: ""; }
+
+.ion-ios-upload:before {
+ content: ""; }
+
+.ion-ios-upload-outline:before {
+ content: ""; }
+
+.ion-ios-videocam:before {
+ content: ""; }
+
+.ion-ios-videocam-outline:before {
+ content: ""; }
+
+.ion-ios-volume-high:before {
+ content: ""; }
+
+.ion-ios-volume-low:before {
+ content: ""; }
+
+.ion-ios-wineglass:before {
+ content: ""; }
+
+.ion-ios-wineglass-outline:before {
+ content: ""; }
+
+.ion-ios-world:before {
+ content: ""; }
+
+.ion-ios-world-outline:before {
+ content: ""; }
+
+.ion-ipad:before {
+ content: ""; }
+
+.ion-iphone:before {
+ content: ""; }
+
+.ion-ipod:before {
+ content: ""; }
+
+.ion-jet:before {
+ content: ""; }
+
+.ion-key:before {
+ content: ""; }
+
+.ion-knife:before {
+ content: ""; }
+
+.ion-laptop:before {
+ content: ""; }
+
+.ion-leaf:before {
+ content: ""; }
+
+.ion-levels:before {
+ content: ""; }
+
+.ion-lightbulb:before {
+ content: ""; }
+
+.ion-link:before {
+ content: ""; }
+
+.ion-load-a:before {
+ content: ""; }
+
+.ion-load-b:before {
+ content: ""; }
+
+.ion-load-c:before {
+ content: ""; }
+
+.ion-load-d:before {
+ content: ""; }
+
+.ion-location:before {
+ content: ""; }
+
+.ion-lock-combination:before {
+ content: ""; }
+
+.ion-locked:before {
+ content: ""; }
+
+.ion-log-in:before {
+ content: ""; }
+
+.ion-log-out:before {
+ content: ""; }
+
+.ion-loop:before {
+ content: ""; }
+
+.ion-magnet:before {
+ content: ""; }
+
+.ion-male:before {
+ content: ""; }
+
+.ion-man:before {
+ content: ""; }
+
+.ion-map:before {
+ content: ""; }
+
+.ion-medkit:before {
+ content: ""; }
+
+.ion-merge:before {
+ content: ""; }
+
+.ion-mic-a:before {
+ content: ""; }
+
+.ion-mic-b:before {
+ content: ""; }
+
+.ion-mic-c:before {
+ content: ""; }
+
+.ion-minus:before {
+ content: ""; }
+
+.ion-minus-circled:before {
+ content: ""; }
+
+.ion-minus-round:before {
+ content: ""; }
+
+.ion-model-s:before {
+ content: ""; }
+
+.ion-monitor:before {
+ content: ""; }
+
+.ion-more:before {
+ content: ""; }
+
+.ion-mouse:before {
+ content: ""; }
+
+.ion-music-note:before {
+ content: ""; }
+
+.ion-navicon:before {
+ content: ""; }
+
+.ion-navicon-round:before {
+ content: ""; }
+
+.ion-navigate:before {
+ content: ""; }
+
+.ion-network:before {
+ content: ""; }
+
+.ion-no-smoking:before {
+ content: ""; }
+
+.ion-nuclear:before {
+ content: ""; }
+
+.ion-outlet:before {
+ content: ""; }
+
+.ion-paintbrush:before {
+ content: ""; }
+
+.ion-paintbucket:before {
+ content: ""; }
+
+.ion-paper-airplane:before {
+ content: ""; }
+
+.ion-paperclip:before {
+ content: ""; }
+
+.ion-pause:before {
+ content: ""; }
+
+.ion-person:before {
+ content: ""; }
+
+.ion-person-add:before {
+ content: ""; }
+
+.ion-person-stalker:before {
+ content: ""; }
+
+.ion-pie-graph:before {
+ content: ""; }
+
+.ion-pin:before {
+ content: ""; }
+
+.ion-pinpoint:before {
+ content: ""; }
+
+.ion-pizza:before {
+ content: ""; }
+
+.ion-plane:before {
+ content: ""; }
+
+.ion-planet:before {
+ content: ""; }
+
+.ion-play:before {
+ content: ""; }
+
+.ion-playstation:before {
+ content: ""; }
+
+.ion-plus:before {
+ content: ""; }
+
+.ion-plus-circled:before {
+ content: ""; }
+
+.ion-plus-round:before {
+ content: ""; }
+
+.ion-podium:before {
+ content: ""; }
+
+.ion-pound:before {
+ content: ""; }
+
+.ion-power:before {
+ content: ""; }
+
+.ion-pricetag:before {
+ content: ""; }
+
+.ion-pricetags:before {
+ content: ""; }
+
+.ion-printer:before {
+ content: ""; }
+
+.ion-pull-request:before {
+ content: ""; }
+
+.ion-qr-scanner:before {
+ content: ""; }
+
+.ion-quote:before {
+ content: ""; }
+
+.ion-radio-waves:before {
+ content: ""; }
+
+.ion-record:before {
+ content: ""; }
+
+.ion-refresh:before {
+ content: ""; }
+
+.ion-reply:before {
+ content: ""; }
+
+.ion-reply-all:before {
+ content: ""; }
+
+.ion-ribbon-a:before {
+ content: ""; }
+
+.ion-ribbon-b:before {
+ content: ""; }
+
+.ion-sad:before {
+ content: ""; }
+
+.ion-sad-outline:before {
+ content: ""; }
+
+.ion-scissors:before {
+ content: ""; }
+
+.ion-search:before {
+ content: ""; }
+
+.ion-settings:before {
+ content: ""; }
+
+.ion-share:before {
+ content: ""; }
+
+.ion-shuffle:before {
+ content: ""; }
+
+.ion-skip-backward:before {
+ content: ""; }
+
+.ion-skip-forward:before {
+ content: ""; }
+
+.ion-social-android:before {
+ content: ""; }
+
+.ion-social-android-outline:before {
+ content: ""; }
+
+.ion-social-angular:before {
+ content: ""; }
+
+.ion-social-angular-outline:before {
+ content: ""; }
+
+.ion-social-apple:before {
+ content: ""; }
+
+.ion-social-apple-outline:before {
+ content: ""; }
+
+.ion-social-bitcoin:before {
+ content: ""; }
+
+.ion-social-bitcoin-outline:before {
+ content: ""; }
+
+.ion-social-buffer:before {
+ content: ""; }
+
+.ion-social-buffer-outline:before {
+ content: ""; }
+
+.ion-social-chrome:before {
+ content: ""; }
+
+.ion-social-chrome-outline:before {
+ content: ""; }
+
+.ion-social-codepen:before {
+ content: ""; }
+
+.ion-social-codepen-outline:before {
+ content: ""; }
+
+.ion-social-css3:before {
+ content: ""; }
+
+.ion-social-css3-outline:before {
+ content: ""; }
+
+.ion-social-designernews:before {
+ content: ""; }
+
+.ion-social-designernews-outline:before {
+ content: ""; }
+
+.ion-social-dribbble:before {
+ content: ""; }
+
+.ion-social-dribbble-outline:before {
+ content: ""; }
+
+.ion-social-dropbox:before {
+ content: ""; }
+
+.ion-social-dropbox-outline:before {
+ content: ""; }
+
+.ion-social-euro:before {
+ content: ""; }
+
+.ion-social-euro-outline:before {
+ content: ""; }
+
+.ion-social-facebook:before {
+ content: ""; }
+
+.ion-social-facebook-outline:before {
+ content: ""; }
+
+.ion-social-foursquare:before {
+ content: ""; }
+
+.ion-social-foursquare-outline:before {
+ content: ""; }
+
+.ion-social-freebsd-devil:before {
+ content: ""; }
+
+.ion-social-github:before {
+ content: ""; }
+
+.ion-social-github-outline:before {
+ content: ""; }
+
+.ion-social-google:before {
+ content: ""; }
+
+.ion-social-google-outline:before {
+ content: ""; }
+
+.ion-social-googleplus:before {
+ content: ""; }
+
+.ion-social-googleplus-outline:before {
+ content: ""; }
+
+.ion-social-hackernews:before {
+ content: ""; }
+
+.ion-social-hackernews-outline:before {
+ content: ""; }
+
+.ion-social-html5:before {
+ content: ""; }
+
+.ion-social-html5-outline:before {
+ content: ""; }
+
+.ion-social-instagram:before {
+ content: ""; }
+
+.ion-social-instagram-outline:before {
+ content: ""; }
+
+.ion-social-javascript:before {
+ content: ""; }
+
+.ion-social-javascript-outline:before {
+ content: ""; }
+
+.ion-social-linkedin:before {
+ content: ""; }
+
+.ion-social-linkedin-outline:before {
+ content: ""; }
+
+.ion-social-markdown:before {
+ content: ""; }
+
+.ion-social-nodejs:before {
+ content: ""; }
+
+.ion-social-octocat:before {
+ content: ""; }
+
+.ion-social-pinterest:before {
+ content: ""; }
+
+.ion-social-pinterest-outline:before {
+ content: ""; }
+
+.ion-social-python:before {
+ content: ""; }
+
+.ion-social-reddit:before {
+ content: ""; }
+
+.ion-social-reddit-outline:before {
+ content: ""; }
+
+.ion-social-rss:before {
+ content: ""; }
+
+.ion-social-rss-outline:before {
+ content: ""; }
+
+.ion-social-sass:before {
+ content: ""; }
+
+.ion-social-skype:before {
+ content: ""; }
+
+.ion-social-skype-outline:before {
+ content: ""; }
+
+.ion-social-snapchat:before {
+ content: ""; }
+
+.ion-social-snapchat-outline:before {
+ content: ""; }
+
+.ion-social-tumblr:before {
+ content: ""; }
+
+.ion-social-tumblr-outline:before {
+ content: ""; }
+
+.ion-social-tux:before {
+ content: ""; }
+
+.ion-social-twitch:before {
+ content: ""; }
+
+.ion-social-twitch-outline:before {
+ content: ""; }
+
+.ion-social-twitter:before {
+ content: ""; }
+
+.ion-social-twitter-outline:before {
+ content: ""; }
+
+.ion-social-usd:before {
+ content: ""; }
+
+.ion-social-usd-outline:before {
+ content: ""; }
+
+.ion-social-vimeo:before {
+ content: ""; }
+
+.ion-social-vimeo-outline:before {
+ content: ""; }
+
+.ion-social-whatsapp:before {
+ content: ""; }
+
+.ion-social-whatsapp-outline:before {
+ content: ""; }
+
+.ion-social-windows:before {
+ content: ""; }
+
+.ion-social-windows-outline:before {
+ content: ""; }
+
+.ion-social-wordpress:before {
+ content: ""; }
+
+.ion-social-wordpress-outline:before {
+ content: ""; }
+
+.ion-social-yahoo:before {
+ content: ""; }
+
+.ion-social-yahoo-outline:before {
+ content: ""; }
+
+.ion-social-yen:before {
+ content: ""; }
+
+.ion-social-yen-outline:before {
+ content: ""; }
+
+.ion-social-youtube:before {
+ content: ""; }
+
+.ion-social-youtube-outline:before {
+ content: ""; }
+
+.ion-soup-can:before {
+ content: ""; }
+
+.ion-soup-can-outline:before {
+ content: ""; }
+
+.ion-speakerphone:before {
+ content: ""; }
+
+.ion-speedometer:before {
+ content: ""; }
+
+.ion-spoon:before {
+ content: ""; }
+
+.ion-star:before {
+ content: ""; }
+
+.ion-stats-bars:before {
+ content: ""; }
+
+.ion-steam:before {
+ content: ""; }
+
+.ion-stop:before {
+ content: ""; }
+
+.ion-thermometer:before {
+ content: ""; }
+
+.ion-thumbsdown:before {
+ content: ""; }
+
+.ion-thumbsup:before {
+ content: ""; }
+
+.ion-toggle:before {
+ content: ""; }
+
+.ion-toggle-filled:before {
+ content: ""; }
+
+.ion-transgender:before {
+ content: ""; }
+
+.ion-trash-a:before {
+ content: ""; }
+
+.ion-trash-b:before {
+ content: ""; }
+
+.ion-trophy:before {
+ content: ""; }
+
+.ion-tshirt:before {
+ content: ""; }
+
+.ion-tshirt-outline:before {
+ content: ""; }
+
+.ion-umbrella:before {
+ content: ""; }
+
+.ion-university:before {
+ content: ""; }
+
+.ion-unlocked:before {
+ content: ""; }
+
+.ion-upload:before {
+ content: ""; }
+
+.ion-usb:before {
+ content: ""; }
+
+.ion-videocamera:before {
+ content: ""; }
+
+.ion-volume-high:before {
+ content: ""; }
+
+.ion-volume-low:before {
+ content: ""; }
+
+.ion-volume-medium:before {
+ content: ""; }
+
+.ion-volume-mute:before {
+ content: ""; }
+
+.ion-wand:before {
+ content: ""; }
+
+.ion-waterdrop:before {
+ content: ""; }
+
+.ion-wifi:before {
+ content: ""; }
+
+.ion-wineglass:before {
+ content: ""; }
+
+.ion-woman:before {
+ content: ""; }
+
+.ion-wrench:before {
+ content: ""; }
+
+.ion-xbox:before {
+ content: ""; }
+
+/**
+ * Resets
+ * --------------------------------------------------
+ * Adapted from normalize.css and some reset.css. We don't care even one
+ * bit about old IE, so we don't need any hacks for that in here.
+ *
+ * There are probably other things we could remove here, as well.
+ *
+ * normalize.css v2.1.2 | MIT License | git.io/normalize
+
+ * Eric Meyer's Reset CSS v2.0 (http://meyerweb.com/eric/tools/css/reset/)
+ * http://cssreset.com
+ */
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, i, u, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed, fieldset,
+figure, figcaption, footer, header, hgroup,
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ vertical-align: baseline;
+ font: inherit;
+ font-size: 100%; }
+
+ol, ul {
+ list-style: none; }
+
+blockquote, q {
+ quotes: none; }
+
+blockquote:before, blockquote:after,
+q:before, q:after {
+ content: '';
+ content: none; }
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+audio:not([controls]) {
+ display: none;
+ height: 0; }
+
+/**
+ * Hide the `template` element in IE, Safari, and Firefox < 22.
+ */
+[hidden],
+template {
+ display: none; }
+
+script {
+ display: none !important; }
+
+/* ==========================================================================
+ Base
+ ========================================================================== */
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS text size adjust after orientation change, without disabling
+ * user zoom.
+ */
+html {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ font-family: sans-serif;
+ /* 1 */
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+ /* 2 */
+ -webkit-text-size-adjust: 100%;
+ /* 2 */ }
+
+/**
+ * Remove default margin.
+ */
+body {
+ margin: 0;
+ line-height: 1; }
+
+/**
+ * Remove default outlines.
+ */
+a,
+button,
+:focus,
+a:focus,
+button:focus,
+a:active,
+a:hover {
+ outline: 0; }
+
+/* *
+ * Remove tap highlight color
+ */
+a {
+ -webkit-user-drag: none;
+ -webkit-tap-highlight-color: transparent;
+ -webkit-tap-highlight-color: transparent; }
+ a[href]:hover {
+ cursor: pointer; }
+
+/* ==========================================================================
+ Typography
+ ========================================================================== */
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
+ */
+b,
+strong {
+ font-weight: bold; }
+
+/**
+ * Address styling not present in Safari 5 and Chrome.
+ */
+dfn {
+ font-style: italic; }
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+hr {
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0; }
+
+/**
+ * Correct font family set oddly in Safari 5 and Chrome.
+ */
+code,
+kbd,
+pre,
+samp {
+ font-size: 1em;
+ font-family: monospace, serif; }
+
+/**
+ * Improve readability of pre-formatted text in all browsers.
+ */
+pre {
+ white-space: pre-wrap; }
+
+/**
+ * Set consistent quote types.
+ */
+q {
+ quotes: "\201C" "\201D" "\2018" "\2019"; }
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+small {
+ font-size: 80%; }
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+sub,
+sup {
+ position: relative;
+ vertical-align: baseline;
+ font-size: 75%;
+ line-height: 0; }
+
+sup {
+ top: -0.5em; }
+
+sub {
+ bottom: -0.25em; }
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+fieldset {
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+ border: 1px solid #c0c0c0; }
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+legend {
+ padding: 0;
+ /* 2 */
+ border: 0;
+ /* 1 */ }
+
+/**
+ * 1. Correct font family not being inherited in all browsers.
+ * 2. Correct font size not being inherited in all browsers.
+ * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
+ * 4. Remove any default :focus styles
+ * 5. Make sure webkit font smoothing is being inherited
+ * 6. Remove default gradient in Android Firefox / FirefoxOS
+ */
+button,
+input,
+select,
+textarea {
+ margin: 0;
+ /* 3 */
+ font-size: 100%;
+ /* 2 */
+ font-family: inherit;
+ /* 1 */
+ outline-offset: 0;
+ /* 4 */
+ outline-style: none;
+ /* 4 */
+ outline-width: 0;
+ /* 4 */
+ -webkit-font-smoothing: inherit;
+ /* 5 */
+ background-image: none;
+ /* 6 */ }
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `importnt` in
+ * the UA stylesheet.
+ */
+button,
+input {
+ line-height: normal; }
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.
+ * Correct `select` style inheritance in Firefox 4+ and Opera.
+ */
+button,
+select {
+ text-transform: none; }
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ * and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ * `input` and others.
+ */
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+ cursor: pointer;
+ /* 3 */
+ -webkit-appearance: button;
+ /* 2 */ }
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+button[disabled],
+html input[disabled] {
+ cursor: default; }
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
+ * (include `-moz` to future-proof).
+ */
+input[type="search"] {
+ -webkit-box-sizing: content-box;
+ /* 2 */
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ -webkit-appearance: textfield;
+ /* 1 */ }
+
+/**
+ * Remove inner padding and search cancel button in Safari 5 and Chrome
+ * on OS X.
+ */
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none; }
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ padding: 0;
+ border: 0; }
+
+/**
+ * 1. Remove default vertical scrollbar in IE 8/9.
+ * 2. Improve readability and alignment in all browsers.
+ */
+textarea {
+ overflow: auto;
+ /* 1 */
+ vertical-align: top;
+ /* 2 */ }
+
+img {
+ -webkit-user-drag: none; }
+
+/* ==========================================================================
+ Tables
+ ========================================================================== */
+/**
+ * Remove most spacing between table cells.
+ */
+table {
+ border-spacing: 0;
+ border-collapse: collapse; }
+
+/**
+ * Scaffolding
+ * --------------------------------------------------
+ */
+*,
+*:before,
+*:after {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box; }
+
+html {
+ overflow: hidden;
+ -ms-touch-action: pan-y;
+ touch-action: pan-y; }
+
+body,
+.ionic-body {
+ -webkit-touch-callout: none;
+ -webkit-font-smoothing: antialiased;
+ font-smoothing: antialiased;
+ -webkit-text-size-adjust: none;
+ -moz-text-size-adjust: none;
+ text-size-adjust: none;
+ -webkit-tap-highlight-color: transparent;
+ -webkit-tap-highlight-color: transparent;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+ color: #000;
+ word-wrap: break-word;
+ font-size: 14px;
+ font-family: -apple-system;
+ font-family: "-apple-system", "Helvetica Neue", "Roboto", "Segoe UI", sans-serif;
+ line-height: 20px;
+ text-rendering: optimizeLegibility;
+ -webkit-backface-visibility: hidden;
+ -webkit-user-drag: none;
+ -ms-content-zooming: none; }
+
+body.grade-b,
+body.grade-c {
+ text-rendering: auto; }
+
+.content {
+ position: relative; }
+
+.scroll-content {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ overflow: hidden;
+ margin-top: -1px;
+ padding-top: 1px;
+ margin-bottom: -1px;
+ width: auto;
+ height: auto; }
+
+.menu .scroll-content.scroll-content-false {
+ z-index: 11; }
+
+.scroll-view {
+ position: relative;
+ display: block;
+ overflow: hidden;
+ margin-top: -1px; }
+ .scroll-view.overflow-scroll {
+ position: relative; }
+ .scroll-view.scroll-x {
+ overflow-x: scroll;
+ overflow-y: hidden; }
+ .scroll-view.scroll-y {
+ overflow-x: hidden;
+ overflow-y: scroll; }
+ .scroll-view.scroll-xy {
+ overflow-x: scroll;
+ overflow-y: scroll; }
+
+/**
+ * Scroll is the scroll view component available for complex and custom
+ * scroll view functionality.
+ */
+.scroll {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-touch-callout: none;
+ -webkit-text-size-adjust: none;
+ -moz-text-size-adjust: none;
+ text-size-adjust: none;
+ -webkit-transform-origin: left top;
+ transform-origin: left top; }
+
+/**
+ * Set ms-viewport to prevent MS "page squish" and allow fluid scrolling
+ * https://msdn.microsoft.com/en-us/library/ie/hh869615(v=vs.85).aspx
+ */
+@-ms-viewport {
+ width: device-width; }
+
+.scroll-bar {
+ position: absolute;
+ z-index: 9999; }
+
+.ng-animate .scroll-bar {
+ visibility: hidden; }
+
+.scroll-bar-h {
+ right: 2px;
+ bottom: 3px;
+ left: 2px;
+ height: 3px; }
+ .scroll-bar-h .scroll-bar-indicator {
+ height: 100%; }
+
+.scroll-bar-v {
+ top: 2px;
+ right: 3px;
+ bottom: 2px;
+ width: 3px; }
+ .scroll-bar-v .scroll-bar-indicator {
+ width: 100%; }
+
+.scroll-bar-indicator {
+ position: absolute;
+ border-radius: 4px;
+ background: rgba(0, 0, 0, 0.3);
+ opacity: 1;
+ -webkit-transition: opacity 0.3s linear;
+ transition: opacity 0.3s linear; }
+ .scroll-bar-indicator.scroll-bar-fade-out {
+ opacity: 0; }
+
+.platform-android .scroll-bar-indicator {
+ border-radius: 0; }
+
+.grade-b .scroll-bar-indicator,
+.grade-c .scroll-bar-indicator {
+ background: #aaa; }
+ .grade-b .scroll-bar-indicator.scroll-bar-fade-out,
+ .grade-c .scroll-bar-indicator.scroll-bar-fade-out {
+ -webkit-transition: none;
+ transition: none; }
+
+ion-infinite-scroll {
+ height: 60px;
+ width: 100%;
+ display: block;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-direction: normal;
+ -webkit-box-orient: horizontal;
+ -webkit-flex-direction: row;
+ -moz-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ -webkit-justify-content: center;
+ -moz-justify-content: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ -moz-align-items: center;
+ align-items: center; }
+ ion-infinite-scroll .icon {
+ color: #666666;
+ font-size: 30px;
+ color: #666666; }
+ ion-infinite-scroll:not(.active) .spinner,
+ ion-infinite-scroll:not(.active) .icon:before {
+ display: none; }
+
+.overflow-scroll {
+ overflow-x: hidden;
+ overflow-y: scroll;
+ -webkit-overflow-scrolling: touch;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ position: absolute; }
+ .overflow-scroll.pane {
+ overflow-x: hidden;
+ overflow-y: scroll; }
+ .overflow-scroll .scroll {
+ position: static;
+ height: 100%;
+ -webkit-transform: translate3d(0, 0, 0); }
+
+/* If you change these, change platform.scss as well */
+.has-header {
+ top: 44px; }
+
+.no-header {
+ top: 0; }
+
+.has-subheader {
+ top: 88px; }
+
+.has-tabs-top {
+ top: 93px; }
+
+.has-header.has-subheader.has-tabs-top {
+ top: 137px; }
+
+.has-footer {
+ bottom: 44px; }
+
+.has-subfooter {
+ bottom: 88px; }
+
+.has-tabs,
+.bar-footer.has-tabs {
+ bottom: 49px; }
+ .has-tabs.pane,
+ .bar-footer.has-tabs.pane {
+ bottom: 49px;
+ height: auto; }
+
+.bar-subfooter.has-tabs {
+ bottom: 93px; }
+
+.has-footer.has-tabs {
+ bottom: 93px; }
+
+.pane {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ -webkit-transition-duration: 0;
+ transition-duration: 0;
+ z-index: 1; }
+
+.view {
+ z-index: 1; }
+
+.pane,
+.view {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: #fff;
+ overflow: hidden; }
+
+.view-container {
+ position: absolute;
+ display: block;
+ width: 100%;
+ height: 100%; }
+
+/**
+ * Typography
+ * --------------------------------------------------
+ */
+p {
+ margin: 0 0 10px; }
+
+small {
+ font-size: 85%; }
+
+cite {
+ font-style: normal; }
+
+.text-left {
+ text-align: left; }
+
+.text-right {
+ text-align: right; }
+
+.text-center {
+ text-align: center; }
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+ color: #000;
+ font-weight: 500;
+ font-family: "-apple-system", "Helvetica Neue", "Roboto", "Segoe UI", sans-serif;
+ line-height: 1.2; }
+ h1 small, h2 small, h3 small, h4 small, h5 small, h6 small,
+ .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small {
+ font-weight: normal;
+ line-height: 1; }
+
+h1, .h1,
+h2, .h2,
+h3, .h3 {
+ margin-top: 20px;
+ margin-bottom: 10px; }
+ h1:first-child, .h1:first-child,
+ h2:first-child, .h2:first-child,
+ h3:first-child, .h3:first-child {
+ margin-top: 0; }
+ h1 + h1, h1 + .h1,
+ h1 + h2, h1 + .h2,
+ h1 + h3, h1 + .h3, .h1 + h1, .h1 + .h1,
+ .h1 + h2, .h1 + .h2,
+ .h1 + h3, .h1 + .h3,
+ h2 + h1,
+ h2 + .h1,
+ h2 + h2,
+ h2 + .h2,
+ h2 + h3,
+ h2 + .h3, .h2 + h1, .h2 + .h1,
+ .h2 + h2, .h2 + .h2,
+ .h2 + h3, .h2 + .h3,
+ h3 + h1,
+ h3 + .h1,
+ h3 + h2,
+ h3 + .h2,
+ h3 + h3,
+ h3 + .h3, .h3 + h1, .h3 + .h1,
+ .h3 + h2, .h3 + .h2,
+ .h3 + h3, .h3 + .h3 {
+ margin-top: 10px; }
+
+h4, .h4,
+h5, .h5,
+h6, .h6 {
+ margin-top: 10px;
+ margin-bottom: 10px; }
+
+h1, .h1 {
+ font-size: 36px; }
+
+h2, .h2 {
+ font-size: 30px; }
+
+h3, .h3 {
+ font-size: 24px; }
+
+h4, .h4 {
+ font-size: 18px; }
+
+h5, .h5 {
+ font-size: 14px; }
+
+h6, .h6 {
+ font-size: 12px; }
+
+h1 small, .h1 small {
+ font-size: 24px; }
+
+h2 small, .h2 small {
+ font-size: 18px; }
+
+h3 small, .h3 small,
+h4 small, .h4 small {
+ font-size: 14px; }
+
+dl {
+ margin-bottom: 20px; }
+
+dt,
+dd {
+ line-height: 1.42857; }
+
+dt {
+ font-weight: bold; }
+
+blockquote {
+ margin: 0 0 20px;
+ padding: 10px 20px;
+ border-left: 5px solid gray; }
+ blockquote p {
+ font-weight: 300;
+ font-size: 17.5px;
+ line-height: 1.25; }
+ blockquote p:last-child {
+ margin-bottom: 0; }
+ blockquote small {
+ display: block;
+ line-height: 1.42857; }
+ blockquote small:before {
+ content: '\2014 \00A0'; }
+
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+ content: ""; }
+
+address {
+ display: block;
+ margin-bottom: 20px;
+ font-style: normal;
+ line-height: 1.42857; }
+
+a {
+ color: #387ef5; }
+
+a.subdued {
+ padding-right: 10px;
+ color: #888;
+ text-decoration: none; }
+ a.subdued:hover {
+ text-decoration: none; }
+ a.subdued:last-child {
+ padding-right: 0; }
+
+/**
+ * Action Sheets
+ * --------------------------------------------------
+ */
+.action-sheet-backdrop {
+ -webkit-transition: background-color 150ms ease-in-out;
+ transition: background-color 150ms ease-in-out;
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 11;
+ width: 100%;
+ height: 100%;
+ background-color: transparent; }
+ .action-sheet-backdrop.active {
+ background-color: rgba(0, 0, 0, 0.4); }
+
+.action-sheet-wrapper {
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ -webkit-transition: all cubic-bezier(0.36, 0.66, 0.04, 1) 500ms;
+ transition: all cubic-bezier(0.36, 0.66, 0.04, 1) 500ms;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ width: 100%;
+ max-width: 500px;
+ margin: auto; }
+
+.action-sheet-up {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0); }
+
+.action-sheet {
+ margin-left: 8px;
+ margin-right: 8px;
+ width: auto;
+ z-index: 11;
+ overflow: hidden; }
+ .action-sheet .button {
+ display: block;
+ padding: 1px;
+ width: 100%;
+ border-radius: 0;
+ border-color: #d1d3d6;
+ background-color: transparent;
+ color: #007aff;
+ font-size: 21px; }
+ .action-sheet .button:hover {
+ color: #007aff; }
+ .action-sheet .button.destructive {
+ color: #ff3b30; }
+ .action-sheet .button.destructive:hover {
+ color: #ff3b30; }
+ .action-sheet .button.active, .action-sheet .button.activated {
+ box-shadow: none;
+ border-color: #d1d3d6;
+ color: #007aff;
+ background: #e4e5e7; }
+
+.action-sheet-has-icons .icon {
+ position: absolute;
+ left: 16px; }
+
+.action-sheet-title {
+ padding: 16px;
+ color: #8f8f8f;
+ text-align: center;
+ font-size: 13px; }
+
+.action-sheet-group {
+ margin-bottom: 8px;
+ border-radius: 4px;
+ background-color: #fff;
+ overflow: hidden; }
+ .action-sheet-group .button {
+ border-width: 1px 0px 0px 0px; }
+ .action-sheet-group .button:first-child:last-child {
+ border-width: 0; }
+
+.action-sheet-options {
+ background: #f1f2f3; }
+
+.action-sheet-cancel .button {
+ font-weight: 500; }
+
+.action-sheet-open {
+ pointer-events: none; }
+ .action-sheet-open.modal-open .modal {
+ pointer-events: none; }
+ .action-sheet-open .action-sheet-backdrop {
+ pointer-events: auto; }
+
+.platform-android .action-sheet-backdrop.active {
+ background-color: rgba(0, 0, 0, 0.2); }
+
+.platform-android .action-sheet {
+ margin: 0; }
+ .platform-android .action-sheet .action-sheet-title,
+ .platform-android .action-sheet .button {
+ text-align: left;
+ border-color: transparent;
+ font-size: 16px;
+ color: inherit; }
+ .platform-android .action-sheet .action-sheet-title {
+ font-size: 14px;
+ padding: 16px;
+ color: #666; }
+ .platform-android .action-sheet .button.active,
+ .platform-android .action-sheet .button.activated {
+ background: #e8e8e8; }
+
+.platform-android .action-sheet-group {
+ margin: 0;
+ border-radius: 0;
+ background-color: #fafafa; }
+
+.platform-android .action-sheet-cancel {
+ display: none; }
+
+.platform-android .action-sheet-has-icons .button {
+ padding-left: 56px; }
+
+.backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 11;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(0, 0, 0, 0.4);
+ visibility: hidden;
+ opacity: 0;
+ -webkit-transition: 0.1s opacity linear;
+ transition: 0.1s opacity linear; }
+ .backdrop.visible {
+ visibility: visible; }
+ .backdrop.active {
+ opacity: 1; }
+
+/**
+ * Bar (Headers and Footers)
+ * --------------------------------------------------
+ */
+.bar {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ position: absolute;
+ right: 0;
+ left: 0;
+ z-index: 9;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ padding: 5px;
+ width: 100%;
+ height: 44px;
+ border-width: 0;
+ border-style: solid;
+ border-top: 1px solid transparent;
+ border-bottom: 1px solid #ddd;
+ background-color: white;
+ /* border-width: 1px will actually create 2 device pixels on retina */
+ /* this nifty trick sets an actual 1px border on hi-res displays */
+ background-size: 0; }
+ @media (min--moz-device-pixel-ratio: 1.5), (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5), (min-resolution: 144dpi), (min-resolution: 1.5dppx) {
+ .bar {
+ border: none;
+ background-image: linear-gradient(0deg, #ddd, #ddd 50%, transparent 50%);
+ background-position: bottom;
+ background-size: 100% 1px;
+ background-repeat: no-repeat; } }
+ .bar.bar-clear {
+ border: none;
+ background: none;
+ color: #fff; }
+ .bar.bar-clear .button {
+ color: #fff; }
+ .bar.bar-clear .title {
+ color: #fff; }
+ .bar.item-input-inset .item-input-wrapper {
+ margin-top: -1px; }
+ .bar.item-input-inset .item-input-wrapper input {
+ padding-left: 8px;
+ width: 94%;
+ height: 28px;
+ background: transparent; }
+ .bar.bar-light {
+ border-color: #ddd;
+ background-color: white;
+ background-image: linear-gradient(0deg, #ddd, #ddd 50%, transparent 50%);
+ color: #444; }
+ .bar.bar-light .title {
+ color: #444; }
+ .bar.bar-light.bar-footer {
+ background-image: linear-gradient(180deg, #ddd, #ddd 50%, transparent 50%); }
+ .bar.bar-stable {
+ border-color: #b2b2b2;
+ background-color: #f8f8f8;
+ background-image: linear-gradient(0deg, #b2b2b2, #b2b2b2 50%, transparent 50%);
+ color: #444; }
+ .bar.bar-stable .title {
+ color: #444; }
+ .bar.bar-stable.bar-footer {
+ background-image: linear-gradient(180deg, #b2b2b2, #b2b2b2 50%, transparent 50%); }
+ .bar.bar-positive {
+ border-color: #0c60ee;
+ background-color: #387ef5;
+ background-image: linear-gradient(0deg, #0c60ee, #0c60ee 50%, transparent 50%);
+ color: #fff; }
+ .bar.bar-positive .title {
+ color: #fff; }
+ .bar.bar-positive.bar-footer {
+ background-image: linear-gradient(180deg, #0c60ee, #0c60ee 50%, transparent 50%); }
+ .bar.bar-calm {
+ border-color: #0a9dc7;
+ background-color: #11c1f3;
+ background-image: linear-gradient(0deg, #0a9dc7, #0a9dc7 50%, transparent 50%);
+ color: #fff; }
+ .bar.bar-calm .title {
+ color: #fff; }
+ .bar.bar-calm.bar-footer {
+ background-image: linear-gradient(180deg, #0a9dc7, #0a9dc7 50%, transparent 50%); }
+ .bar.bar-assertive {
+ border-color: #e42112;
+ background-color: #ef473a;
+ background-image: linear-gradient(0deg, #e42112, #e42112 50%, transparent 50%);
+ color: #fff; }
+ .bar.bar-assertive .title {
+ color: #fff; }
+ .bar.bar-assertive.bar-footer {
+ background-image: linear-gradient(180deg, #e42112, #e42112 50%, transparent 50%); }
+ .bar.bar-balanced {
+ border-color: #28a54c;
+ background-color: #33cd5f;
+ background-image: linear-gradient(0deg, #28a54c, #28a54c 50%, transparent 50%);
+ color: #fff; }
+ .bar.bar-balanced .title {
+ color: #fff; }
+ .bar.bar-balanced.bar-footer {
+ background-image: linear-gradient(180deg, #28a54c, #28a54c 50%, transparent 50%); }
+ .bar.bar-energized {
+ border-color: #e6b500;
+ background-color: #ffc900;
+ background-image: linear-gradient(0deg, #e6b500, #e6b500 50%, transparent 50%);
+ color: #fff; }
+ .bar.bar-energized .title {
+ color: #fff; }
+ .bar.bar-energized.bar-footer {
+ background-image: linear-gradient(180deg, #e6b500, #e6b500 50%, transparent 50%); }
+ .bar.bar-royal {
+ border-color: #6b46e5;
+ background-color: #886aea;
+ background-image: linear-gradient(0deg, #6b46e5, #6b46e5 50%, transparent 50%);
+ color: #fff; }
+ .bar.bar-royal .title {
+ color: #fff; }
+ .bar.bar-royal.bar-footer {
+ background-image: linear-gradient(180deg, #6b46e5, #6b46e5 50%, transparent 50%); }
+ .bar.bar-dark {
+ border-color: #111;
+ background-color: #444444;
+ background-image: linear-gradient(0deg, #111, #111 50%, transparent 50%);
+ color: #fff; }
+ .bar.bar-dark .title {
+ color: #fff; }
+ .bar.bar-dark.bar-footer {
+ background-image: linear-gradient(180deg, #111, #111 50%, transparent 50%); }
+ .bar .title {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 0;
+ overflow: hidden;
+ margin: 0 10px;
+ min-width: 30px;
+ height: 43px;
+ text-align: center;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ font-size: 17px;
+ font-weight: 500;
+ line-height: 44px; }
+ .bar .title.title-left {
+ text-align: left; }
+ .bar .title.title-right {
+ text-align: right; }
+ .bar .title a {
+ color: inherit; }
+ .bar .button, .bar button {
+ z-index: 1;
+ padding: 0 8px;
+ min-width: initial;
+ min-height: 31px;
+ font-weight: 400;
+ font-size: 13px;
+ line-height: 32px; }
+ .bar .button.button-icon:before,
+ .bar .button .icon:before, .bar .button.icon:before, .bar .button.icon-left:before, .bar .button.icon-right:before, .bar button.button-icon:before,
+ .bar button .icon:before, .bar button.icon:before, .bar button.icon-left:before, .bar button.icon-right:before {
+ padding-right: 2px;
+ padding-left: 2px;
+ font-size: 20px;
+ line-height: 32px; }
+ .bar .button.button-icon, .bar button.button-icon {
+ font-size: 17px; }
+ .bar .button.button-icon .icon:before, .bar .button.button-icon:before, .bar .button.button-icon.icon-left:before, .bar .button.button-icon.icon-right:before, .bar button.button-icon .icon:before, .bar button.button-icon:before, .bar button.button-icon.icon-left:before, .bar button.button-icon.icon-right:before {
+ vertical-align: top;
+ font-size: 32px;
+ line-height: 32px; }
+ .bar .button.button-clear, .bar button.button-clear {
+ padding-right: 2px;
+ padding-left: 2px;
+ font-weight: 300;
+ font-size: 17px; }
+ .bar .button.button-clear .icon:before, .bar .button.button-clear.icon:before, .bar .button.button-clear.icon-left:before, .bar .button.button-clear.icon-right:before, .bar button.button-clear .icon:before, .bar button.button-clear.icon:before, .bar button.button-clear.icon-left:before, .bar button.button-clear.icon-right:before {
+ font-size: 32px;
+ line-height: 32px; }
+ .bar .button.back-button, .bar button.back-button {
+ display: block;
+ margin-right: 5px;
+ padding: 0;
+ white-space: nowrap;
+ font-weight: 400; }
+ .bar .button.back-button.active, .bar .button.back-button.activated, .bar button.back-button.active, .bar button.back-button.activated {
+ opacity: 0.2; }
+ .bar .button-bar > .button,
+ .bar .buttons > .button {
+ min-height: 31px;
+ line-height: 32px; }
+ .bar .button-bar + .button,
+ .bar .button + .button-bar {
+ margin-left: 5px; }
+ .bar .buttons,
+ .bar .buttons.primary-buttons,
+ .bar .buttons.secondary-buttons {
+ display: inherit; }
+ .bar .buttons span {
+ display: inline-block; }
+ .bar .buttons-left span {
+ margin-right: 5px;
+ display: inherit; }
+ .bar .buttons-right span {
+ margin-left: 5px;
+ display: inherit; }
+ .bar .title + .button:last-child,
+ .bar > .button + .button:last-child,
+ .bar > .button.pull-right,
+ .bar .buttons.pull-right,
+ .bar .title + .buttons {
+ position: absolute;
+ top: 5px;
+ right: 5px;
+ bottom: 5px; }
+
+.platform-android .nav-bar-has-subheader .bar {
+ background-image: none; }
+
+.platform-android .bar .back-button .icon:before {
+ font-size: 24px; }
+
+.platform-android .bar .title {
+ font-size: 19px;
+ line-height: 44px; }
+
+.bar-light .button {
+ border-color: #ddd;
+ background-color: white;
+ color: #444; }
+ .bar-light .button:hover {
+ color: #444;
+ text-decoration: none; }
+ .bar-light .button.active, .bar-light .button.activated {
+ border-color: #ccc;
+ background-color: #fafafa; }
+ .bar-light .button.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #444;
+ font-size: 17px; }
+ .bar-light .button.button-icon {
+ border-color: transparent;
+ background: none; }
+
+.bar-stable .button {
+ border-color: #b2b2b2;
+ background-color: #f8f8f8;
+ color: #444; }
+ .bar-stable .button:hover {
+ color: #444;
+ text-decoration: none; }
+ .bar-stable .button.active, .bar-stable .button.activated {
+ border-color: #a2a2a2;
+ background-color: #e5e5e5; }
+ .bar-stable .button.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #444;
+ font-size: 17px; }
+ .bar-stable .button.button-icon {
+ border-color: transparent;
+ background: none; }
+
+.bar-positive .button {
+ border-color: #0c60ee;
+ background-color: #387ef5;
+ color: #fff; }
+ .bar-positive .button:hover {
+ color: #fff;
+ text-decoration: none; }
+ .bar-positive .button.active, .bar-positive .button.activated {
+ border-color: #0c60ee;
+ background-color: #0c60ee; }
+ .bar-positive .button.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #fff;
+ font-size: 17px; }
+ .bar-positive .button.button-icon {
+ border-color: transparent;
+ background: none; }
+
+.bar-calm .button {
+ border-color: #0a9dc7;
+ background-color: #11c1f3;
+ color: #fff; }
+ .bar-calm .button:hover {
+ color: #fff;
+ text-decoration: none; }
+ .bar-calm .button.active, .bar-calm .button.activated {
+ border-color: #0a9dc7;
+ background-color: #0a9dc7; }
+ .bar-calm .button.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #fff;
+ font-size: 17px; }
+ .bar-calm .button.button-icon {
+ border-color: transparent;
+ background: none; }
+
+.bar-assertive .button {
+ border-color: #e42112;
+ background-color: #ef473a;
+ color: #fff; }
+ .bar-assertive .button:hover {
+ color: #fff;
+ text-decoration: none; }
+ .bar-assertive .button.active, .bar-assertive .button.activated {
+ border-color: #e42112;
+ background-color: #e42112; }
+ .bar-assertive .button.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #fff;
+ font-size: 17px; }
+ .bar-assertive .button.button-icon {
+ border-color: transparent;
+ background: none; }
+
+.bar-balanced .button {
+ border-color: #28a54c;
+ background-color: #33cd5f;
+ color: #fff; }
+ .bar-balanced .button:hover {
+ color: #fff;
+ text-decoration: none; }
+ .bar-balanced .button.active, .bar-balanced .button.activated {
+ border-color: #28a54c;
+ background-color: #28a54c; }
+ .bar-balanced .button.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #fff;
+ font-size: 17px; }
+ .bar-balanced .button.button-icon {
+ border-color: transparent;
+ background: none; }
+
+.bar-energized .button {
+ border-color: #e6b500;
+ background-color: #ffc900;
+ color: #fff; }
+ .bar-energized .button:hover {
+ color: #fff;
+ text-decoration: none; }
+ .bar-energized .button.active, .bar-energized .button.activated {
+ border-color: #e6b500;
+ background-color: #e6b500; }
+ .bar-energized .button.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #fff;
+ font-size: 17px; }
+ .bar-energized .button.button-icon {
+ border-color: transparent;
+ background: none; }
+
+.bar-royal .button {
+ border-color: #6b46e5;
+ background-color: #886aea;
+ color: #fff; }
+ .bar-royal .button:hover {
+ color: #fff;
+ text-decoration: none; }
+ .bar-royal .button.active, .bar-royal .button.activated {
+ border-color: #6b46e5;
+ background-color: #6b46e5; }
+ .bar-royal .button.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #fff;
+ font-size: 17px; }
+ .bar-royal .button.button-icon {
+ border-color: transparent;
+ background: none; }
+
+.bar-dark .button {
+ border-color: #111;
+ background-color: #444444;
+ color: #fff; }
+ .bar-dark .button:hover {
+ color: #fff;
+ text-decoration: none; }
+ .bar-dark .button.active, .bar-dark .button.activated {
+ border-color: #000;
+ background-color: #262626; }
+ .bar-dark .button.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #fff;
+ font-size: 17px; }
+ .bar-dark .button.button-icon {
+ border-color: transparent;
+ background: none; }
+
+.bar-header {
+ top: 0;
+ border-top-width: 0;
+ border-bottom-width: 1px; }
+ .bar-header.has-tabs-top {
+ border-bottom-width: 0px;
+ background-image: none; }
+
+.tabs-top .bar-header {
+ border-bottom-width: 0px;
+ background-image: none; }
+
+.bar-footer {
+ bottom: 0;
+ border-top-width: 1px;
+ border-bottom-width: 0;
+ background-position: top;
+ height: 44px; }
+ .bar-footer.item-input-inset {
+ position: absolute; }
+ .bar-footer .title {
+ height: 43px;
+ line-height: 44px; }
+
+.bar-tabs {
+ padding: 0; }
+
+.bar-subheader {
+ top: 44px;
+ height: 44px; }
+ .bar-subheader .title {
+ height: 43px;
+ line-height: 44px; }
+
+.bar-subfooter {
+ bottom: 44px;
+ height: 44px; }
+ .bar-subfooter .title {
+ height: 43px;
+ line-height: 44px; }
+
+.nav-bar-block {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 9; }
+
+.bar .back-button.hide,
+.bar .buttons .hide {
+ display: none; }
+
+.nav-bar-tabs-top .bar {
+ background-image: none; }
+
+/**
+ * Tabs
+ * --------------------------------------------------
+ * A navigation bar with any number of tab items supported.
+ */
+.tabs {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-direction: normal;
+ -webkit-box-orient: horizontal;
+ -webkit-flex-direction: horizontal;
+ -moz-flex-direction: horizontal;
+ -ms-flex-direction: horizontal;
+ flex-direction: horizontal;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ -webkit-justify-content: center;
+ -moz-justify-content: center;
+ justify-content: center;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ border-color: #b2b2b2;
+ background-color: #f8f8f8;
+ background-image: linear-gradient(0deg, #b2b2b2, #b2b2b2 50%, transparent 50%);
+ color: #444;
+ position: absolute;
+ bottom: 0;
+ z-index: 5;
+ width: 100%;
+ height: 49px;
+ border-style: solid;
+ border-top-width: 1px;
+ background-size: 0;
+ line-height: 49px; }
+ .tabs .tab-item .badge {
+ background-color: #444;
+ color: #f8f8f8; }
+ @media (min--moz-device-pixel-ratio: 1.5), (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5), (min-resolution: 144dpi), (min-resolution: 1.5dppx) {
+ .tabs {
+ padding-top: 2px;
+ border-top: none !important;
+ border-bottom: none;
+ background-position: top;
+ background-size: 100% 1px;
+ background-repeat: no-repeat; } }
+
+/* Allow parent element of tabs to define color, or just the tab itself */
+.tabs-light > .tabs,
+.tabs.tabs-light {
+ border-color: #ddd;
+ background-color: #fff;
+ background-image: linear-gradient(0deg, #ddd, #ddd 50%, transparent 50%);
+ color: #444; }
+ .tabs-light > .tabs .tab-item .badge,
+ .tabs.tabs-light .tab-item .badge {
+ background-color: #444;
+ color: #fff; }
+
+.tabs-stable > .tabs,
+.tabs.tabs-stable {
+ border-color: #b2b2b2;
+ background-color: #f8f8f8;
+ background-image: linear-gradient(0deg, #b2b2b2, #b2b2b2 50%, transparent 50%);
+ color: #444; }
+ .tabs-stable > .tabs .tab-item .badge,
+ .tabs.tabs-stable .tab-item .badge {
+ background-color: #444;
+ color: #f8f8f8; }
+
+.tabs-positive > .tabs,
+.tabs.tabs-positive {
+ border-color: #0c60ee;
+ background-color: #387ef5;
+ background-image: linear-gradient(0deg, #0c60ee, #0c60ee 50%, transparent 50%);
+ color: #fff; }
+ .tabs-positive > .tabs .tab-item .badge,
+ .tabs.tabs-positive .tab-item .badge {
+ background-color: #fff;
+ color: #387ef5; }
+
+.tabs-calm > .tabs,
+.tabs.tabs-calm {
+ border-color: #0a9dc7;
+ background-color: #11c1f3;
+ background-image: linear-gradient(0deg, #0a9dc7, #0a9dc7 50%, transparent 50%);
+ color: #fff; }
+ .tabs-calm > .tabs .tab-item .badge,
+ .tabs.tabs-calm .tab-item .badge {
+ background-color: #fff;
+ color: #11c1f3; }
+
+.tabs-assertive > .tabs,
+.tabs.tabs-assertive {
+ border-color: #e42112;
+ background-color: #ef473a;
+ background-image: linear-gradient(0deg, #e42112, #e42112 50%, transparent 50%);
+ color: #fff; }
+ .tabs-assertive > .tabs .tab-item .badge,
+ .tabs.tabs-assertive .tab-item .badge {
+ background-color: #fff;
+ color: #ef473a; }
+
+.tabs-balanced > .tabs,
+.tabs.tabs-balanced {
+ border-color: #28a54c;
+ background-color: #33cd5f;
+ background-image: linear-gradient(0deg, #28a54c, #28a54c 50%, transparent 50%);
+ color: #fff; }
+ .tabs-balanced > .tabs .tab-item .badge,
+ .tabs.tabs-balanced .tab-item .badge {
+ background-color: #fff;
+ color: #33cd5f; }
+
+.tabs-energized > .tabs,
+.tabs.tabs-energized {
+ border-color: #e6b500;
+ background-color: #ffc900;
+ background-image: linear-gradient(0deg, #e6b500, #e6b500 50%, transparent 50%);
+ color: #fff; }
+ .tabs-energized > .tabs .tab-item .badge,
+ .tabs.tabs-energized .tab-item .badge {
+ background-color: #fff;
+ color: #ffc900; }
+
+.tabs-royal > .tabs,
+.tabs.tabs-royal {
+ border-color: #6b46e5;
+ background-color: #886aea;
+ background-image: linear-gradient(0deg, #6b46e5, #6b46e5 50%, transparent 50%);
+ color: #fff; }
+ .tabs-royal > .tabs .tab-item .badge,
+ .tabs.tabs-royal .tab-item .badge {
+ background-color: #fff;
+ color: #886aea; }
+
+.tabs-dark > .tabs,
+.tabs.tabs-dark {
+ border-color: #111;
+ background-color: #444;
+ background-image: linear-gradient(0deg, #111, #111 50%, transparent 50%);
+ color: #fff; }
+ .tabs-dark > .tabs .tab-item .badge,
+ .tabs.tabs-dark .tab-item .badge {
+ background-color: #fff;
+ color: #444; }
+
+.tabs-striped .tabs {
+ background-color: white;
+ background-image: none;
+ border: none;
+ border-bottom: 1px solid #ddd;
+ padding-top: 2px; }
+
+.tabs-striped .tab-item.tab-item-active, .tabs-striped .tab-item.active, .tabs-striped .tab-item.activated {
+ margin-top: -2px;
+ border-style: solid;
+ border-width: 2px 0 0 0;
+ border-color: #444; }
+ .tabs-striped .tab-item.tab-item-active .badge, .tabs-striped .tab-item.active .badge, .tabs-striped .tab-item.activated .badge {
+ top: 2px;
+ opacity: 1; }
+
+.tabs-striped.tabs-light .tabs {
+ background-color: #fff; }
+
+.tabs-striped.tabs-light .tab-item {
+ color: rgba(68, 68, 68, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-light .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-light .tab-item.tab-item-active, .tabs-striped.tabs-light .tab-item.active, .tabs-striped.tabs-light .tab-item.activated {
+ margin-top: -2px;
+ color: #444;
+ border-style: solid;
+ border-width: 2px 0 0 0;
+ border-color: #444; }
+
+.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge {
+ top: 4%; }
+
+.tabs-striped.tabs-stable .tabs {
+ background-color: #f8f8f8; }
+
+.tabs-striped.tabs-stable .tab-item {
+ color: rgba(68, 68, 68, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-stable .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-stable .tab-item.tab-item-active, .tabs-striped.tabs-stable .tab-item.active, .tabs-striped.tabs-stable .tab-item.activated {
+ margin-top: -2px;
+ color: #444;
+ border-style: solid;
+ border-width: 2px 0 0 0;
+ border-color: #444; }
+
+.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge {
+ top: 4%; }
+
+.tabs-striped.tabs-positive .tabs {
+ background-color: #387ef5; }
+
+.tabs-striped.tabs-positive .tab-item {
+ color: rgba(255, 255, 255, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-positive .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-positive .tab-item.tab-item-active, .tabs-striped.tabs-positive .tab-item.active, .tabs-striped.tabs-positive .tab-item.activated {
+ margin-top: -2px;
+ color: #fff;
+ border-style: solid;
+ border-width: 2px 0 0 0;
+ border-color: #fff; }
+
+.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge {
+ top: 4%; }
+
+.tabs-striped.tabs-calm .tabs {
+ background-color: #11c1f3; }
+
+.tabs-striped.tabs-calm .tab-item {
+ color: rgba(255, 255, 255, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-calm .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-calm .tab-item.tab-item-active, .tabs-striped.tabs-calm .tab-item.active, .tabs-striped.tabs-calm .tab-item.activated {
+ margin-top: -2px;
+ color: #fff;
+ border-style: solid;
+ border-width: 2px 0 0 0;
+ border-color: #fff; }
+
+.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge {
+ top: 4%; }
+
+.tabs-striped.tabs-assertive .tabs {
+ background-color: #ef473a; }
+
+.tabs-striped.tabs-assertive .tab-item {
+ color: rgba(255, 255, 255, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-assertive .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-assertive .tab-item.tab-item-active, .tabs-striped.tabs-assertive .tab-item.active, .tabs-striped.tabs-assertive .tab-item.activated {
+ margin-top: -2px;
+ color: #fff;
+ border-style: solid;
+ border-width: 2px 0 0 0;
+ border-color: #fff; }
+
+.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge {
+ top: 4%; }
+
+.tabs-striped.tabs-balanced .tabs {
+ background-color: #33cd5f; }
+
+.tabs-striped.tabs-balanced .tab-item {
+ color: rgba(255, 255, 255, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-balanced .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-balanced .tab-item.tab-item-active, .tabs-striped.tabs-balanced .tab-item.active, .tabs-striped.tabs-balanced .tab-item.activated {
+ margin-top: -2px;
+ color: #fff;
+ border-style: solid;
+ border-width: 2px 0 0 0;
+ border-color: #fff; }
+
+.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge {
+ top: 4%; }
+
+.tabs-striped.tabs-energized .tabs {
+ background-color: #ffc900; }
+
+.tabs-striped.tabs-energized .tab-item {
+ color: rgba(255, 255, 255, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-energized .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-energized .tab-item.tab-item-active, .tabs-striped.tabs-energized .tab-item.active, .tabs-striped.tabs-energized .tab-item.activated {
+ margin-top: -2px;
+ color: #fff;
+ border-style: solid;
+ border-width: 2px 0 0 0;
+ border-color: #fff; }
+
+.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge {
+ top: 4%; }
+
+.tabs-striped.tabs-royal .tabs {
+ background-color: #886aea; }
+
+.tabs-striped.tabs-royal .tab-item {
+ color: rgba(255, 255, 255, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-royal .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-royal .tab-item.tab-item-active, .tabs-striped.tabs-royal .tab-item.active, .tabs-striped.tabs-royal .tab-item.activated {
+ margin-top: -2px;
+ color: #fff;
+ border-style: solid;
+ border-width: 2px 0 0 0;
+ border-color: #fff; }
+
+.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge {
+ top: 4%; }
+
+.tabs-striped.tabs-dark .tabs {
+ background-color: #444; }
+
+.tabs-striped.tabs-dark .tab-item {
+ color: rgba(255, 255, 255, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-dark .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-dark .tab-item.tab-item-active, .tabs-striped.tabs-dark .tab-item.active, .tabs-striped.tabs-dark .tab-item.activated {
+ margin-top: -2px;
+ color: #fff;
+ border-style: solid;
+ border-width: 2px 0 0 0;
+ border-color: #fff; }
+
+.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge {
+ top: 4%; }
+
+.tabs-striped.tabs-background-light .tabs {
+ background-color: #fff;
+ background-image: none; }
+
+.tabs-striped.tabs-background-stable .tabs {
+ background-color: #f8f8f8;
+ background-image: none; }
+
+.tabs-striped.tabs-background-positive .tabs {
+ background-color: #387ef5;
+ background-image: none; }
+
+.tabs-striped.tabs-background-calm .tabs {
+ background-color: #11c1f3;
+ background-image: none; }
+
+.tabs-striped.tabs-background-assertive .tabs {
+ background-color: #ef473a;
+ background-image: none; }
+
+.tabs-striped.tabs-background-balanced .tabs {
+ background-color: #33cd5f;
+ background-image: none; }
+
+.tabs-striped.tabs-background-energized .tabs {
+ background-color: #ffc900;
+ background-image: none; }
+
+.tabs-striped.tabs-background-royal .tabs {
+ background-color: #886aea;
+ background-image: none; }
+
+.tabs-striped.tabs-background-dark .tabs {
+ background-color: #444;
+ background-image: none; }
+
+.tabs-striped.tabs-color-light .tab-item {
+ color: rgba(255, 255, 255, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-color-light .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-color-light .tab-item.tab-item-active, .tabs-striped.tabs-color-light .tab-item.active, .tabs-striped.tabs-color-light .tab-item.activated {
+ margin-top: -2px;
+ color: #fff;
+ border: 0 solid #fff;
+ border-top-width: 2px; }
+ .tabs-striped.tabs-color-light .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-light .tab-item.active .badge, .tabs-striped.tabs-color-light .tab-item.activated .badge {
+ top: 2px;
+ opacity: 1; }
+
+.tabs-striped.tabs-color-stable .tab-item {
+ color: rgba(248, 248, 248, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-color-stable .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-color-stable .tab-item.tab-item-active, .tabs-striped.tabs-color-stable .tab-item.active, .tabs-striped.tabs-color-stable .tab-item.activated {
+ margin-top: -2px;
+ color: #f8f8f8;
+ border: 0 solid #f8f8f8;
+ border-top-width: 2px; }
+ .tabs-striped.tabs-color-stable .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-stable .tab-item.active .badge, .tabs-striped.tabs-color-stable .tab-item.activated .badge {
+ top: 2px;
+ opacity: 1; }
+
+.tabs-striped.tabs-color-positive .tab-item {
+ color: rgba(56, 126, 245, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-color-positive .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-color-positive .tab-item.tab-item-active, .tabs-striped.tabs-color-positive .tab-item.active, .tabs-striped.tabs-color-positive .tab-item.activated {
+ margin-top: -2px;
+ color: #387ef5;
+ border: 0 solid #387ef5;
+ border-top-width: 2px; }
+ .tabs-striped.tabs-color-positive .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-positive .tab-item.active .badge, .tabs-striped.tabs-color-positive .tab-item.activated .badge {
+ top: 2px;
+ opacity: 1; }
+
+.tabs-striped.tabs-color-calm .tab-item {
+ color: rgba(17, 193, 243, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-color-calm .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-color-calm .tab-item.tab-item-active, .tabs-striped.tabs-color-calm .tab-item.active, .tabs-striped.tabs-color-calm .tab-item.activated {
+ margin-top: -2px;
+ color: #11c1f3;
+ border: 0 solid #11c1f3;
+ border-top-width: 2px; }
+ .tabs-striped.tabs-color-calm .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-calm .tab-item.active .badge, .tabs-striped.tabs-color-calm .tab-item.activated .badge {
+ top: 2px;
+ opacity: 1; }
+
+.tabs-striped.tabs-color-assertive .tab-item {
+ color: rgba(239, 71, 58, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-color-assertive .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-color-assertive .tab-item.tab-item-active, .tabs-striped.tabs-color-assertive .tab-item.active, .tabs-striped.tabs-color-assertive .tab-item.activated {
+ margin-top: -2px;
+ color: #ef473a;
+ border: 0 solid #ef473a;
+ border-top-width: 2px; }
+ .tabs-striped.tabs-color-assertive .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-assertive .tab-item.active .badge, .tabs-striped.tabs-color-assertive .tab-item.activated .badge {
+ top: 2px;
+ opacity: 1; }
+
+.tabs-striped.tabs-color-balanced .tab-item {
+ color: rgba(51, 205, 95, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-color-balanced .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-color-balanced .tab-item.tab-item-active, .tabs-striped.tabs-color-balanced .tab-item.active, .tabs-striped.tabs-color-balanced .tab-item.activated {
+ margin-top: -2px;
+ color: #33cd5f;
+ border: 0 solid #33cd5f;
+ border-top-width: 2px; }
+ .tabs-striped.tabs-color-balanced .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-balanced .tab-item.active .badge, .tabs-striped.tabs-color-balanced .tab-item.activated .badge {
+ top: 2px;
+ opacity: 1; }
+
+.tabs-striped.tabs-color-energized .tab-item {
+ color: rgba(255, 201, 0, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-color-energized .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-color-energized .tab-item.tab-item-active, .tabs-striped.tabs-color-energized .tab-item.active, .tabs-striped.tabs-color-energized .tab-item.activated {
+ margin-top: -2px;
+ color: #ffc900;
+ border: 0 solid #ffc900;
+ border-top-width: 2px; }
+ .tabs-striped.tabs-color-energized .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-energized .tab-item.active .badge, .tabs-striped.tabs-color-energized .tab-item.activated .badge {
+ top: 2px;
+ opacity: 1; }
+
+.tabs-striped.tabs-color-royal .tab-item {
+ color: rgba(136, 106, 234, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-color-royal .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-color-royal .tab-item.tab-item-active, .tabs-striped.tabs-color-royal .tab-item.active, .tabs-striped.tabs-color-royal .tab-item.activated {
+ margin-top: -2px;
+ color: #886aea;
+ border: 0 solid #886aea;
+ border-top-width: 2px; }
+ .tabs-striped.tabs-color-royal .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-royal .tab-item.active .badge, .tabs-striped.tabs-color-royal .tab-item.activated .badge {
+ top: 2px;
+ opacity: 1; }
+
+.tabs-striped.tabs-color-dark .tab-item {
+ color: rgba(68, 68, 68, 0.4);
+ opacity: 1; }
+ .tabs-striped.tabs-color-dark .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-striped.tabs-color-dark .tab-item.tab-item-active, .tabs-striped.tabs-color-dark .tab-item.active, .tabs-striped.tabs-color-dark .tab-item.activated {
+ margin-top: -2px;
+ color: #444;
+ border: 0 solid #444;
+ border-top-width: 2px; }
+ .tabs-striped.tabs-color-dark .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-dark .tab-item.active .badge, .tabs-striped.tabs-color-dark .tab-item.activated .badge {
+ top: 2px;
+ opacity: 1; }
+
+.tabs-background-light .tabs,
+.tabs-background-light > .tabs {
+ background-color: #fff;
+ background-image: linear-gradient(0deg, #ddd, #ddd 50%, transparent 50%);
+ border-color: #ddd; }
+
+.tabs-background-stable .tabs,
+.tabs-background-stable > .tabs {
+ background-color: #f8f8f8;
+ background-image: linear-gradient(0deg, #b2b2b2, #b2b2b2 50%, transparent 50%);
+ border-color: #b2b2b2; }
+
+.tabs-background-positive .tabs,
+.tabs-background-positive > .tabs {
+ background-color: #387ef5;
+ background-image: linear-gradient(0deg, #0c60ee, #0c60ee 50%, transparent 50%);
+ border-color: #0c60ee; }
+
+.tabs-background-calm .tabs,
+.tabs-background-calm > .tabs {
+ background-color: #11c1f3;
+ background-image: linear-gradient(0deg, #0a9dc7, #0a9dc7 50%, transparent 50%);
+ border-color: #0a9dc7; }
+
+.tabs-background-assertive .tabs,
+.tabs-background-assertive > .tabs {
+ background-color: #ef473a;
+ background-image: linear-gradient(0deg, #e42112, #e42112 50%, transparent 50%);
+ border-color: #e42112; }
+
+.tabs-background-balanced .tabs,
+.tabs-background-balanced > .tabs {
+ background-color: #33cd5f;
+ background-image: linear-gradient(0deg, #28a54c, #28a54c 50%, transparent 50%);
+ border-color: #28a54c; }
+
+.tabs-background-energized .tabs,
+.tabs-background-energized > .tabs {
+ background-color: #ffc900;
+ background-image: linear-gradient(0deg, #e6b500, #e6b500 50%, transparent 50%);
+ border-color: #e6b500; }
+
+.tabs-background-royal .tabs,
+.tabs-background-royal > .tabs {
+ background-color: #886aea;
+ background-image: linear-gradient(0deg, #6b46e5, #6b46e5 50%, transparent 50%);
+ border-color: #6b46e5; }
+
+.tabs-background-dark .tabs,
+.tabs-background-dark > .tabs {
+ background-color: #444;
+ background-image: linear-gradient(0deg, #111, #111 50%, transparent 50%);
+ border-color: #111; }
+
+.tabs-color-light .tab-item {
+ color: rgba(255, 255, 255, 0.4);
+ opacity: 1; }
+ .tabs-color-light .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-color-light .tab-item.tab-item-active, .tabs-color-light .tab-item.active, .tabs-color-light .tab-item.activated {
+ color: #fff;
+ border: 0 solid #fff; }
+ .tabs-color-light .tab-item.tab-item-active .badge, .tabs-color-light .tab-item.active .badge, .tabs-color-light .tab-item.activated .badge {
+ opacity: 1; }
+
+.tabs-color-stable .tab-item {
+ color: rgba(248, 248, 248, 0.4);
+ opacity: 1; }
+ .tabs-color-stable .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-color-stable .tab-item.tab-item-active, .tabs-color-stable .tab-item.active, .tabs-color-stable .tab-item.activated {
+ color: #f8f8f8;
+ border: 0 solid #f8f8f8; }
+ .tabs-color-stable .tab-item.tab-item-active .badge, .tabs-color-stable .tab-item.active .badge, .tabs-color-stable .tab-item.activated .badge {
+ opacity: 1; }
+
+.tabs-color-positive .tab-item {
+ color: rgba(56, 126, 245, 0.4);
+ opacity: 1; }
+ .tabs-color-positive .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-color-positive .tab-item.tab-item-active, .tabs-color-positive .tab-item.active, .tabs-color-positive .tab-item.activated {
+ color: #387ef5;
+ border: 0 solid #387ef5; }
+ .tabs-color-positive .tab-item.tab-item-active .badge, .tabs-color-positive .tab-item.active .badge, .tabs-color-positive .tab-item.activated .badge {
+ opacity: 1; }
+
+.tabs-color-calm .tab-item {
+ color: rgba(17, 193, 243, 0.4);
+ opacity: 1; }
+ .tabs-color-calm .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-color-calm .tab-item.tab-item-active, .tabs-color-calm .tab-item.active, .tabs-color-calm .tab-item.activated {
+ color: #11c1f3;
+ border: 0 solid #11c1f3; }
+ .tabs-color-calm .tab-item.tab-item-active .badge, .tabs-color-calm .tab-item.active .badge, .tabs-color-calm .tab-item.activated .badge {
+ opacity: 1; }
+
+.tabs-color-assertive .tab-item {
+ color: rgba(239, 71, 58, 0.4);
+ opacity: 1; }
+ .tabs-color-assertive .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-color-assertive .tab-item.tab-item-active, .tabs-color-assertive .tab-item.active, .tabs-color-assertive .tab-item.activated {
+ color: #ef473a;
+ border: 0 solid #ef473a; }
+ .tabs-color-assertive .tab-item.tab-item-active .badge, .tabs-color-assertive .tab-item.active .badge, .tabs-color-assertive .tab-item.activated .badge {
+ opacity: 1; }
+
+.tabs-color-balanced .tab-item {
+ color: rgba(51, 205, 95, 0.4);
+ opacity: 1; }
+ .tabs-color-balanced .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-color-balanced .tab-item.tab-item-active, .tabs-color-balanced .tab-item.active, .tabs-color-balanced .tab-item.activated {
+ color: #33cd5f;
+ border: 0 solid #33cd5f; }
+ .tabs-color-balanced .tab-item.tab-item-active .badge, .tabs-color-balanced .tab-item.active .badge, .tabs-color-balanced .tab-item.activated .badge {
+ opacity: 1; }
+
+.tabs-color-energized .tab-item {
+ color: rgba(255, 201, 0, 0.4);
+ opacity: 1; }
+ .tabs-color-energized .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-color-energized .tab-item.tab-item-active, .tabs-color-energized .tab-item.active, .tabs-color-energized .tab-item.activated {
+ color: #ffc900;
+ border: 0 solid #ffc900; }
+ .tabs-color-energized .tab-item.tab-item-active .badge, .tabs-color-energized .tab-item.active .badge, .tabs-color-energized .tab-item.activated .badge {
+ opacity: 1; }
+
+.tabs-color-royal .tab-item {
+ color: rgba(136, 106, 234, 0.4);
+ opacity: 1; }
+ .tabs-color-royal .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-color-royal .tab-item.tab-item-active, .tabs-color-royal .tab-item.active, .tabs-color-royal .tab-item.activated {
+ color: #886aea;
+ border: 0 solid #886aea; }
+ .tabs-color-royal .tab-item.tab-item-active .badge, .tabs-color-royal .tab-item.active .badge, .tabs-color-royal .tab-item.activated .badge {
+ opacity: 1; }
+
+.tabs-color-dark .tab-item {
+ color: rgba(68, 68, 68, 0.4);
+ opacity: 1; }
+ .tabs-color-dark .tab-item .badge {
+ opacity: 0.4; }
+ .tabs-color-dark .tab-item.tab-item-active, .tabs-color-dark .tab-item.active, .tabs-color-dark .tab-item.activated {
+ color: #444;
+ border: 0 solid #444; }
+ .tabs-color-dark .tab-item.tab-item-active .badge, .tabs-color-dark .tab-item.active .badge, .tabs-color-dark .tab-item.activated .badge {
+ opacity: 1; }
+
+ion-tabs.tabs-color-active-light .tab-item {
+ color: #444; }
+ ion-tabs.tabs-color-active-light .tab-item.tab-item-active, ion-tabs.tabs-color-active-light .tab-item.active, ion-tabs.tabs-color-active-light .tab-item.activated {
+ color: #fff; }
+
+ion-tabs.tabs-striped.tabs-color-active-light .tab-item.tab-item-active, ion-tabs.tabs-striped.tabs-color-active-light .tab-item.active, ion-tabs.tabs-striped.tabs-color-active-light .tab-item.activated {
+ border-color: #fff;
+ color: #fff; }
+
+ion-tabs.tabs-color-active-stable .tab-item {
+ color: #444; }
+ ion-tabs.tabs-color-active-stable .tab-item.tab-item-active, ion-tabs.tabs-color-active-stable .tab-item.active, ion-tabs.tabs-color-active-stable .tab-item.activated {
+ color: #f8f8f8; }
+
+ion-tabs.tabs-striped.tabs-color-active-stable .tab-item.tab-item-active, ion-tabs.tabs-striped.tabs-color-active-stable .tab-item.active, ion-tabs.tabs-striped.tabs-color-active-stable .tab-item.activated {
+ border-color: #f8f8f8;
+ color: #f8f8f8; }
+
+ion-tabs.tabs-color-active-positive .tab-item {
+ color: #444; }
+ ion-tabs.tabs-color-active-positive .tab-item.tab-item-active, ion-tabs.tabs-color-active-positive .tab-item.active, ion-tabs.tabs-color-active-positive .tab-item.activated {
+ color: #387ef5; }
+
+ion-tabs.tabs-striped.tabs-color-active-positive .tab-item.tab-item-active, ion-tabs.tabs-striped.tabs-color-active-positive .tab-item.active, ion-tabs.tabs-striped.tabs-color-active-positive .tab-item.activated {
+ border-color: #387ef5;
+ color: #387ef5; }
+
+ion-tabs.tabs-color-active-calm .tab-item {
+ color: #444; }
+ ion-tabs.tabs-color-active-calm .tab-item.tab-item-active, ion-tabs.tabs-color-active-calm .tab-item.active, ion-tabs.tabs-color-active-calm .tab-item.activated {
+ color: #11c1f3; }
+
+ion-tabs.tabs-striped.tabs-color-active-calm .tab-item.tab-item-active, ion-tabs.tabs-striped.tabs-color-active-calm .tab-item.active, ion-tabs.tabs-striped.tabs-color-active-calm .tab-item.activated {
+ border-color: #11c1f3;
+ color: #11c1f3; }
+
+ion-tabs.tabs-color-active-assertive .tab-item {
+ color: #444; }
+ ion-tabs.tabs-color-active-assertive .tab-item.tab-item-active, ion-tabs.tabs-color-active-assertive .tab-item.active, ion-tabs.tabs-color-active-assertive .tab-item.activated {
+ color: #ef473a; }
+
+ion-tabs.tabs-striped.tabs-color-active-assertive .tab-item.tab-item-active, ion-tabs.tabs-striped.tabs-color-active-assertive .tab-item.active, ion-tabs.tabs-striped.tabs-color-active-assertive .tab-item.activated {
+ border-color: #ef473a;
+ color: #ef473a; }
+
+ion-tabs.tabs-color-active-balanced .tab-item {
+ color: #444; }
+ ion-tabs.tabs-color-active-balanced .tab-item.tab-item-active, ion-tabs.tabs-color-active-balanced .tab-item.active, ion-tabs.tabs-color-active-balanced .tab-item.activated {
+ color: #33cd5f; }
+
+ion-tabs.tabs-striped.tabs-color-active-balanced .tab-item.tab-item-active, ion-tabs.tabs-striped.tabs-color-active-balanced .tab-item.active, ion-tabs.tabs-striped.tabs-color-active-balanced .tab-item.activated {
+ border-color: #33cd5f;
+ color: #33cd5f; }
+
+ion-tabs.tabs-color-active-energized .tab-item {
+ color: #444; }
+ ion-tabs.tabs-color-active-energized .tab-item.tab-item-active, ion-tabs.tabs-color-active-energized .tab-item.active, ion-tabs.tabs-color-active-energized .tab-item.activated {
+ color: #ffc900; }
+
+ion-tabs.tabs-striped.tabs-color-active-energized .tab-item.tab-item-active, ion-tabs.tabs-striped.tabs-color-active-energized .tab-item.active, ion-tabs.tabs-striped.tabs-color-active-energized .tab-item.activated {
+ border-color: #ffc900;
+ color: #ffc900; }
+
+ion-tabs.tabs-color-active-royal .tab-item {
+ color: #444; }
+ ion-tabs.tabs-color-active-royal .tab-item.tab-item-active, ion-tabs.tabs-color-active-royal .tab-item.active, ion-tabs.tabs-color-active-royal .tab-item.activated {
+ color: #886aea; }
+
+ion-tabs.tabs-striped.tabs-color-active-royal .tab-item.tab-item-active, ion-tabs.tabs-striped.tabs-color-active-royal .tab-item.active, ion-tabs.tabs-striped.tabs-color-active-royal .tab-item.activated {
+ border-color: #886aea;
+ color: #886aea; }
+
+ion-tabs.tabs-color-active-dark .tab-item {
+ color: #fff; }
+ ion-tabs.tabs-color-active-dark .tab-item.tab-item-active, ion-tabs.tabs-color-active-dark .tab-item.active, ion-tabs.tabs-color-active-dark .tab-item.activated {
+ color: #444; }
+
+ion-tabs.tabs-striped.tabs-color-active-dark .tab-item.tab-item-active, ion-tabs.tabs-striped.tabs-color-active-dark .tab-item.active, ion-tabs.tabs-striped.tabs-color-active-dark .tab-item.activated {
+ border-color: #444;
+ color: #444; }
+
+.tabs-top.tabs-striped {
+ padding-bottom: 0; }
+ .tabs-top.tabs-striped .tab-item {
+ background: transparent;
+ -webkit-transition: color .1s ease;
+ -moz-transition: color .1s ease;
+ -ms-transition: color .1s ease;
+ -o-transition: color .1s ease;
+ transition: color .1s ease; }
+ .tabs-top.tabs-striped .tab-item.tab-item-active, .tabs-top.tabs-striped .tab-item.active, .tabs-top.tabs-striped .tab-item.activated {
+ margin-top: 1px;
+ border-width: 0px 0px 2px 0px !important;
+ border-style: solid; }
+ .tabs-top.tabs-striped .tab-item.tab-item-active > .badge, .tabs-top.tabs-striped .tab-item.tab-item-active > i, .tabs-top.tabs-striped .tab-item.active > .badge, .tabs-top.tabs-striped .tab-item.active > i, .tabs-top.tabs-striped .tab-item.activated > .badge, .tabs-top.tabs-striped .tab-item.activated > i {
+ margin-top: -1px; }
+ .tabs-top.tabs-striped .tab-item .badge {
+ -webkit-transition: color .2s ease;
+ -moz-transition: color .2s ease;
+ -ms-transition: color .2s ease;
+ -o-transition: color .2s ease;
+ transition: color .2s ease; }
+ .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.tab-item-active .tab-title, .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.tab-item-active i, .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.active .tab-title, .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.active i, .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.activated .tab-title, .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.activated i {
+ display: block;
+ margin-top: -1px; }
+ .tabs-top.tabs-striped.tabs-icon-left .tab-item {
+ margin-top: 1px; }
+ .tabs-top.tabs-striped.tabs-icon-left .tab-item.tab-item-active .tab-title, .tabs-top.tabs-striped.tabs-icon-left .tab-item.tab-item-active i, .tabs-top.tabs-striped.tabs-icon-left .tab-item.active .tab-title, .tabs-top.tabs-striped.tabs-icon-left .tab-item.active i, .tabs-top.tabs-striped.tabs-icon-left .tab-item.activated .tab-title, .tabs-top.tabs-striped.tabs-icon-left .tab-item.activated i {
+ margin-top: -0.1em; }
+
+/* Allow parent element to have tabs-top */
+/* If you change this, change platform.scss as well */
+.tabs-top > .tabs,
+.tabs.tabs-top {
+ top: 44px;
+ padding-top: 0;
+ background-position: bottom;
+ border-top-width: 0;
+ border-bottom-width: 1px; }
+ .tabs-top > .tabs .tab-item.tab-item-active .badge, .tabs-top > .tabs .tab-item.active .badge, .tabs-top > .tabs .tab-item.activated .badge,
+ .tabs.tabs-top .tab-item.tab-item-active .badge,
+ .tabs.tabs-top .tab-item.active .badge,
+ .tabs.tabs-top .tab-item.activated .badge {
+ top: 4%; }
+
+.tabs-top ~ .bar-header {
+ border-bottom-width: 0; }
+
+.tab-item {
+ -webkit-box-flex: 1;
+ -webkit-flex: 1;
+ -moz-box-flex: 1;
+ -moz-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ display: block;
+ overflow: hidden;
+ max-width: 150px;
+ height: 100%;
+ color: inherit;
+ text-align: center;
+ text-decoration: none;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ font-weight: 400;
+ font-size: 14px;
+ font-family: "-apple-system", "Helvetica Neue", "Roboto", "Segoe UI", sans-serif;
+ opacity: 0.7; }
+ .tab-item:hover {
+ cursor: pointer; }
+ .tab-item.tab-hidden {
+ display: none; }
+
+.tabs-item-hide > .tabs,
+.tabs.tabs-item-hide {
+ display: none; }
+
+.tabs-icon-top > .tabs .tab-item,
+.tabs-icon-top.tabs .tab-item,
+.tabs-icon-bottom > .tabs .tab-item,
+.tabs-icon-bottom.tabs .tab-item {
+ font-size: 10px;
+ line-height: 14px; }
+
+.tab-item .icon {
+ display: block;
+ margin: 0 auto;
+ height: 32px;
+ font-size: 32px; }
+
+.tabs-icon-left.tabs .tab-item,
+.tabs-icon-left > .tabs .tab-item,
+.tabs-icon-right.tabs .tab-item,
+.tabs-icon-right > .tabs .tab-item {
+ font-size: 10px; }
+ .tabs-icon-left.tabs .tab-item .icon, .tabs-icon-left.tabs .tab-item .tab-title,
+ .tabs-icon-left > .tabs .tab-item .icon,
+ .tabs-icon-left > .tabs .tab-item .tab-title,
+ .tabs-icon-right.tabs .tab-item .icon,
+ .tabs-icon-right.tabs .tab-item .tab-title,
+ .tabs-icon-right > .tabs .tab-item .icon,
+ .tabs-icon-right > .tabs .tab-item .tab-title {
+ display: inline-block;
+ vertical-align: top;
+ margin-top: -.1em; }
+ .tabs-icon-left.tabs .tab-item .icon:before, .tabs-icon-left.tabs .tab-item .tab-title:before,
+ .tabs-icon-left > .tabs .tab-item .icon:before,
+ .tabs-icon-left > .tabs .tab-item .tab-title:before,
+ .tabs-icon-right.tabs .tab-item .icon:before,
+ .tabs-icon-right.tabs .tab-item .tab-title:before,
+ .tabs-icon-right > .tabs .tab-item .icon:before,
+ .tabs-icon-right > .tabs .tab-item .tab-title:before {
+ font-size: 24px;
+ line-height: 49px; }
+
+.tabs-icon-left > .tabs .tab-item .icon,
+.tabs-icon-left.tabs .tab-item .icon {
+ padding-right: 3px; }
+
+.tabs-icon-right > .tabs .tab-item .icon,
+.tabs-icon-right.tabs .tab-item .icon {
+ padding-left: 3px; }
+
+.tabs-icon-only > .tabs .icon,
+.tabs-icon-only.tabs .icon {
+ line-height: inherit; }
+
+.tab-item.has-badge {
+ position: relative; }
+
+.tab-item .badge {
+ position: absolute;
+ top: 4%;
+ right: 33%;
+ right: calc(50% - 26px);
+ padding: 1px 6px;
+ height: auto;
+ font-size: 12px;
+ line-height: 16px; }
+
+/* Navigational tab */
+/* Active state for tab */
+.tab-item.tab-item-active,
+.tab-item.active,
+.tab-item.activated {
+ opacity: 1; }
+ .tab-item.tab-item-active.tab-item-light,
+ .tab-item.active.tab-item-light,
+ .tab-item.activated.tab-item-light {
+ color: #fff; }
+ .tab-item.tab-item-active.tab-item-stable,
+ .tab-item.active.tab-item-stable,
+ .tab-item.activated.tab-item-stable {
+ color: #f8f8f8; }
+ .tab-item.tab-item-active.tab-item-positive,
+ .tab-item.active.tab-item-positive,
+ .tab-item.activated.tab-item-positive {
+ color: #387ef5; }
+ .tab-item.tab-item-active.tab-item-calm,
+ .tab-item.active.tab-item-calm,
+ .tab-item.activated.tab-item-calm {
+ color: #11c1f3; }
+ .tab-item.tab-item-active.tab-item-assertive,
+ .tab-item.active.tab-item-assertive,
+ .tab-item.activated.tab-item-assertive {
+ color: #ef473a; }
+ .tab-item.tab-item-active.tab-item-balanced,
+ .tab-item.active.tab-item-balanced,
+ .tab-item.activated.tab-item-balanced {
+ color: #33cd5f; }
+ .tab-item.tab-item-active.tab-item-energized,
+ .tab-item.active.tab-item-energized,
+ .tab-item.activated.tab-item-energized {
+ color: #ffc900; }
+ .tab-item.tab-item-active.tab-item-royal,
+ .tab-item.active.tab-item-royal,
+ .tab-item.activated.tab-item-royal {
+ color: #886aea; }
+ .tab-item.tab-item-active.tab-item-dark,
+ .tab-item.active.tab-item-dark,
+ .tab-item.activated.tab-item-dark {
+ color: #444; }
+
+.item.tabs {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ padding: 0; }
+ .item.tabs .icon:before {
+ position: relative; }
+
+.tab-item.disabled,
+.tab-item[disabled] {
+ opacity: .4;
+ cursor: default;
+ pointer-events: none; }
+
+.nav-bar-tabs-top.hide ~ .view-container .tabs-top .tabs {
+ top: 0; }
+
+.pane[hide-nav-bar="true"] .has-tabs-top {
+ top: 49px; }
+
+/**
+ * Menus
+ * --------------------------------------------------
+ * Side panel structure
+ */
+.menu {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ z-index: 0;
+ overflow: hidden;
+ min-height: 100%;
+ max-height: 100%;
+ width: 275px;
+ background-color: #fff; }
+ .menu .scroll-content {
+ z-index: 10; }
+ .menu .bar-header {
+ z-index: 11; }
+
+.menu-content {
+ -webkit-transform: none;
+ transform: none;
+ box-shadow: -1px 0px 2px rgba(0, 0, 0, 0.2), 1px 0px 2px rgba(0, 0, 0, 0.2); }
+
+.menu-open .menu-content .pane,
+.menu-open .menu-content .scroll-content {
+ pointer-events: none; }
+
+.menu-open .menu-content .scroll-content .scroll {
+ pointer-events: none; }
+
+.menu-open .menu-content .scroll-content:not(.overflow-scroll) {
+ overflow: hidden; }
+
+.grade-b .menu-content,
+.grade-c .menu-content {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ right: -1px;
+ left: -1px;
+ border-right: 1px solid #ccc;
+ border-left: 1px solid #ccc;
+ box-shadow: none; }
+
+.menu-left {
+ left: 0; }
+
+.menu-right {
+ right: 0; }
+
+.aside-open.aside-resizing .menu-right {
+ display: none; }
+
+.menu-animated {
+ -webkit-transition: -webkit-transform 200ms ease;
+ transition: transform 200ms ease; }
+
+/**
+ * Modals
+ * --------------------------------------------------
+ * Modals are independent windows that slide in from off-screen.
+ */
+.modal-backdrop,
+.modal-backdrop-bg {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 10;
+ width: 100%;
+ height: 100%; }
+
+.modal-backdrop-bg {
+ pointer-events: none; }
+
+.modal {
+ display: block;
+ position: absolute;
+ top: 0;
+ z-index: 10;
+ overflow: hidden;
+ min-height: 100%;
+ width: 100%;
+ background-color: #fff; }
+
+@media (min-width: 680px) {
+ .modal {
+ top: 20%;
+ right: 20%;
+ bottom: 20%;
+ left: 20%;
+ min-height: 240px;
+ width: 60%; }
+ .modal.ng-leave-active {
+ bottom: 0; }
+ .platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader) {
+ height: 44px; }
+ .platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader) > * {
+ margin-top: 0; }
+ .platform-ios.platform-cordova .modal-wrapper .modal .tabs-top > .tabs,
+ .platform-ios.platform-cordova .modal-wrapper .modal .tabs.tabs-top {
+ top: 44px; }
+ .platform-ios.platform-cordova .modal-wrapper .modal .has-header,
+ .platform-ios.platform-cordova .modal-wrapper .modal .bar-subheader {
+ top: 44px; }
+ .platform-ios.platform-cordova .modal-wrapper .modal .has-subheader {
+ top: 88px; }
+ .platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-tabs-top {
+ top: 93px; }
+ .platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-subheader.has-tabs-top {
+ top: 137px; }
+ .modal-backdrop-bg {
+ -webkit-transition: opacity 300ms ease-in-out;
+ transition: opacity 300ms ease-in-out;
+ background-color: #000;
+ opacity: 0; }
+ .active .modal-backdrop-bg {
+ opacity: 0.5; } }
+
+.modal-open {
+ pointer-events: none; }
+ .modal-open .modal,
+ .modal-open .modal-backdrop {
+ pointer-events: auto; }
+ .modal-open.loading-active .modal,
+ .modal-open.loading-active .modal-backdrop {
+ pointer-events: none; }
+
+/**
+ * Popovers
+ * --------------------------------------------------
+ * Popovers are independent views which float over content
+ */
+.popover-backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 10;
+ width: 100%;
+ height: 100%;
+ background-color: transparent; }
+ .popover-backdrop.active {
+ background-color: rgba(0, 0, 0, 0.1); }
+
+.popover {
+ position: absolute;
+ top: 25%;
+ left: 50%;
+ z-index: 10;
+ display: block;
+ margin-top: 12px;
+ margin-left: -110px;
+ height: 280px;
+ width: 220px;
+ background-color: #fff;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
+ opacity: 0; }
+ .popover .item:first-child {
+ border-top: 0; }
+ .popover .item:last-child {
+ border-bottom: 0; }
+ .popover.popover-bottom {
+ margin-top: -12px; }
+
+.popover,
+.popover .bar-header {
+ border-radius: 2px; }
+
+.popover .scroll-content {
+ z-index: 1;
+ margin: 2px 0; }
+
+.popover .bar-header {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0; }
+
+.popover .has-header {
+ border-top-right-radius: 0;
+ border-top-left-radius: 0; }
+
+.popover-arrow {
+ display: none; }
+
+.platform-ios .popover {
+ box-shadow: 0 0 40px rgba(0, 0, 0, 0.08);
+ border-radius: 10px; }
+
+.platform-ios .popover .bar-header {
+ -webkit-border-top-right-radius: 10px;
+ border-top-right-radius: 10px;
+ -webkit-border-top-left-radius: 10px;
+ border-top-left-radius: 10px; }
+
+.platform-ios .popover .scroll-content {
+ margin: 8px 0;
+ border-radius: 10px; }
+
+.platform-ios .popover .scroll-content.has-header {
+ margin-top: 0; }
+
+.platform-ios .popover-arrow {
+ position: absolute;
+ display: block;
+ top: -17px;
+ width: 30px;
+ height: 19px;
+ overflow: hidden; }
+ .platform-ios .popover-arrow:after {
+ position: absolute;
+ top: 12px;
+ left: 5px;
+ width: 20px;
+ height: 20px;
+ background-color: #fff;
+ border-radius: 3px;
+ content: '';
+ -webkit-transform: rotate(-45deg);
+ transform: rotate(-45deg); }
+
+.platform-ios .popover-bottom .popover-arrow {
+ top: auto;
+ bottom: -10px; }
+ .platform-ios .popover-bottom .popover-arrow:after {
+ top: -6px; }
+
+.platform-android .popover {
+ margin-top: -32px;
+ background-color: #fafafa;
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.35); }
+ .platform-android .popover .item {
+ border-color: #fafafa;
+ background-color: #fafafa;
+ color: #4d4d4d; }
+ .platform-android .popover.popover-bottom {
+ margin-top: 32px; }
+
+.platform-android .popover-backdrop,
+.platform-android .popover-backdrop.active {
+ background-color: transparent; }
+
+.popover-open {
+ pointer-events: none; }
+ .popover-open .popover,
+ .popover-open .popover-backdrop {
+ pointer-events: auto; }
+ .popover-open.loading-active .popover,
+ .popover-open.loading-active .popover-backdrop {
+ pointer-events: none; }
+
+@media (min-width: 680px) {
+ .popover {
+ width: 360px;
+ margin-left: -180px; } }
+
+/**
+ * Popups
+ * --------------------------------------------------
+ */
+.popup-container {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ background: transparent;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ -webkit-justify-content: center;
+ -moz-justify-content: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ -moz-align-items: center;
+ align-items: center;
+ z-index: 12;
+ visibility: hidden; }
+ .popup-container.popup-showing {
+ visibility: visible; }
+ .popup-container.popup-hidden .popup {
+ -webkit-animation-name: scaleOut;
+ animation-name: scaleOut;
+ -webkit-animation-duration: 0.1s;
+ animation-duration: 0.1s;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both; }
+ .popup-container.active .popup {
+ -webkit-animation-name: superScaleIn;
+ animation-name: superScaleIn;
+ -webkit-animation-duration: 0.2s;
+ animation-duration: 0.2s;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both; }
+ .popup-container .popup {
+ width: 250px;
+ max-width: 100%;
+ max-height: 90%;
+ border-radius: 0px;
+ background-color: rgba(255, 255, 255, 0.9);
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-direction: normal;
+ -webkit-box-orient: vertical;
+ -webkit-flex-direction: column;
+ -moz-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column; }
+ .popup-container input,
+ .popup-container textarea {
+ width: 100%; }
+
+.popup-head {
+ padding: 15px 10px;
+ border-bottom: 1px solid #eee;
+ text-align: center; }
+
+.popup-title {
+ margin: 0;
+ padding: 0;
+ font-size: 15px; }
+
+.popup-sub-title {
+ margin: 5px 0 0 0;
+ padding: 0;
+ font-weight: normal;
+ font-size: 11px; }
+
+.popup-body {
+ padding: 10px;
+ overflow: auto; }
+
+.popup-buttons {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-direction: normal;
+ -webkit-box-orient: horizontal;
+ -webkit-flex-direction: row;
+ -moz-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ padding: 10px;
+ min-height: 65px; }
+ .popup-buttons .button {
+ -webkit-box-flex: 1;
+ -webkit-flex: 1;
+ -moz-box-flex: 1;
+ -moz-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ display: block;
+ min-height: 45px;
+ border-radius: 2px;
+ line-height: 20px;
+ margin-right: 5px; }
+ .popup-buttons .button:last-child {
+ margin-right: 0px; }
+
+.popup-open {
+ pointer-events: none; }
+ .popup-open.modal-open .modal {
+ pointer-events: none; }
+ .popup-open .popup-backdrop, .popup-open .popup {
+ pointer-events: auto; }
+
+/**
+ * Loading
+ * --------------------------------------------------
+ */
+.loading-container {
+ position: absolute;
+ left: 0;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 13;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ -webkit-justify-content: center;
+ -moz-justify-content: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ -moz-align-items: center;
+ align-items: center;
+ -webkit-transition: 0.2s opacity linear;
+ transition: 0.2s opacity linear;
+ visibility: hidden;
+ opacity: 0; }
+ .loading-container:not(.visible) .icon,
+ .loading-container:not(.visible) .spinner {
+ display: none; }
+ .loading-container.visible {
+ visibility: visible; }
+ .loading-container.active {
+ opacity: 1; }
+ .loading-container .loading {
+ padding: 20px;
+ border-radius: 5px;
+ background-color: rgba(0, 0, 0, 0.7);
+ color: #fff;
+ text-align: center;
+ text-overflow: ellipsis;
+ font-size: 15px; }
+ .loading-container .loading h1, .loading-container .loading h2, .loading-container .loading h3, .loading-container .loading h4, .loading-container .loading h5, .loading-container .loading h6 {
+ color: #fff; }
+
+/**
+ * Items
+ * --------------------------------------------------
+ */
+.item {
+ border-color: #ddd;
+ background-color: #fff;
+ color: #444;
+ position: relative;
+ z-index: 2;
+ display: block;
+ margin: -1px;
+ padding: 16px;
+ border-width: 1px;
+ border-style: solid;
+ font-size: 16px; }
+ .item h2 {
+ margin: 0 0 2px 0;
+ font-size: 16px;
+ font-weight: normal; }
+ .item h3 {
+ margin: 0 0 4px 0;
+ font-size: 14px; }
+ .item h4 {
+ margin: 0 0 4px 0;
+ font-size: 12px; }
+ .item h5, .item h6 {
+ margin: 0 0 3px 0;
+ font-size: 10px; }
+ .item p {
+ color: #666;
+ font-size: 14px;
+ margin-bottom: 2px; }
+ .item h1:last-child,
+ .item h2:last-child,
+ .item h3:last-child,
+ .item h4:last-child,
+ .item h5:last-child,
+ .item h6:last-child,
+ .item p:last-child {
+ margin-bottom: 0; }
+ .item .badge {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ position: absolute;
+ top: 16px;
+ right: 32px; }
+ .item.item-button-right .badge {
+ right: 67px; }
+ .item.item-divider .badge {
+ top: 8px; }
+ .item .badge + .badge {
+ margin-right: 5px; }
+ .item.item-light {
+ border-color: #ddd;
+ background-color: #fff;
+ color: #444; }
+ .item.item-stable {
+ border-color: #b2b2b2;
+ background-color: #f8f8f8;
+ color: #444; }
+ .item.item-positive {
+ border-color: #0c60ee;
+ background-color: #387ef5;
+ color: #fff; }
+ .item.item-calm {
+ border-color: #0a9dc7;
+ background-color: #11c1f3;
+ color: #fff; }
+ .item.item-assertive {
+ border-color: #e42112;
+ background-color: #ef473a;
+ color: #fff; }
+ .item.item-balanced {
+ border-color: #28a54c;
+ background-color: #33cd5f;
+ color: #fff; }
+ .item.item-energized {
+ border-color: #e6b500;
+ background-color: #ffc900;
+ color: #fff; }
+ .item.item-royal {
+ border-color: #6b46e5;
+ background-color: #886aea;
+ color: #fff; }
+ .item.item-dark {
+ border-color: #111;
+ background-color: #444;
+ color: #fff; }
+ .item[ng-click]:hover {
+ cursor: pointer; }
+
+.list-borderless .item,
+.item-borderless {
+ border-width: 0; }
+
+.item.active,
+.item.activated,
+.item-complex.active .item-content,
+.item-complex.activated .item-content,
+.item .item-content.active,
+.item .item-content.activated {
+ border-color: #ccc;
+ background-color: #D9D9D9; }
+ .item.active.item-complex > .item-content,
+ .item.activated.item-complex > .item-content,
+ .item-complex.active .item-content.item-complex > .item-content,
+ .item-complex.activated .item-content.item-complex > .item-content,
+ .item .item-content.active.item-complex > .item-content,
+ .item .item-content.activated.item-complex > .item-content {
+ border-color: #ccc;
+ background-color: #D9D9D9; }
+ .item.active.item-light,
+ .item.activated.item-light,
+ .item-complex.active .item-content.item-light,
+ .item-complex.activated .item-content.item-light,
+ .item .item-content.active.item-light,
+ .item .item-content.activated.item-light {
+ border-color: #ccc;
+ background-color: #fafafa; }
+ .item.active.item-light.item-complex > .item-content,
+ .item.activated.item-light.item-complex > .item-content,
+ .item-complex.active .item-content.item-light.item-complex > .item-content,
+ .item-complex.activated .item-content.item-light.item-complex > .item-content,
+ .item .item-content.active.item-light.item-complex > .item-content,
+ .item .item-content.activated.item-light.item-complex > .item-content {
+ border-color: #ccc;
+ background-color: #fafafa; }
+ .item.active.item-stable,
+ .item.activated.item-stable,
+ .item-complex.active .item-content.item-stable,
+ .item-complex.activated .item-content.item-stable,
+ .item .item-content.active.item-stable,
+ .item .item-content.activated.item-stable {
+ border-color: #a2a2a2;
+ background-color: #e5e5e5; }
+ .item.active.item-stable.item-complex > .item-content,
+ .item.activated.item-stable.item-complex > .item-content,
+ .item-complex.active .item-content.item-stable.item-complex > .item-content,
+ .item-complex.activated .item-content.item-stable.item-complex > .item-content,
+ .item .item-content.active.item-stable.item-complex > .item-content,
+ .item .item-content.activated.item-stable.item-complex > .item-content {
+ border-color: #a2a2a2;
+ background-color: #e5e5e5; }
+ .item.active.item-positive,
+ .item.activated.item-positive,
+ .item-complex.active .item-content.item-positive,
+ .item-complex.activated .item-content.item-positive,
+ .item .item-content.active.item-positive,
+ .item .item-content.activated.item-positive {
+ border-color: #0c60ee;
+ background-color: #0c60ee; }
+ .item.active.item-positive.item-complex > .item-content,
+ .item.activated.item-positive.item-complex > .item-content,
+ .item-complex.active .item-content.item-positive.item-complex > .item-content,
+ .item-complex.activated .item-content.item-positive.item-complex > .item-content,
+ .item .item-content.active.item-positive.item-complex > .item-content,
+ .item .item-content.activated.item-positive.item-complex > .item-content {
+ border-color: #0c60ee;
+ background-color: #0c60ee; }
+ .item.active.item-calm,
+ .item.activated.item-calm,
+ .item-complex.active .item-content.item-calm,
+ .item-complex.activated .item-content.item-calm,
+ .item .item-content.active.item-calm,
+ .item .item-content.activated.item-calm {
+ border-color: #0a9dc7;
+ background-color: #0a9dc7; }
+ .item.active.item-calm.item-complex > .item-content,
+ .item.activated.item-calm.item-complex > .item-content,
+ .item-complex.active .item-content.item-calm.item-complex > .item-content,
+ .item-complex.activated .item-content.item-calm.item-complex > .item-content,
+ .item .item-content.active.item-calm.item-complex > .item-content,
+ .item .item-content.activated.item-calm.item-complex > .item-content {
+ border-color: #0a9dc7;
+ background-color: #0a9dc7; }
+ .item.active.item-assertive,
+ .item.activated.item-assertive,
+ .item-complex.active .item-content.item-assertive,
+ .item-complex.activated .item-content.item-assertive,
+ .item .item-content.active.item-assertive,
+ .item .item-content.activated.item-assertive {
+ border-color: #e42112;
+ background-color: #e42112; }
+ .item.active.item-assertive.item-complex > .item-content,
+ .item.activated.item-assertive.item-complex > .item-content,
+ .item-complex.active .item-content.item-assertive.item-complex > .item-content,
+ .item-complex.activated .item-content.item-assertive.item-complex > .item-content,
+ .item .item-content.active.item-assertive.item-complex > .item-content,
+ .item .item-content.activated.item-assertive.item-complex > .item-content {
+ border-color: #e42112;
+ background-color: #e42112; }
+ .item.active.item-balanced,
+ .item.activated.item-balanced,
+ .item-complex.active .item-content.item-balanced,
+ .item-complex.activated .item-content.item-balanced,
+ .item .item-content.active.item-balanced,
+ .item .item-content.activated.item-balanced {
+ border-color: #28a54c;
+ background-color: #28a54c; }
+ .item.active.item-balanced.item-complex > .item-content,
+ .item.activated.item-balanced.item-complex > .item-content,
+ .item-complex.active .item-content.item-balanced.item-complex > .item-content,
+ .item-complex.activated .item-content.item-balanced.item-complex > .item-content,
+ .item .item-content.active.item-balanced.item-complex > .item-content,
+ .item .item-content.activated.item-balanced.item-complex > .item-content {
+ border-color: #28a54c;
+ background-color: #28a54c; }
+ .item.active.item-energized,
+ .item.activated.item-energized,
+ .item-complex.active .item-content.item-energized,
+ .item-complex.activated .item-content.item-energized,
+ .item .item-content.active.item-energized,
+ .item .item-content.activated.item-energized {
+ border-color: #e6b500;
+ background-color: #e6b500; }
+ .item.active.item-energized.item-complex > .item-content,
+ .item.activated.item-energized.item-complex > .item-content,
+ .item-complex.active .item-content.item-energized.item-complex > .item-content,
+ .item-complex.activated .item-content.item-energized.item-complex > .item-content,
+ .item .item-content.active.item-energized.item-complex > .item-content,
+ .item .item-content.activated.item-energized.item-complex > .item-content {
+ border-color: #e6b500;
+ background-color: #e6b500; }
+ .item.active.item-royal,
+ .item.activated.item-royal,
+ .item-complex.active .item-content.item-royal,
+ .item-complex.activated .item-content.item-royal,
+ .item .item-content.active.item-royal,
+ .item .item-content.activated.item-royal {
+ border-color: #6b46e5;
+ background-color: #6b46e5; }
+ .item.active.item-royal.item-complex > .item-content,
+ .item.activated.item-royal.item-complex > .item-content,
+ .item-complex.active .item-content.item-royal.item-complex > .item-content,
+ .item-complex.activated .item-content.item-royal.item-complex > .item-content,
+ .item .item-content.active.item-royal.item-complex > .item-content,
+ .item .item-content.activated.item-royal.item-complex > .item-content {
+ border-color: #6b46e5;
+ background-color: #6b46e5; }
+ .item.active.item-dark,
+ .item.activated.item-dark,
+ .item-complex.active .item-content.item-dark,
+ .item-complex.activated .item-content.item-dark,
+ .item .item-content.active.item-dark,
+ .item .item-content.activated.item-dark {
+ border-color: #000;
+ background-color: #262626; }
+ .item.active.item-dark.item-complex > .item-content,
+ .item.activated.item-dark.item-complex > .item-content,
+ .item-complex.active .item-content.item-dark.item-complex > .item-content,
+ .item-complex.activated .item-content.item-dark.item-complex > .item-content,
+ .item .item-content.active.item-dark.item-complex > .item-content,
+ .item .item-content.activated.item-dark.item-complex > .item-content {
+ border-color: #000;
+ background-color: #262626; }
+
+.item,
+.item h1,
+.item h2,
+.item h3,
+.item h4,
+.item h5,
+.item h6,
+.item p,
+.item-content,
+.item-content h1,
+.item-content h2,
+.item-content h3,
+.item-content h4,
+.item-content h5,
+.item-content h6,
+.item-content p {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap; }
+
+a.item {
+ color: inherit;
+ text-decoration: none; }
+ a.item:hover, a.item:focus {
+ text-decoration: none; }
+
+/**
+ * Complex Items
+ * --------------------------------------------------
+ * Adding .item-complex allows the .item to be slidable and
+ * have options underneath the button, but also requires an
+ * additional .item-content element inside .item.
+ * Basically .item-complex removes any default settings which
+ * .item added, so that .item-content looks them as just .item.
+ */
+.item-complex,
+a.item.item-complex,
+button.item.item-complex {
+ padding: 0; }
+
+.item-complex .item-content,
+.item-radio .item-content {
+ position: relative;
+ z-index: 2;
+ padding: 16px 49px 16px 16px;
+ border: none;
+ background-color: #fff; }
+
+a.item-content {
+ display: block;
+ color: inherit;
+ text-decoration: none; }
+
+.item-text-wrap .item,
+.item-text-wrap .item-content,
+.item-text-wrap,
+.item-text-wrap h1,
+.item-text-wrap h2,
+.item-text-wrap h3,
+.item-text-wrap h4,
+.item-text-wrap h5,
+.item-text-wrap h6,
+.item-text-wrap p,
+.item-complex.item-text-wrap .item-content,
+.item-body h1,
+.item-body h2,
+.item-body h3,
+.item-body h4,
+.item-body h5,
+.item-body h6,
+.item-body p {
+ overflow: visible;
+ white-space: normal; }
+
+.item-complex.item-text-wrap,
+.item-complex.item-text-wrap h1,
+.item-complex.item-text-wrap h2,
+.item-complex.item-text-wrap h3,
+.item-complex.item-text-wrap h4,
+.item-complex.item-text-wrap h5,
+.item-complex.item-text-wrap h6,
+.item-complex.item-text-wrap p {
+ overflow: visible;
+ white-space: normal; }
+
+.item-complex.item-light > .item-content {
+ border-color: #ddd;
+ background-color: #fff;
+ color: #444; }
+ .item-complex.item-light > .item-content.active, .item-complex.item-light > .item-content:active {
+ border-color: #ccc;
+ background-color: #fafafa; }
+ .item-complex.item-light > .item-content.active.item-complex > .item-content, .item-complex.item-light > .item-content:active.item-complex > .item-content {
+ border-color: #ccc;
+ background-color: #fafafa; }
+
+.item-complex.item-stable > .item-content {
+ border-color: #b2b2b2;
+ background-color: #f8f8f8;
+ color: #444; }
+ .item-complex.item-stable > .item-content.active, .item-complex.item-stable > .item-content:active {
+ border-color: #a2a2a2;
+ background-color: #e5e5e5; }
+ .item-complex.item-stable > .item-content.active.item-complex > .item-content, .item-complex.item-stable > .item-content:active.item-complex > .item-content {
+ border-color: #a2a2a2;
+ background-color: #e5e5e5; }
+
+.item-complex.item-positive > .item-content {
+ border-color: #0c60ee;
+ background-color: #387ef5;
+ color: #fff; }
+ .item-complex.item-positive > .item-content.active, .item-complex.item-positive > .item-content:active {
+ border-color: #0c60ee;
+ background-color: #0c60ee; }
+ .item-complex.item-positive > .item-content.active.item-complex > .item-content, .item-complex.item-positive > .item-content:active.item-complex > .item-content {
+ border-color: #0c60ee;
+ background-color: #0c60ee; }
+
+.item-complex.item-calm > .item-content {
+ border-color: #0a9dc7;
+ background-color: #11c1f3;
+ color: #fff; }
+ .item-complex.item-calm > .item-content.active, .item-complex.item-calm > .item-content:active {
+ border-color: #0a9dc7;
+ background-color: #0a9dc7; }
+ .item-complex.item-calm > .item-content.active.item-complex > .item-content, .item-complex.item-calm > .item-content:active.item-complex > .item-content {
+ border-color: #0a9dc7;
+ background-color: #0a9dc7; }
+
+.item-complex.item-assertive > .item-content {
+ border-color: #e42112;
+ background-color: #ef473a;
+ color: #fff; }
+ .item-complex.item-assertive > .item-content.active, .item-complex.item-assertive > .item-content:active {
+ border-color: #e42112;
+ background-color: #e42112; }
+ .item-complex.item-assertive > .item-content.active.item-complex > .item-content, .item-complex.item-assertive > .item-content:active.item-complex > .item-content {
+ border-color: #e42112;
+ background-color: #e42112; }
+
+.item-complex.item-balanced > .item-content {
+ border-color: #28a54c;
+ background-color: #33cd5f;
+ color: #fff; }
+ .item-complex.item-balanced > .item-content.active, .item-complex.item-balanced > .item-content:active {
+ border-color: #28a54c;
+ background-color: #28a54c; }
+ .item-complex.item-balanced > .item-content.active.item-complex > .item-content, .item-complex.item-balanced > .item-content:active.item-complex > .item-content {
+ border-color: #28a54c;
+ background-color: #28a54c; }
+
+.item-complex.item-energized > .item-content {
+ border-color: #e6b500;
+ background-color: #ffc900;
+ color: #fff; }
+ .item-complex.item-energized > .item-content.active, .item-complex.item-energized > .item-content:active {
+ border-color: #e6b500;
+ background-color: #e6b500; }
+ .item-complex.item-energized > .item-content.active.item-complex > .item-content, .item-complex.item-energized > .item-content:active.item-complex > .item-content {
+ border-color: #e6b500;
+ background-color: #e6b500; }
+
+.item-complex.item-royal > .item-content {
+ border-color: #6b46e5;
+ background-color: #886aea;
+ color: #fff; }
+ .item-complex.item-royal > .item-content.active, .item-complex.item-royal > .item-content:active {
+ border-color: #6b46e5;
+ background-color: #6b46e5; }
+ .item-complex.item-royal > .item-content.active.item-complex > .item-content, .item-complex.item-royal > .item-content:active.item-complex > .item-content {
+ border-color: #6b46e5;
+ background-color: #6b46e5; }
+
+.item-complex.item-dark > .item-content {
+ border-color: #111;
+ background-color: #444;
+ color: #fff; }
+ .item-complex.item-dark > .item-content.active, .item-complex.item-dark > .item-content:active {
+ border-color: #000;
+ background-color: #262626; }
+ .item-complex.item-dark > .item-content.active.item-complex > .item-content, .item-complex.item-dark > .item-content:active.item-complex > .item-content {
+ border-color: #000;
+ background-color: #262626; }
+
+/**
+ * Item Icons
+ * --------------------------------------------------
+ */
+.item-icon-left .icon,
+.item-icon-right .icon {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ -moz-align-items: center;
+ align-items: center;
+ position: absolute;
+ top: 0;
+ height: 100%;
+ font-size: 32px; }
+ .item-icon-left .icon:before,
+ .item-icon-right .icon:before {
+ display: block;
+ width: 32px;
+ text-align: center; }
+
+.item .fill-icon {
+ min-width: 30px;
+ min-height: 30px;
+ font-size: 28px; }
+
+.item-icon-left {
+ padding-left: 54px; }
+ .item-icon-left .icon {
+ left: 11px; }
+
+.item-complex.item-icon-left {
+ padding-left: 0; }
+ .item-complex.item-icon-left .item-content {
+ padding-left: 54px; }
+
+.item-icon-right {
+ padding-right: 54px; }
+ .item-icon-right .icon {
+ right: 11px; }
+
+.item-complex.item-icon-right {
+ padding-right: 0; }
+ .item-complex.item-icon-right .item-content {
+ padding-right: 54px; }
+
+.item-icon-left.item-icon-right .icon:first-child {
+ right: auto; }
+
+.item-icon-left.item-icon-right .icon:last-child,
+.item-icon-left .item-delete .icon {
+ left: auto; }
+
+.item-icon-left .icon-accessory,
+.item-icon-right .icon-accessory {
+ color: #ccc;
+ font-size: 16px; }
+
+.item-icon-left .icon-accessory {
+ left: 3px; }
+
+.item-icon-right .icon-accessory {
+ right: 3px; }
+
+/**
+ * Item Button
+ * --------------------------------------------------
+ * An item button is a child button inside an .item (not the entire .item)
+ */
+.item-button-left {
+ padding-left: 72px; }
+
+.item-button-left > .button,
+.item-button-left .item-content > .button {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ -moz-align-items: center;
+ align-items: center;
+ position: absolute;
+ top: 8px;
+ left: 11px;
+ min-width: 34px;
+ min-height: 34px;
+ font-size: 18px;
+ line-height: 32px; }
+ .item-button-left > .button .icon:before,
+ .item-button-left .item-content > .button .icon:before {
+ position: relative;
+ left: auto;
+ width: auto;
+ line-height: 31px; }
+ .item-button-left > .button > .button,
+ .item-button-left .item-content > .button > .button {
+ margin: 0px 2px;
+ min-height: 34px;
+ font-size: 18px;
+ line-height: 32px; }
+
+.item-button-right,
+a.item.item-button-right,
+button.item.item-button-right {
+ padding-right: 80px; }
+
+.item-button-right > .button,
+.item-button-right .item-content > .button,
+.item-button-right > .buttons,
+.item-button-right .item-content > .buttons {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ -moz-align-items: center;
+ align-items: center;
+ position: absolute;
+ top: 8px;
+ right: 16px;
+ min-width: 34px;
+ min-height: 34px;
+ font-size: 18px;
+ line-height: 32px; }
+ .item-button-right > .button .icon:before,
+ .item-button-right .item-content > .button .icon:before,
+ .item-button-right > .buttons .icon:before,
+ .item-button-right .item-content > .buttons .icon:before {
+ position: relative;
+ left: auto;
+ width: auto;
+ line-height: 31px; }
+ .item-button-right > .button > .button,
+ .item-button-right .item-content > .button > .button,
+ .item-button-right > .buttons > .button,
+ .item-button-right .item-content > .buttons > .button {
+ margin: 0px 2px;
+ min-width: 34px;
+ min-height: 34px;
+ font-size: 18px;
+ line-height: 32px; }
+
+.item-button-left.item-button-right .button:first-child {
+ right: auto; }
+
+.item-button-left.item-button-right .button:last-child {
+ left: auto; }
+
+.item-avatar,
+.item-avatar .item-content,
+.item-avatar-left,
+.item-avatar-left .item-content {
+ padding-left: 72px;
+ min-height: 72px; }
+ .item-avatar > img:first-child,
+ .item-avatar .item-image,
+ .item-avatar .item-content > img:first-child,
+ .item-avatar .item-content .item-image,
+ .item-avatar-left > img:first-child,
+ .item-avatar-left .item-image,
+ .item-avatar-left .item-content > img:first-child,
+ .item-avatar-left .item-content .item-image {
+ position: absolute;
+ top: 16px;
+ left: 16px;
+ max-width: 40px;
+ max-height: 40px;
+ width: 100%;
+ height: 100%;
+ border-radius: 50%; }
+
+.item-avatar-right,
+.item-avatar-right .item-content {
+ padding-right: 72px;
+ min-height: 72px; }
+ .item-avatar-right > img:first-child,
+ .item-avatar-right .item-image,
+ .item-avatar-right .item-content > img:first-child,
+ .item-avatar-right .item-content .item-image {
+ position: absolute;
+ top: 16px;
+ right: 16px;
+ max-width: 40px;
+ max-height: 40px;
+ width: 100%;
+ height: 100%;
+ border-radius: 50%; }
+
+.item-thumbnail-left,
+.item-thumbnail-left .item-content {
+ padding-top: 8px;
+ padding-left: 106px;
+ min-height: 100px; }
+ .item-thumbnail-left > img:first-child,
+ .item-thumbnail-left .item-image,
+ .item-thumbnail-left .item-content > img:first-child,
+ .item-thumbnail-left .item-content .item-image {
+ position: absolute;
+ top: 10px;
+ left: 10px;
+ max-width: 80px;
+ max-height: 80px;
+ width: 100%;
+ height: 100%; }
+
+.item-avatar.item-complex,
+.item-avatar-left.item-complex,
+.item-thumbnail-left.item-complex {
+ padding-top: 0;
+ padding-left: 0; }
+
+.item-thumbnail-right,
+.item-thumbnail-right .item-content {
+ padding-top: 8px;
+ padding-right: 106px;
+ min-height: 100px; }
+ .item-thumbnail-right > img:first-child,
+ .item-thumbnail-right .item-image,
+ .item-thumbnail-right .item-content > img:first-child,
+ .item-thumbnail-right .item-content .item-image {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+ max-width: 80px;
+ max-height: 80px;
+ width: 100%;
+ height: 100%; }
+
+.item-avatar-right.item-complex,
+.item-thumbnail-right.item-complex {
+ padding-top: 0;
+ padding-right: 0; }
+
+.item-image {
+ padding: 0;
+ text-align: center; }
+ .item-image img:first-child, .item-image .list-img {
+ width: 100%;
+ vertical-align: middle; }
+
+.item-body {
+ overflow: auto;
+ padding: 16px;
+ text-overflow: inherit;
+ white-space: normal; }
+ .item-body h1, .item-body h2, .item-body h3, .item-body h4, .item-body h5, .item-body h6, .item-body p {
+ margin-top: 16px;
+ margin-bottom: 16px; }
+
+.item-divider {
+ padding-top: 8px;
+ padding-bottom: 8px;
+ min-height: 30px;
+ background-color: #f5f5f5;
+ color: #222;
+ font-weight: 500; }
+
+.platform-ios .item-divider-platform,
+.item-divider-ios {
+ padding-top: 26px;
+ text-transform: uppercase;
+ font-weight: 300;
+ font-size: 13px;
+ background-color: #efeff4;
+ color: #555; }
+
+.platform-android .item-divider-platform,
+.item-divider-android {
+ font-weight: 300;
+ font-size: 13px; }
+
+.item-note {
+ float: right;
+ color: #aaa;
+ font-size: 14px; }
+
+.item-left-editable .item-content,
+.item-right-editable .item-content {
+ -webkit-transition-duration: 250ms;
+ transition-duration: 250ms;
+ -webkit-transition-timing-function: ease-in-out;
+ transition-timing-function: ease-in-out;
+ -webkit-transition-property: -webkit-transform;
+ -moz-transition-property: -moz-transform;
+ transition-property: transform; }
+
+.list-left-editing .item-left-editable .item-content,
+.item-left-editing.item-left-editable .item-content {
+ -webkit-transform: translate3d(50px, 0, 0);
+ transform: translate3d(50px, 0, 0); }
+
+.item-remove-animate.ng-leave {
+ -webkit-transition-duration: 300ms;
+ transition-duration: 300ms; }
+
+.item-remove-animate.ng-leave .item-content, .item-remove-animate.ng-leave:last-of-type {
+ -webkit-transition-duration: 300ms;
+ transition-duration: 300ms;
+ -webkit-transition-timing-function: ease-in;
+ transition-timing-function: ease-in;
+ -webkit-transition-property: all;
+ transition-property: all; }
+
+.item-remove-animate.ng-leave.ng-leave-active .item-content {
+ opacity: 0;
+ -webkit-transform: translate3d(-100%, 0, 0) !important;
+ transform: translate3d(-100%, 0, 0) !important; }
+
+.item-remove-animate.ng-leave.ng-leave-active:last-of-type {
+ opacity: 0; }
+
+.item-remove-animate.ng-leave.ng-leave-active ~ ion-item:not(.ng-leave) {
+ -webkit-transform: translate3d(0, -webkit-calc(-100% + 1px), 0);
+ transform: translate3d(0, calc(-100% + 1px), 0);
+ -webkit-transition-duration: 300ms;
+ transition-duration: 300ms;
+ -webkit-transition-timing-function: cubic-bezier(0.25, 0.81, 0.24, 1);
+ transition-timing-function: cubic-bezier(0.25, 0.81, 0.24, 1);
+ -webkit-transition-property: all;
+ transition-property: all; }
+
+.item-left-edit {
+ -webkit-transition: all ease-in-out 125ms;
+ transition: all ease-in-out 125ms;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 0;
+ width: 50px;
+ height: 100%;
+ line-height: 100%;
+ display: none;
+ opacity: 0;
+ -webkit-transform: translate3d(-21px, 0, 0);
+ transform: translate3d(-21px, 0, 0); }
+ .item-left-edit .button {
+ height: 100%; }
+ .item-left-edit .button.icon {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ -moz-align-items: center;
+ align-items: center;
+ position: absolute;
+ top: 0;
+ height: 100%; }
+ .item-left-edit.visible {
+ display: block; }
+ .item-left-edit.visible.active {
+ opacity: 1;
+ -webkit-transform: translate3d(8px, 0, 0);
+ transform: translate3d(8px, 0, 0); }
+
+.list-left-editing .item-left-edit {
+ -webkit-transition-delay: 125ms;
+ transition-delay: 125ms; }
+
+.item-delete .button.icon {
+ color: #ef473a;
+ font-size: 24px; }
+ .item-delete .button.icon:hover {
+ opacity: .7; }
+
+.item-right-edit {
+ -webkit-transition: all ease-in-out 250ms;
+ transition: all ease-in-out 250ms;
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 3;
+ width: 75px;
+ height: 100%;
+ background: inherit;
+ padding-left: 20px;
+ display: block;
+ opacity: 0;
+ -webkit-transform: translate3d(75px, 0, 0);
+ transform: translate3d(75px, 0, 0); }
+ .item-right-edit .button {
+ min-width: 50px;
+ height: 100%; }
+ .item-right-edit .button.icon {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ -moz-align-items: center;
+ align-items: center;
+ position: absolute;
+ top: 0;
+ height: 100%;
+ font-size: 32px; }
+ .item-right-edit.visible {
+ display: block; }
+ .item-right-edit.visible.active {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0); }
+
+.item-reorder .button.icon {
+ color: #444;
+ font-size: 32px; }
+
+.item-reordering {
+ position: absolute;
+ left: 0;
+ top: 0;
+ z-index: 9;
+ width: 100%;
+ box-shadow: 0px 0px 10px 0px #aaa; }
+ .item-reordering .item-reorder {
+ z-index: 9; }
+
+.item-placeholder {
+ opacity: 0.7; }
+
+/**
+ * The hidden right-side buttons that can be exposed under a list item
+ * with dragging.
+ */
+.item-options {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 1;
+ height: 100%; }
+ .item-options .button {
+ height: 100%;
+ border: none;
+ border-radius: 0;
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -moz-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ -moz-align-items: center;
+ align-items: center; }
+ .item-options .button:before {
+ margin: 0 auto; }
+
+/**
+ * Lists
+ * --------------------------------------------------
+ */
+.list {
+ position: relative;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 0;
+ margin-bottom: 20px; }
+
+.list:last-child {
+ margin-bottom: 0px; }
+ .list:last-child.card {
+ margin-bottom: 40px; }
+
+/**
+ * List Header
+ * --------------------------------------------------
+ */
+.list-header {
+ margin-top: 20px;
+ padding: 5px 15px;
+ background-color: transparent;
+ color: #222;
+ font-weight: bold; }
+
+.card.list .list-item {
+ padding-right: 1px;
+ padding-left: 1px; }
+
+/**
+ * Cards and Inset Lists
+ * --------------------------------------------------
+ * A card and list-inset are close to the same thing, except a card as a box shadow.
+ */
+.card,
+.list-inset {
+ overflow: hidden;
+ margin: 20px 10px;
+ border-radius: 2px;
+ background-color: #fff; }
+
+.card {
+ padding-top: 1px;
+ padding-bottom: 1px;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); }
+ .card .item {
+ border-left: 0;
+ border-right: 0; }
+ .card .item:first-child {
+ border-top: 0; }
+ .card .item:last-child {
+ border-bottom: 0; }
+
+.padding .card, .padding .list-inset {
+ margin-left: 0;
+ margin-right: 0; }
+
+.card .item:first-child,
+.list-inset .item:first-child,
+.padding > .list .item:first-child {
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px; }
+ .card .item:first-child .item-content,
+ .list-inset .item:first-child .item-content,
+ .padding > .list .item:first-child .item-content {
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px; }
+
+.card .item:last-child,
+.list-inset .item:last-child,
+.padding > .list .item:last-child {
+ border-bottom-right-radius: 2px;
+ border-bottom-left-radius: 2px; }
+ .card .item:last-child .item-content,
+ .list-inset .item:last-child .item-content,
+ .padding > .list .item:last-child .item-content {
+ border-bottom-right-radius: 2px;
+ border-bottom-left-radius: 2px; }
+
+.card .item:last-child,
+.list-inset .item:last-child {
+ margin-bottom: -1px; }
+
+.card .item,
+.list-inset .item,
+.padding > .list .item,
+.padding-horizontal > .list .item {
+ margin-right: 0;
+ margin-left: 0; }
+ .card .item.item-input input,
+ .list-inset .item.item-input input,
+ .padding > .list .item.item-input input,
+ .padding-horizontal > .list .item.item-input input {
+ padding-right: 44px; }
+
+.padding-left > .list .item {
+ margin-left: 0; }
+
+.padding-right > .list .item {
+ margin-right: 0; }
+
+/**
+ * Badges
+ * --------------------------------------------------
+ */
+.badge {
+ background-color: transparent;
+ color: #AAAAAA;
+ z-index: 1;
+ display: inline-block;
+ padding: 3px 8px;
+ min-width: 10px;
+ border-radius: 10px;
+ vertical-align: baseline;
+ text-align: center;
+ white-space: nowrap;
+ font-weight: bold;
+ font-size: 14px;
+ line-height: 16px; }
+ .badge:empty {
+ display: none; }
+
+.tabs .tab-item .badge.badge-light,
+.badge.badge-light {
+ background-color: #fff;
+ color: #444; }
+
+.tabs .tab-item .badge.badge-stable,
+.badge.badge-stable {
+ background-color: #f8f8f8;
+ color: #444; }
+
+.tabs .tab-item .badge.badge-positive,
+.badge.badge-positive {
+ background-color: #387ef5;
+ color: #fff; }
+
+.tabs .tab-item .badge.badge-calm,
+.badge.badge-calm {
+ background-color: #11c1f3;
+ color: #fff; }
+
+.tabs .tab-item .badge.badge-assertive,
+.badge.badge-assertive {
+ background-color: #ef473a;
+ color: #fff; }
+
+.tabs .tab-item .badge.badge-balanced,
+.badge.badge-balanced {
+ background-color: #33cd5f;
+ color: #fff; }
+
+.tabs .tab-item .badge.badge-energized,
+.badge.badge-energized {
+ background-color: #ffc900;
+ color: #fff; }
+
+.tabs .tab-item .badge.badge-royal,
+.badge.badge-royal {
+ background-color: #886aea;
+ color: #fff; }
+
+.tabs .tab-item .badge.badge-dark,
+.badge.badge-dark {
+ background-color: #444;
+ color: #fff; }
+
+.button .badge {
+ position: relative;
+ top: -1px; }
+
+/**
+ * Slide Box
+ * --------------------------------------------------
+ */
+.slider {
+ position: relative;
+ visibility: hidden;
+ overflow: hidden; }
+
+.slider-slides {
+ position: relative;
+ height: 100%; }
+
+.slider-slide {
+ position: relative;
+ display: block;
+ float: left;
+ width: 100%;
+ height: 100%;
+ vertical-align: top; }
+
+.slider-slide-image > img {
+ width: 100%; }
+
+.slider-pager {
+ position: absolute;
+ bottom: 20px;
+ z-index: 1;
+ width: 100%;
+ height: 15px;
+ text-align: center; }
+ .slider-pager .slider-pager-page {
+ display: inline-block;
+ margin: 0px 3px;
+ width: 15px;
+ color: #000;
+ text-decoration: none;
+ opacity: 0.3; }
+ .slider-pager .slider-pager-page.active {
+ -webkit-transition: opacity 0.4s ease-in;
+ transition: opacity 0.4s ease-in;
+ opacity: 1; }
+
+.slider-slide.ng-enter, .slider-slide.ng-leave, .slider-slide.ng-animate,
+.slider-pager-page.ng-enter,
+.slider-pager-page.ng-leave,
+.slider-pager-page.ng-animate {
+ -webkit-transition: none !important;
+ transition: none !important; }
+
+.slider-slide.ng-animate,
+.slider-pager-page.ng-animate {
+ -webkit-animation: none 0s;
+ animation: none 0s; }
+
+/**
+ * Swiper 3.2.7
+ * Most modern mobile touch slider and framework with hardware accelerated transitions
+ *
+ * http://www.idangero.us/swiper/
+ *
+ * Copyright 2015, Vladimir Kharlampidi
+ * The iDangero.us
+ * http://www.idangero.us/
+ *
+ * Licensed under MIT
+ *
+ * Released on: December 7, 2015
+ */
+.swiper-container {
+ margin: 0 auto;
+ position: relative;
+ overflow: hidden;
+ /* Fix of Webkit flickering */
+ z-index: 1; }
+
+.swiper-container-no-flexbox .swiper-slide {
+ float: left; }
+
+.swiper-container-vertical > .swiper-wrapper {
+ -webkit-box-orient: vertical;
+ -moz-box-orient: vertical;
+ -ms-flex-direction: column;
+ -webkit-flex-direction: column;
+ flex-direction: column; }
+
+.swiper-wrapper {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ z-index: 1;
+ display: -webkit-box;
+ display: -moz-box;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-transition-property: -webkit-transform;
+ -moz-transition-property: -moz-transform;
+ -o-transition-property: -o-transform;
+ -ms-transition-property: -ms-transform;
+ transition-property: transform;
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box; }
+
+.swiper-container-android .swiper-slide,
+.swiper-wrapper {
+ -webkit-transform: translate3d(0px, 0, 0);
+ -moz-transform: translate3d(0px, 0, 0);
+ -o-transform: translate(0px, 0px);
+ -ms-transform: translate3d(0px, 0, 0);
+ transform: translate3d(0px, 0, 0); }
+
+.swiper-container-multirow > .swiper-wrapper {
+ -webkit-box-lines: multiple;
+ -moz-box-lines: multiple;
+ -ms-flex-wrap: wrap;
+ -webkit-flex-wrap: wrap;
+ flex-wrap: wrap; }
+
+.swiper-container-free-mode > .swiper-wrapper {
+ -webkit-transition-timing-function: ease-out;
+ -moz-transition-timing-function: ease-out;
+ -ms-transition-timing-function: ease-out;
+ -o-transition-timing-function: ease-out;
+ transition-timing-function: ease-out;
+ margin: 0 auto; }
+
+.swiper-slide {
+ display: block;
+ -webkit-flex-shrink: 0;
+ -ms-flex: 0 0 auto;
+ flex-shrink: 0;
+ width: 100%;
+ height: 100%;
+ position: relative; }
+
+/* Auto Height */
+.swiper-container-autoheight,
+.swiper-container-autoheight .swiper-slide {
+ height: auto; }
+
+.swiper-container-autoheight .swiper-wrapper {
+ -webkit-box-align: start;
+ -ms-flex-align: start;
+ -webkit-align-items: flex-start;
+ align-items: flex-start;
+ -webkit-transition-property: -webkit-transform, height;
+ -moz-transition-property: -moz-transform;
+ -o-transition-property: -o-transform;
+ -ms-transition-property: -ms-transform;
+ transition-property: transform, height; }
+
+/* a11y */
+.swiper-container .swiper-notification {
+ position: absolute;
+ left: 0;
+ top: 0;
+ pointer-events: none;
+ opacity: 0;
+ z-index: -1000; }
+
+/* IE10 Windows Phone 8 Fixes */
+.swiper-wp8-horizontal {
+ -ms-touch-action: pan-y;
+ touch-action: pan-y; }
+
+.swiper-wp8-vertical {
+ -ms-touch-action: pan-x;
+ touch-action: pan-x; }
+
+/* Arrows */
+.swiper-button-prev,
+.swiper-button-next {
+ position: absolute;
+ top: 50%;
+ width: 27px;
+ height: 44px;
+ margin-top: -22px;
+ z-index: 10;
+ cursor: pointer;
+ -moz-background-size: 27px 44px;
+ -webkit-background-size: 27px 44px;
+ background-size: 27px 44px;
+ background-position: center;
+ background-repeat: no-repeat; }
+
+.swiper-button-prev.swiper-button-disabled,
+.swiper-button-next.swiper-button-disabled {
+ opacity: 0.35;
+ cursor: auto;
+ pointer-events: none; }
+
+.swiper-button-prev,
+.swiper-container-rtl .swiper-button-next {
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");
+ left: 10px;
+ right: auto; }
+
+.swiper-button-prev.swiper-button-black,
+.swiper-container-rtl .swiper-button-next.swiper-button-black {
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E"); }
+
+.swiper-button-prev.swiper-button-white,
+.swiper-container-rtl .swiper-button-next.swiper-button-white {
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E"); }
+
+.swiper-button-next,
+.swiper-container-rtl .swiper-button-prev {
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");
+ right: 10px;
+ left: auto; }
+
+.swiper-button-next.swiper-button-black,
+.swiper-container-rtl .swiper-button-prev.swiper-button-black {
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E"); }
+
+.swiper-button-next.swiper-button-white,
+.swiper-container-rtl .swiper-button-prev.swiper-button-white {
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E"); }
+
+/* Pagination Styles */
+.swiper-pagination {
+ position: absolute;
+ text-align: center;
+ -webkit-transition: 300ms;
+ -moz-transition: 300ms;
+ -o-transition: 300ms;
+ transition: 300ms;
+ -webkit-transform: translate3d(0, 0, 0);
+ -ms-transform: translate3d(0, 0, 0);
+ -o-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ z-index: 10; }
+
+.swiper-pagination.swiper-pagination-hidden {
+ opacity: 0; }
+
+.swiper-pagination-bullet {
+ width: 8px;
+ height: 8px;
+ display: inline-block;
+ border-radius: 100%;
+ background: #000;
+ opacity: 0.2; }
+
+button.swiper-pagination-bullet {
+ border: none;
+ margin: 0;
+ padding: 0;
+ box-shadow: none;
+ -moz-appearance: none;
+ -ms-appearance: none;
+ -webkit-appearance: none;
+ appearance: none; }
+
+.swiper-pagination-clickable .swiper-pagination-bullet {
+ cursor: pointer; }
+
+.swiper-pagination-white .swiper-pagination-bullet {
+ background: #fff; }
+
+.swiper-pagination-bullet-active {
+ opacity: 1; }
+
+.swiper-pagination-white .swiper-pagination-bullet-active {
+ background: #fff; }
+
+.swiper-pagination-black .swiper-pagination-bullet-active {
+ background: #000; }
+
+.swiper-container-vertical > .swiper-pagination {
+ right: 10px;
+ top: 50%;
+ -webkit-transform: translate3d(0px, -50%, 0);
+ -moz-transform: translate3d(0px, -50%, 0);
+ -o-transform: translate(0px, -50%);
+ -ms-transform: translate3d(0px, -50%, 0);
+ transform: translate3d(0px, -50%, 0); }
+
+.swiper-container-vertical > .swiper-pagination .swiper-pagination-bullet {
+ margin: 5px 0;
+ display: block; }
+
+.swiper-container-horizontal > .swiper-pagination {
+ bottom: 10px;
+ left: 0;
+ width: 100%; }
+
+.swiper-container-horizontal > .swiper-pagination .swiper-pagination-bullet {
+ margin: 0 5px; }
+
+/* 3D Container */
+.swiper-container-3d {
+ -webkit-perspective: 1200px;
+ -moz-perspective: 1200px;
+ -o-perspective: 1200px;
+ perspective: 1200px; }
+
+.swiper-container-3d .swiper-wrapper,
+.swiper-container-3d .swiper-slide,
+.swiper-container-3d .swiper-slide-shadow-left,
+.swiper-container-3d .swiper-slide-shadow-right,
+.swiper-container-3d .swiper-slide-shadow-top,
+.swiper-container-3d .swiper-slide-shadow-bottom,
+.swiper-container-3d .swiper-cube-shadow {
+ -webkit-transform-style: preserve-3d;
+ -moz-transform-style: preserve-3d;
+ -ms-transform-style: preserve-3d;
+ transform-style: preserve-3d; }
+
+.swiper-container-3d .swiper-slide-shadow-left,
+.swiper-container-3d .swiper-slide-shadow-right,
+.swiper-container-3d .swiper-slide-shadow-top,
+.swiper-container-3d .swiper-slide-shadow-bottom {
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+ z-index: 10; }
+
+.swiper-container-3d .swiper-slide-shadow-left {
+ background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(transparent));
+ /* Safari 4+, Chrome */
+ background-image: -webkit-linear-gradient(right, rgba(0, 0, 0, 0.5), transparent);
+ /* Chrome 10+, Safari 5.1+, iOS 5+ */
+ background-image: -moz-linear-gradient(right, rgba(0, 0, 0, 0.5), transparent);
+ /* Firefox 3.6-15 */
+ background-image: -o-linear-gradient(right, rgba(0, 0, 0, 0.5), transparent);
+ /* Opera 11.10-12.00 */
+ background-image: linear-gradient(to left, rgba(0, 0, 0, 0.5), transparent);
+ /* Firefox 16+, IE10, Opera 12.50+ */ }
+
+.swiper-container-3d .swiper-slide-shadow-right {
+ background-image: -webkit-gradient(linear, right top, left top, from(rgba(0, 0, 0, 0.5)), to(transparent));
+ /* Safari 4+, Chrome */
+ background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5), transparent);
+ /* Chrome 10+, Safari 5.1+, iOS 5+ */
+ background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5), transparent);
+ /* Firefox 3.6-15 */
+ background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5), transparent);
+ /* Opera 11.10-12.00 */
+ background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5), transparent);
+ /* Firefox 16+, IE10, Opera 12.50+ */ }
+
+.swiper-container-3d .swiper-slide-shadow-top {
+ background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.5)), to(transparent));
+ /* Safari 4+, Chrome */
+ background-image: -webkit-linear-gradient(bottom, rgba(0, 0, 0, 0.5), transparent);
+ /* Chrome 10+, Safari 5.1+, iOS 5+ */
+ background-image: -moz-linear-gradient(bottom, rgba(0, 0, 0, 0.5), transparent);
+ /* Firefox 3.6-15 */
+ background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.5), transparent);
+ /* Opera 11.10-12.00 */
+ background-image: linear-gradient(to top, rgba(0, 0, 0, 0.5), transparent);
+ /* Firefox 16+, IE10, Opera 12.50+ */ }
+
+.swiper-container-3d .swiper-slide-shadow-bottom {
+ background-image: -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, 0.5)), to(transparent));
+ /* Safari 4+, Chrome */
+ background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.5), transparent);
+ /* Chrome 10+, Safari 5.1+, iOS 5+ */
+ background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.5), transparent);
+ /* Firefox 3.6-15 */
+ background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.5), transparent);
+ /* Opera 11.10-12.00 */
+ background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), transparent);
+ /* Firefox 16+, IE10, Opera 12.50+ */ }
+
+/* Coverflow */
+.swiper-container-coverflow .swiper-wrapper {
+ /* Windows 8 IE 10 fix */
+ -ms-perspective: 1200px; }
+
+/* Fade */
+.swiper-container-fade.swiper-container-free-mode .swiper-slide {
+ -webkit-transition-timing-function: ease-out;
+ -moz-transition-timing-function: ease-out;
+ -ms-transition-timing-function: ease-out;
+ -o-transition-timing-function: ease-out;
+ transition-timing-function: ease-out; }
+
+.swiper-container-fade .swiper-slide {
+ pointer-events: none; }
+
+.swiper-container-fade .swiper-slide .swiper-slide {
+ pointer-events: none; }
+
+.swiper-container-fade .swiper-slide-active,
+.swiper-container-fade .swiper-slide-active .swiper-slide-active {
+ pointer-events: auto; }
+
+/* Cube */
+.swiper-container-cube {
+ overflow: visible; }
+
+.swiper-container-cube .swiper-slide {
+ pointer-events: none;
+ visibility: hidden;
+ -webkit-transform-origin: 0 0;
+ -moz-transform-origin: 0 0;
+ -ms-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-backface-visibility: hidden;
+ -moz-backface-visibility: hidden;
+ -ms-backface-visibility: hidden;
+ backface-visibility: hidden;
+ width: 100%;
+ height: 100%;
+ z-index: 1; }
+
+.swiper-container-cube.swiper-container-rtl .swiper-slide {
+ -webkit-transform-origin: 100% 0;
+ -moz-transform-origin: 100% 0;
+ -ms-transform-origin: 100% 0;
+ transform-origin: 100% 0; }
+
+.swiper-container-cube .swiper-slide-active,
+.swiper-container-cube .swiper-slide-next,
+.swiper-container-cube .swiper-slide-prev,
+.swiper-container-cube .swiper-slide-next + .swiper-slide {
+ pointer-events: auto;
+ visibility: visible; }
+
+.swiper-container-cube .swiper-slide-shadow-top,
+.swiper-container-cube .swiper-slide-shadow-bottom,
+.swiper-container-cube .swiper-slide-shadow-left,
+.swiper-container-cube .swiper-slide-shadow-right {
+ z-index: 0;
+ -webkit-backface-visibility: hidden;
+ -moz-backface-visibility: hidden;
+ -ms-backface-visibility: hidden;
+ backface-visibility: hidden; }
+
+.swiper-container-cube .swiper-cube-shadow {
+ position: absolute;
+ left: 0;
+ bottom: 0px;
+ width: 100%;
+ height: 100%;
+ background: #000;
+ opacity: 0.6;
+ -webkit-filter: blur(50px);
+ filter: blur(50px);
+ z-index: 0; }
+
+/* Scrollbar */
+.swiper-scrollbar {
+ border-radius: 10px;
+ position: relative;
+ -ms-touch-action: none;
+ background: rgba(0, 0, 0, 0.1); }
+
+.swiper-container-horizontal > .swiper-scrollbar {
+ position: absolute;
+ left: 1%;
+ bottom: 3px;
+ z-index: 50;
+ height: 5px;
+ width: 98%; }
+
+.swiper-container-vertical > .swiper-scrollbar {
+ position: absolute;
+ right: 3px;
+ top: 1%;
+ z-index: 50;
+ width: 5px;
+ height: 98%; }
+
+.swiper-scrollbar-drag {
+ height: 100%;
+ width: 100%;
+ position: relative;
+ background: rgba(0, 0, 0, 0.5);
+ border-radius: 10px;
+ left: 0;
+ top: 0; }
+
+.swiper-scrollbar-cursor-drag {
+ cursor: move; }
+
+/* Preloader */
+.swiper-lazy-preloader {
+ width: 42px;
+ height: 42px;
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ margin-left: -21px;
+ margin-top: -21px;
+ z-index: 10;
+ -webkit-transform-origin: 50%;
+ -moz-transform-origin: 50%;
+ transform-origin: 50%;
+ -webkit-animation: swiper-preloader-spin 1s steps(12, end) infinite;
+ -moz-animation: swiper-preloader-spin 1s steps(12, end) infinite;
+ animation: swiper-preloader-spin 1s steps(12, end) infinite; }
+
+.swiper-lazy-preloader:after {
+ display: block;
+ content: "";
+ width: 100%;
+ height: 100%;
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
+ background-position: 50%;
+ -webkit-background-size: 100%;
+ background-size: 100%;
+ background-repeat: no-repeat; }
+
+.swiper-lazy-preloader-white:after {
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); }
+
+@-webkit-keyframes swiper-preloader-spin {
+ 100% {
+ -webkit-transform: rotate(360deg); } }
+
+@keyframes swiper-preloader-spin {
+ 100% {
+ transform: rotate(360deg); } }
+
+ion-slides {
+ width: 100%;
+ height: 100%;
+ display: block; }
+
+.slide-zoom {
+ display: block;
+ width: 100%;
+ text-align: center; }
+
+.swiper-container {
+ width: 100%;
+ height: 100%;
+ padding: 0;
+ overflow: hidden; }
+
+.swiper-wrapper {
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ padding: 0; }
+
+.swiper-slide {
+ width: 100%;
+ height: 100%;
+ box-sizing: border-box;
+ /* Center slide text vertically */ }
+ .swiper-slide img {
+ width: auto;
+ height: auto;
+ max-width: 100%;
+ max-height: 100%; }
+
+.scroll-refresher {
+ position: absolute;
+ top: -60px;
+ right: 0;
+ left: 0;
+ overflow: hidden;
+ margin: auto;
+ height: 60px; }
+ .scroll-refresher .ionic-refresher-content {
+ position: absolute;
+ bottom: 15px;
+ left: 0;
+ width: 100%;
+ color: #666666;
+ text-align: center;
+ font-size: 30px; }
+ .scroll-refresher .ionic-refresher-content .text-refreshing,
+ .scroll-refresher .ionic-refresher-content .text-pulling {
+ font-size: 16px;
+ line-height: 16px; }
+ .scroll-refresher .ionic-refresher-content.ionic-refresher-with-text {
+ bottom: 10px; }
+ .scroll-refresher .icon-refreshing,
+ .scroll-refresher .icon-pulling {
+ width: 100%;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ -webkit-transform-style: preserve-3d;
+ transform-style: preserve-3d; }
+ .scroll-refresher .icon-pulling {
+ -webkit-animation-name: refresh-spin-back;
+ animation-name: refresh-spin-back;
+ -webkit-animation-duration: 200ms;
+ animation-duration: 200ms;
+ -webkit-animation-timing-function: linear;
+ animation-timing-function: linear;
+ -webkit-animation-fill-mode: none;
+ animation-fill-mode: none;
+ -webkit-transform: translate3d(0, 0, 0) rotate(0deg);
+ transform: translate3d(0, 0, 0) rotate(0deg); }
+ .scroll-refresher .icon-refreshing,
+ .scroll-refresher .text-refreshing {
+ display: none; }
+ .scroll-refresher .icon-refreshing {
+ -webkit-animation-duration: 1.5s;
+ animation-duration: 1.5s; }
+ .scroll-refresher.active .icon-pulling:not(.pulling-rotation-disabled) {
+ -webkit-animation-name: refresh-spin;
+ animation-name: refresh-spin;
+ -webkit-transform: translate3d(0, 0, 0) rotate(-180deg);
+ transform: translate3d(0, 0, 0) rotate(-180deg); }
+ .scroll-refresher.active.refreshing {
+ -webkit-transition: -webkit-transform 0.2s;
+ transition: -webkit-transform 0.2s;
+ -webkit-transition: transform 0.2s;
+ transition: transform 0.2s;
+ -webkit-transform: scale(1, 1);
+ transform: scale(1, 1); }
+ .scroll-refresher.active.refreshing .icon-pulling,
+ .scroll-refresher.active.refreshing .text-pulling {
+ display: none; }
+ .scroll-refresher.active.refreshing .icon-refreshing,
+ .scroll-refresher.active.refreshing .text-refreshing {
+ display: block; }
+ .scroll-refresher.active.refreshing.refreshing-tail {
+ -webkit-transform: scale(0, 0);
+ transform: scale(0, 0); }
+
+.overflow-scroll > .scroll {
+ -webkit-overflow-scrolling: touch;
+ width: 100%; }
+ .overflow-scroll > .scroll.overscroll {
+ position: fixed;
+ right: 0;
+ left: 0; }
+
+.overflow-scroll.padding > .scroll.overscroll {
+ padding: 10px; }
+
+@-webkit-keyframes refresh-spin {
+ 0% {
+ -webkit-transform: translate3d(0, 0, 0) rotate(0); }
+ 100% {
+ -webkit-transform: translate3d(0, 0, 0) rotate(180deg); } }
+
+@keyframes refresh-spin {
+ 0% {
+ transform: translate3d(0, 0, 0) rotate(0); }
+ 100% {
+ transform: translate3d(0, 0, 0) rotate(180deg); } }
+
+@-webkit-keyframes refresh-spin-back {
+ 0% {
+ -webkit-transform: translate3d(0, 0, 0) rotate(180deg); }
+ 100% {
+ -webkit-transform: translate3d(0, 0, 0) rotate(0); } }
+
+@keyframes refresh-spin-back {
+ 0% {
+ transform: translate3d(0, 0, 0) rotate(180deg); }
+ 100% {
+ transform: translate3d(0, 0, 0) rotate(0); } }
+
+/**
+ * Spinners
+ * --------------------------------------------------
+ */
+.spinner {
+ stroke: #444;
+ fill: #444; }
+ .spinner svg {
+ width: 28px;
+ height: 28px; }
+ .spinner.spinner-light {
+ stroke: #fff;
+ fill: #fff; }
+ .spinner.spinner-stable {
+ stroke: #f8f8f8;
+ fill: #f8f8f8; }
+ .spinner.spinner-positive {
+ stroke: #387ef5;
+ fill: #387ef5; }
+ .spinner.spinner-calm {
+ stroke: #11c1f3;
+ fill: #11c1f3; }
+ .spinner.spinner-balanced {
+ stroke: #33cd5f;
+ fill: #33cd5f; }
+ .spinner.spinner-assertive {
+ stroke: #ef473a;
+ fill: #ef473a; }
+ .spinner.spinner-energized {
+ stroke: #ffc900;
+ fill: #ffc900; }
+ .spinner.spinner-royal {
+ stroke: #886aea;
+ fill: #886aea; }
+ .spinner.spinner-dark {
+ stroke: #444;
+ fill: #444; }
+
+.spinner-android {
+ stroke: #4b8bf4; }
+
+.spinner-ios,
+.spinner-ios-small {
+ stroke: #69717d; }
+
+.spinner-spiral .stop1 {
+ stop-color: #fff;
+ stop-opacity: 0; }
+
+.spinner-spiral.spinner-light .stop1 {
+ stop-color: #444; }
+
+.spinner-spiral.spinner-light .stop2 {
+ stop-color: #fff; }
+
+.spinner-spiral.spinner-stable .stop2 {
+ stop-color: #f8f8f8; }
+
+.spinner-spiral.spinner-positive .stop2 {
+ stop-color: #387ef5; }
+
+.spinner-spiral.spinner-calm .stop2 {
+ stop-color: #11c1f3; }
+
+.spinner-spiral.spinner-balanced .stop2 {
+ stop-color: #33cd5f; }
+
+.spinner-spiral.spinner-assertive .stop2 {
+ stop-color: #ef473a; }
+
+.spinner-spiral.spinner-energized .stop2 {
+ stop-color: #ffc900; }
+
+.spinner-spiral.spinner-royal .stop2 {
+ stop-color: #886aea; }
+
+.spinner-spiral.spinner-dark .stop2 {
+ stop-color: #444; }
+
+/**
+ * Forms
+ * --------------------------------------------------
+ */
+form {
+ margin: 0 0 1.42857; }
+
+legend {
+ display: block;
+ margin-bottom: 1.42857;
+ padding: 0;
+ width: 100%;
+ border: 1px solid #ddd;
+ color: #444;
+ font-size: 21px;
+ line-height: 2.85714; }
+ legend small {
+ color: #f8f8f8;
+ font-size: 1.07143; }
+
+label,
+input,
+button,
+select,
+textarea {
+ font-weight: normal;
+ font-size: 14px;
+ line-height: 1.42857; }
+
+input,
+button,
+select,
+textarea {
+ font-family: "-apple-system", "Helvetica Neue", "Roboto", "Segoe UI", sans-serif; }
+
+.item-input {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ -moz-align-items: center;
+ align-items: center;
+ position: relative;
+ overflow: hidden;
+ padding: 6px 0 5px 16px; }
+ .item-input input {
+ -webkit-border-radius: 0;
+ border-radius: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 220px;
+ -moz-box-flex: 1;
+ -moz-flex: 1 220px;
+ -ms-flex: 1 220px;
+ flex: 1 220px;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ margin: 0;
+ padding-right: 24px;
+ background-color: transparent; }
+ .item-input .button .icon {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 24px;
+ -moz-box-flex: 0;
+ -moz-flex: 0 0 24px;
+ -ms-flex: 0 0 24px;
+ flex: 0 0 24px;
+ position: static;
+ display: inline-block;
+ height: auto;
+ text-align: center;
+ font-size: 16px; }
+ .item-input .button-bar {
+ -webkit-border-radius: 0;
+ border-radius: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 0 220px;
+ -moz-box-flex: 1;
+ -moz-flex: 1 0 220px;
+ -ms-flex: 1 0 220px;
+ flex: 1 0 220px;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none; }
+ .item-input .icon {
+ min-width: 14px; }
+
+.platform-windowsphone .item-input input {
+ flex-shrink: 1; }
+
+.item-input-inset {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ -moz-align-items: center;
+ align-items: center;
+ position: relative;
+ overflow: hidden;
+ padding: 10.66667px; }
+
+.item-input-wrapper {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 0;
+ -moz-box-flex: 1;
+ -moz-flex: 1 0;
+ -ms-flex: 1 0;
+ flex: 1 0;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ -moz-align-items: center;
+ align-items: center;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ padding-right: 8px;
+ padding-left: 8px;
+ background: #eee; }
+
+.item-input-inset .item-input-wrapper input {
+ padding-left: 4px;
+ height: 29px;
+ background: transparent;
+ line-height: 18px; }
+
+.item-input-wrapper ~ .button {
+ margin-left: 10.66667px; }
+
+.input-label {
+ display: table;
+ padding: 7px 10px 7px 0px;
+ max-width: 200px;
+ width: 35%;
+ color: #444;
+ font-size: 16px; }
+
+.placeholder-icon {
+ color: #aaa; }
+ .placeholder-icon:first-child {
+ padding-right: 6px; }
+ .placeholder-icon:last-child {
+ padding-left: 6px; }
+
+.item-stacked-label {
+ display: block;
+ background-color: transparent;
+ box-shadow: none; }
+ .item-stacked-label .input-label, .item-stacked-label .icon {
+ display: inline-block;
+ padding: 4px 0 0 0px;
+ vertical-align: middle; }
+
+.item-stacked-label input,
+.item-stacked-label textarea {
+ -webkit-border-radius: 2px;
+ border-radius: 2px;
+ padding: 4px 8px 3px 0;
+ border: none;
+ background-color: #fff; }
+
+.item-stacked-label input {
+ overflow: hidden;
+ height: 46px; }
+
+.item-select.item-stacked-label select {
+ position: relative;
+ padding: 0px;
+ max-width: 90%;
+ direction: ltr;
+ white-space: pre-wrap;
+ margin: -3px; }
+
+.item-floating-label {
+ display: block;
+ background-color: transparent;
+ box-shadow: none; }
+ .item-floating-label .input-label {
+ position: relative;
+ padding: 5px 0 0 0;
+ opacity: 0;
+ top: 10px;
+ -webkit-transition: opacity 0.15s ease-in, top 0.2s linear;
+ transition: opacity 0.15s ease-in, top 0.2s linear; }
+ .item-floating-label .input-label.has-input {
+ opacity: 1;
+ top: 0;
+ -webkit-transition: opacity 0.15s ease-in, top 0.2s linear;
+ transition: opacity 0.15s ease-in, top 0.2s linear; }
+
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"] {
+ display: block;
+ padding-top: 2px;
+ padding-left: 0;
+ height: 34px;
+ color: #111;
+ vertical-align: middle;
+ font-size: 14px;
+ line-height: 16px; }
+
+.platform-ios input[type="datetime-local"],
+.platform-ios input[type="date"],
+.platform-ios input[type="month"],
+.platform-ios input[type="time"],
+.platform-ios input[type="week"],
+.platform-android input[type="datetime-local"],
+.platform-android input[type="date"],
+.platform-android input[type="month"],
+.platform-android input[type="time"],
+.platform-android input[type="week"] {
+ padding-top: 8px; }
+
+.item-input input,
+.item-input textarea {
+ width: 100%; }
+
+textarea {
+ padding-left: 0; }
+ textarea::-moz-placeholder {
+ color: #aaaaaa; }
+ textarea:-ms-input-placeholder {
+ color: #aaaaaa; }
+ textarea::-webkit-input-placeholder {
+ color: #aaaaaa;
+ text-indent: -3px; }
+
+textarea {
+ height: auto; }
+
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"] {
+ border: 0; }
+
+input[type="radio"],
+input[type="checkbox"] {
+ margin: 0;
+ line-height: normal; }
+
+.item-input input[type="file"],
+.item-input input[type="image"],
+.item-input input[type="submit"],
+.item-input input[type="reset"],
+.item-input input[type="button"],
+.item-input input[type="radio"],
+.item-input input[type="checkbox"] {
+ width: auto; }
+
+input[type="file"] {
+ line-height: 34px; }
+
+.previous-input-focus,
+.cloned-text-input + input,
+.cloned-text-input + textarea {
+ position: absolute !important;
+ left: -9999px;
+ width: 200px; }
+
+input::-moz-placeholder,
+textarea::-moz-placeholder {
+ color: #aaaaaa; }
+
+input:-ms-input-placeholder,
+textarea:-ms-input-placeholder {
+ color: #aaaaaa; }
+
+input::-webkit-input-placeholder,
+textarea::-webkit-input-placeholder {
+ color: #aaaaaa;
+ text-indent: 0; }
+
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly]:not(.cloned-text-input),
+textarea[readonly]:not(.cloned-text-input),
+select[readonly] {
+ background-color: #f8f8f8;
+ cursor: not-allowed; }
+
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"][readonly],
+input[type="checkbox"][readonly] {
+ background-color: transparent; }
+
+/**
+ * Checkbox
+ * --------------------------------------------------
+ */
+.checkbox {
+ position: relative;
+ display: inline-block;
+ padding: 7px 7px;
+ cursor: pointer; }
+ .checkbox input:before,
+ .checkbox .checkbox-icon:before {
+ border-color: #ddd; }
+ .checkbox input:checked:before,
+ .checkbox input:checked + .checkbox-icon:before {
+ background: #387ef5;
+ border-color: #387ef5; }
+
+.checkbox-light input:before,
+.checkbox-light .checkbox-icon:before {
+ border-color: #ddd; }
+
+.checkbox-light input:checked:before,
+.checkbox-light input:checked + .checkbox-icon:before {
+ background: #ddd;
+ border-color: #ddd; }
+
+.checkbox-stable input:before,
+.checkbox-stable .checkbox-icon:before {
+ border-color: #b2b2b2; }
+
+.checkbox-stable input:checked:before,
+.checkbox-stable input:checked + .checkbox-icon:before {
+ background: #b2b2b2;
+ border-color: #b2b2b2; }
+
+.checkbox-positive input:before,
+.checkbox-positive .checkbox-icon:before {
+ border-color: #387ef5; }
+
+.checkbox-positive input:checked:before,
+.checkbox-positive input:checked + .checkbox-icon:before {
+ background: #387ef5;
+ border-color: #387ef5; }
+
+.checkbox-calm input:before,
+.checkbox-calm .checkbox-icon:before {
+ border-color: #11c1f3; }
+
+.checkbox-calm input:checked:before,
+.checkbox-calm input:checked + .checkbox-icon:before {
+ background: #11c1f3;
+ border-color: #11c1f3; }
+
+.checkbox-assertive input:before,
+.checkbox-assertive .checkbox-icon:before {
+ border-color: #ef473a; }
+
+.checkbox-assertive input:checked:before,
+.checkbox-assertive input:checked + .checkbox-icon:before {
+ background: #ef473a;
+ border-color: #ef473a; }
+
+.checkbox-balanced input:before,
+.checkbox-balanced .checkbox-icon:before {
+ border-color: #33cd5f; }
+
+.checkbox-balanced input:checked:before,
+.checkbox-balanced input:checked + .checkbox-icon:before {
+ background: #33cd5f;
+ border-color: #33cd5f; }
+
+.checkbox-energized input:before,
+.checkbox-energized .checkbox-icon:before {
+ border-color: #ffc900; }
+
+.checkbox-energized input:checked:before,
+.checkbox-energized input:checked + .checkbox-icon:before {
+ background: #ffc900;
+ border-color: #ffc900; }
+
+.checkbox-royal input:before,
+.checkbox-royal .checkbox-icon:before {
+ border-color: #886aea; }
+
+.checkbox-royal input:checked:before,
+.checkbox-royal input:checked + .checkbox-icon:before {
+ background: #886aea;
+ border-color: #886aea; }
+
+.checkbox-dark input:before,
+.checkbox-dark .checkbox-icon:before {
+ border-color: #444; }
+
+.checkbox-dark input:checked:before,
+.checkbox-dark input:checked + .checkbox-icon:before {
+ background: #444;
+ border-color: #444; }
+
+.checkbox input:disabled:before,
+.checkbox input:disabled + .checkbox-icon:before {
+ border-color: #ddd; }
+
+.checkbox input:disabled:checked:before,
+.checkbox input:disabled:checked + .checkbox-icon:before {
+ background: #ddd; }
+
+.checkbox.checkbox-input-hidden input {
+ display: none !important; }
+
+.checkbox input,
+.checkbox-icon {
+ position: relative;
+ width: 28px;
+ height: 28px;
+ display: block;
+ border: 0;
+ background: transparent;
+ cursor: pointer;
+ -webkit-appearance: none; }
+ .checkbox input:before,
+ .checkbox-icon:before {
+ display: table;
+ width: 100%;
+ height: 100%;
+ border-width: 1px;
+ border-style: solid;
+ border-radius: 28px;
+ background: #fff;
+ content: ' ';
+ -webkit-transition: background-color 20ms ease-in-out;
+ transition: background-color 20ms ease-in-out; }
+
+.checkbox input:checked:before,
+input:checked + .checkbox-icon:before {
+ border-width: 2px; }
+
+.checkbox input:after,
+.checkbox-icon:after {
+ -webkit-transition: opacity 0.05s ease-in-out;
+ transition: opacity 0.05s ease-in-out;
+ -webkit-transform: rotate(-45deg);
+ transform: rotate(-45deg);
+ position: absolute;
+ top: 33%;
+ left: 25%;
+ display: table;
+ width: 14px;
+ height: 6px;
+ border: 1px solid #fff;
+ border-top: 0;
+ border-right: 0;
+ content: ' ';
+ opacity: 0; }
+
+.platform-android .checkbox-platform input:before,
+.platform-android .checkbox-platform .checkbox-icon:before,
+.checkbox-square input:before,
+.checkbox-square .checkbox-icon:before {
+ border-radius: 2px;
+ width: 72%;
+ height: 72%;
+ margin-top: 14%;
+ margin-left: 14%;
+ border-width: 2px; }
+
+.platform-android .checkbox-platform input:after,
+.platform-android .checkbox-platform .checkbox-icon:after,
+.checkbox-square input:after,
+.checkbox-square .checkbox-icon:after {
+ border-width: 2px;
+ top: 19%;
+ left: 25%;
+ width: 13px;
+ height: 7px; }
+
+.platform-android .item-checkbox-right .checkbox-square .checkbox-icon::after {
+ top: 31%; }
+
+.grade-c .checkbox input:after,
+.grade-c .checkbox-icon:after {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ top: 3px;
+ left: 4px;
+ border: none;
+ color: #fff;
+ content: '\2713';
+ font-weight: bold;
+ font-size: 20px; }
+
+.checkbox input:checked:after,
+input:checked + .checkbox-icon:after {
+ opacity: 1; }
+
+.item-checkbox {
+ padding-left: 60px; }
+ .item-checkbox.active {
+ box-shadow: none; }
+
+.item-checkbox .checkbox {
+ position: absolute;
+ top: 50%;
+ right: 8px;
+ left: 8px;
+ z-index: 3;
+ margin-top: -21px; }
+
+.item-checkbox.item-checkbox-right {
+ padding-right: 60px;
+ padding-left: 16px; }
+
+.item-checkbox-right .checkbox input,
+.item-checkbox-right .checkbox-icon {
+ float: right; }
+
+/**
+ * Toggle
+ * --------------------------------------------------
+ */
+.item-toggle {
+ pointer-events: none; }
+
+.toggle {
+ position: relative;
+ display: inline-block;
+ pointer-events: auto;
+ margin: -5px;
+ padding: 5px; }
+ .toggle input:checked + .track {
+ border-color: #4cd964;
+ background-color: #4cd964; }
+ .toggle.dragging .handle {
+ background-color: #f2f2f2 !important; }
+
+.toggle.toggle-light input:checked + .track {
+ border-color: #ddd;
+ background-color: #ddd; }
+
+.toggle.toggle-stable input:checked + .track {
+ border-color: #b2b2b2;
+ background-color: #b2b2b2; }
+
+.toggle.toggle-positive input:checked + .track {
+ border-color: #387ef5;
+ background-color: #387ef5; }
+
+.toggle.toggle-calm input:checked + .track {
+ border-color: #11c1f3;
+ background-color: #11c1f3; }
+
+.toggle.toggle-assertive input:checked + .track {
+ border-color: #ef473a;
+ background-color: #ef473a; }
+
+.toggle.toggle-balanced input:checked + .track {
+ border-color: #33cd5f;
+ background-color: #33cd5f; }
+
+.toggle.toggle-energized input:checked + .track {
+ border-color: #ffc900;
+ background-color: #ffc900; }
+
+.toggle.toggle-royal input:checked + .track {
+ border-color: #886aea;
+ background-color: #886aea; }
+
+.toggle.toggle-dark input:checked + .track {
+ border-color: #444;
+ background-color: #444; }
+
+.toggle input {
+ display: none; }
+
+/* the track appearance when the toggle is "off" */
+.toggle .track {
+ -webkit-transition-timing-function: ease-in-out;
+ transition-timing-function: ease-in-out;
+ -webkit-transition-duration: 0.3s;
+ transition-duration: 0.3s;
+ -webkit-transition-property: background-color, border;
+ transition-property: background-color, border;
+ display: inline-block;
+ box-sizing: border-box;
+ width: 51px;
+ height: 31px;
+ border: solid 2px #e6e6e6;
+ border-radius: 20px;
+ background-color: #fff;
+ content: ' ';
+ cursor: pointer;
+ pointer-events: none; }
+
+/* Fix to avoid background color bleeding */
+/* (occurred on (at least) Android 4.2, Asus MeMO Pad HD7 ME173X) */
+.platform-android4_2 .toggle .track {
+ -webkit-background-clip: padding-box; }
+
+/* the handle (circle) thats inside the toggle's track area */
+/* also the handle's appearance when it is "off" */
+.toggle .handle {
+ -webkit-transition: 0.3s cubic-bezier(0, 1.1, 1, 1.1);
+ transition: 0.3s cubic-bezier(0, 1.1, 1, 1.1);
+ -webkit-transition-property: background-color, transform;
+ transition-property: background-color, transform;
+ position: absolute;
+ display: block;
+ width: 27px;
+ height: 27px;
+ border-radius: 27px;
+ background-color: #fff;
+ top: 7px;
+ left: 7px;
+ box-shadow: 0 2px 7px rgba(0, 0, 0, 0.35), 0 1px 1px rgba(0, 0, 0, 0.15); }
+ .toggle .handle:before {
+ position: absolute;
+ top: -4px;
+ left: -21.5px;
+ padding: 18.5px 34px;
+ content: " "; }
+
+.toggle input:checked + .track .handle {
+ -webkit-transform: translate3d(20px, 0, 0);
+ transform: translate3d(20px, 0, 0);
+ background-color: #fff; }
+
+.item-toggle.active {
+ box-shadow: none; }
+
+.item-toggle,
+.item-toggle.item-complex .item-content {
+ padding-right: 99px; }
+
+.item-toggle.item-complex {
+ padding-right: 0; }
+
+.item-toggle .toggle {
+ position: absolute;
+ top: 10px;
+ right: 16px;
+ z-index: 3; }
+
+.toggle input:disabled + .track {
+ opacity: .6; }
+
+.toggle-small .track {
+ border: 0;
+ width: 34px;
+ height: 15px;
+ background: #9e9e9e; }
+
+.toggle-small input:checked + .track {
+ background: rgba(0, 150, 137, 0.5); }
+
+.toggle-small .handle {
+ top: 2px;
+ left: 4px;
+ width: 21px;
+ height: 21px;
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25); }
+
+.toggle-small input:checked + .track .handle {
+ -webkit-transform: translate3d(16px, 0, 0);
+ transform: translate3d(16px, 0, 0);
+ background: #009689; }
+
+.toggle-small.item-toggle .toggle {
+ top: 19px; }
+
+.toggle-small .toggle-light input:checked + .track {
+ background-color: rgba(221, 221, 221, 0.5); }
+
+.toggle-small .toggle-light input:checked + .track .handle {
+ background-color: #ddd; }
+
+.toggle-small .toggle-stable input:checked + .track {
+ background-color: rgba(178, 178, 178, 0.5); }
+
+.toggle-small .toggle-stable input:checked + .track .handle {
+ background-color: #b2b2b2; }
+
+.toggle-small .toggle-positive input:checked + .track {
+ background-color: rgba(56, 126, 245, 0.5); }
+
+.toggle-small .toggle-positive input:checked + .track .handle {
+ background-color: #387ef5; }
+
+.toggle-small .toggle-calm input:checked + .track {
+ background-color: rgba(17, 193, 243, 0.5); }
+
+.toggle-small .toggle-calm input:checked + .track .handle {
+ background-color: #11c1f3; }
+
+.toggle-small .toggle-assertive input:checked + .track {
+ background-color: rgba(239, 71, 58, 0.5); }
+
+.toggle-small .toggle-assertive input:checked + .track .handle {
+ background-color: #ef473a; }
+
+.toggle-small .toggle-balanced input:checked + .track {
+ background-color: rgba(51, 205, 95, 0.5); }
+
+.toggle-small .toggle-balanced input:checked + .track .handle {
+ background-color: #33cd5f; }
+
+.toggle-small .toggle-energized input:checked + .track {
+ background-color: rgba(255, 201, 0, 0.5); }
+
+.toggle-small .toggle-energized input:checked + .track .handle {
+ background-color: #ffc900; }
+
+.toggle-small .toggle-royal input:checked + .track {
+ background-color: rgba(136, 106, 234, 0.5); }
+
+.toggle-small .toggle-royal input:checked + .track .handle {
+ background-color: #886aea; }
+
+.toggle-small .toggle-dark input:checked + .track {
+ background-color: rgba(68, 68, 68, 0.5); }
+
+.toggle-small .toggle-dark input:checked + .track .handle {
+ background-color: #444; }
+
+/**
+ * Radio Button Inputs
+ * --------------------------------------------------
+ */
+.item-radio {
+ padding: 0; }
+ .item-radio:hover {
+ cursor: pointer; }
+
+.item-radio .item-content {
+ /* give some room to the right for the checkmark icon */
+ padding-right: 64px; }
+
+.item-radio .radio-icon {
+ /* checkmark icon will be hidden by default */
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 3;
+ visibility: hidden;
+ padding: 14px;
+ height: 100%;
+ font-size: 24px; }
+
+.item-radio input {
+ /* hide any radio button inputs elements (the ugly circles) */
+ position: absolute;
+ left: -9999px; }
+ .item-radio input:checked + .radio-content .item-content {
+ /* style the item content when its checked */
+ background: #f7f7f7; }
+ .item-radio input:checked + .radio-content .radio-icon {
+ /* show the checkmark icon when its checked */
+ visibility: visible; }
+
+/**
+ * Range
+ * --------------------------------------------------
+ */
+.range input {
+ display: inline-block;
+ overflow: hidden;
+ margin-top: 5px;
+ margin-bottom: 5px;
+ padding-right: 2px;
+ padding-left: 1px;
+ width: auto;
+ height: 43px;
+ outline: none;
+ background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ccc), color-stop(100%, #ccc));
+ background: linear-gradient(to right, #ccc 0%, #ccc 100%);
+ background-position: center;
+ background-size: 99% 2px;
+ background-repeat: no-repeat;
+ -webkit-appearance: none;
+ /*
+ &::-ms-track{
+ background: transparent;
+ border-color: transparent;
+ border-width: 11px 0 16px;
+ color:transparent;
+ margin-top:20px;
+ }
+ &::-ms-thumb {
+ width: $range-slider-width;
+ height: $range-slider-height;
+ border-radius: $range-slider-border-radius;
+ background-color: $toggle-handle-off-bg-color;
+ border-color:$toggle-handle-off-bg-color;
+ box-shadow: $range-slider-box-shadow;
+ margin-left:1px;
+ margin-right:1px;
+ outline:none;
+ }
+ &::-ms-fill-upper {
+ height: $range-track-height;
+ background:$range-default-track-bg;
+ }
+ */ }
+ .range input::-moz-focus-outer {
+ /* hide the focus outline in Firefox */
+ border: 0; }
+ .range input::-webkit-slider-thumb {
+ position: relative;
+ width: 28px;
+ height: 28px;
+ border-radius: 50%;
+ background-color: #fff;
+ box-shadow: 0 0 2px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2);
+ cursor: pointer;
+ -webkit-appearance: none;
+ border: 0; }
+ .range input::-webkit-slider-thumb:before {
+ /* what creates the colorful line on the left side of the slider */
+ position: absolute;
+ top: 13px;
+ left: -2001px;
+ width: 2000px;
+ height: 2px;
+ background: #444;
+ content: ' '; }
+ .range input::-webkit-slider-thumb:after {
+ /* create a larger (but hidden) hit area */
+ position: absolute;
+ top: -15px;
+ left: -15px;
+ padding: 30px;
+ content: ' '; }
+ .range input::-ms-fill-lower {
+ height: 2px;
+ background: #444; }
+
+.range {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ -moz-align-items: center;
+ align-items: center;
+ padding: 2px 11px; }
+ .range.range-light input::-webkit-slider-thumb:before {
+ background: #ddd; }
+ .range.range-light input::-ms-fill-lower {
+ background: #ddd; }
+ .range.range-stable input::-webkit-slider-thumb:before {
+ background: #b2b2b2; }
+ .range.range-stable input::-ms-fill-lower {
+ background: #b2b2b2; }
+ .range.range-positive input::-webkit-slider-thumb:before {
+ background: #387ef5; }
+ .range.range-positive input::-ms-fill-lower {
+ background: #387ef5; }
+ .range.range-calm input::-webkit-slider-thumb:before {
+ background: #11c1f3; }
+ .range.range-calm input::-ms-fill-lower {
+ background: #11c1f3; }
+ .range.range-balanced input::-webkit-slider-thumb:before {
+ background: #33cd5f; }
+ .range.range-balanced input::-ms-fill-lower {
+ background: #33cd5f; }
+ .range.range-assertive input::-webkit-slider-thumb:before {
+ background: #ef473a; }
+ .range.range-assertive input::-ms-fill-lower {
+ background: #ef473a; }
+ .range.range-energized input::-webkit-slider-thumb:before {
+ background: #ffc900; }
+ .range.range-energized input::-ms-fill-lower {
+ background: #ffc900; }
+ .range.range-royal input::-webkit-slider-thumb:before {
+ background: #886aea; }
+ .range.range-royal input::-ms-fill-lower {
+ background: #886aea; }
+ .range.range-dark input::-webkit-slider-thumb:before {
+ background: #444; }
+ .range.range-dark input::-ms-fill-lower {
+ background: #444; }
+
+.range .icon {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0;
+ -moz-box-flex: 0;
+ -moz-flex: 0;
+ -ms-flex: 0;
+ flex: 0;
+ display: block;
+ min-width: 24px;
+ text-align: center;
+ font-size: 24px; }
+
+.range input {
+ -webkit-box-flex: 1;
+ -webkit-flex: 1;
+ -moz-box-flex: 1;
+ -moz-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ display: block;
+ margin-right: 10px;
+ margin-left: 10px; }
+
+.range-label {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -moz-box-flex: 0;
+ -moz-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ display: block;
+ white-space: nowrap; }
+
+.range-label:first-child {
+ padding-left: 5px; }
+
+.range input + .range-label {
+ padding-right: 5px;
+ padding-left: 0; }
+
+.platform-windowsphone .range input {
+ height: auto; }
+
+/**
+ * Select
+ * --------------------------------------------------
+ */
+.item-select {
+ position: relative; }
+ .item-select select {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ right: 0;
+ padding: 0 48px 0 16px;
+ max-width: 65%;
+ border: none;
+ background: #fff;
+ color: #333;
+ text-indent: .01px;
+ text-overflow: '';
+ white-space: nowrap;
+ font-size: 14px;
+ cursor: pointer;
+ direction: rtl; }
+ .item-select select::-ms-expand {
+ display: none; }
+ .item-select option {
+ direction: ltr; }
+ .item-select:after {
+ position: absolute;
+ top: 50%;
+ right: 16px;
+ margin-top: -3px;
+ width: 0;
+ height: 0;
+ border-top: 5px solid;
+ border-right: 5px solid transparent;
+ border-left: 5px solid transparent;
+ color: #999;
+ content: "";
+ pointer-events: none; }
+ .item-select.item-light select {
+ background: #fff;
+ color: #444; }
+ .item-select.item-stable select {
+ background: #f8f8f8;
+ color: #444; }
+ .item-select.item-stable:after, .item-select.item-stable .input-label {
+ color: #666666; }
+ .item-select.item-positive select {
+ background: #387ef5;
+ color: #fff; }
+ .item-select.item-positive:after, .item-select.item-positive .input-label {
+ color: #fff; }
+ .item-select.item-calm select {
+ background: #11c1f3;
+ color: #fff; }
+ .item-select.item-calm:after, .item-select.item-calm .input-label {
+ color: #fff; }
+ .item-select.item-assertive select {
+ background: #ef473a;
+ color: #fff; }
+ .item-select.item-assertive:after, .item-select.item-assertive .input-label {
+ color: #fff; }
+ .item-select.item-balanced select {
+ background: #33cd5f;
+ color: #fff; }
+ .item-select.item-balanced:after, .item-select.item-balanced .input-label {
+ color: #fff; }
+ .item-select.item-energized select {
+ background: #ffc900;
+ color: #fff; }
+ .item-select.item-energized:after, .item-select.item-energized .input-label {
+ color: #fff; }
+ .item-select.item-royal select {
+ background: #886aea;
+ color: #fff; }
+ .item-select.item-royal:after, .item-select.item-royal .input-label {
+ color: #fff; }
+ .item-select.item-dark select {
+ background: #444;
+ color: #fff; }
+ .item-select.item-dark:after, .item-select.item-dark .input-label {
+ color: #fff; }
+
+select[multiple], select[size] {
+ height: auto; }
+
+/**
+ * Progress
+ * --------------------------------------------------
+ */
+progress {
+ display: block;
+ margin: 15px auto;
+ width: 100%; }
+
+/**
+ * Buttons
+ * --------------------------------------------------
+ */
+.button {
+ border-color: transparent;
+ background-color: #f8f8f8;
+ color: #444;
+ position: relative;
+ display: inline-block;
+ margin: 0;
+ padding: 0 12px;
+ min-width: 52px;
+ min-height: 47px;
+ border-width: 1px;
+ border-style: solid;
+ border-radius: 4px;
+ vertical-align: top;
+ text-align: center;
+ text-overflow: ellipsis;
+ font-size: 16px;
+ line-height: 42px;
+ cursor: pointer; }
+ .button:hover {
+ color: #444;
+ text-decoration: none; }
+ .button.active, .button.activated {
+ border-color: #a2a2a2;
+ background-color: #e5e5e5; }
+ .button:after {
+ position: absolute;
+ top: -6px;
+ right: -6px;
+ bottom: -6px;
+ left: -6px;
+ content: ' '; }
+ .button .icon {
+ vertical-align: top;
+ pointer-events: none; }
+ .button .icon:before, .button.icon:before, .button.icon-left:before, .button.icon-right:before {
+ display: inline-block;
+ padding: 0 0 1px 0;
+ vertical-align: inherit;
+ font-size: 24px;
+ line-height: 41px;
+ pointer-events: none; }
+ .button.icon-left:before {
+ float: left;
+ padding-right: .2em;
+ padding-left: 0; }
+ .button.icon-right:before {
+ float: right;
+ padding-right: 0;
+ padding-left: .2em; }
+ .button.button-block, .button.button-full {
+ margin-top: 10px;
+ margin-bottom: 10px; }
+ .button.button-light {
+ border-color: transparent;
+ background-color: #fff;
+ color: #444; }
+ .button.button-light:hover {
+ color: #444;
+ text-decoration: none; }
+ .button.button-light.active, .button.button-light.activated {
+ border-color: #a2a2a2;
+ background-color: #fafafa; }
+ .button.button-light.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #ddd; }
+ .button.button-light.button-icon {
+ border-color: transparent;
+ background: none; }
+ .button.button-light.button-outline {
+ border-color: #ddd;
+ background: transparent;
+ color: #ddd; }
+ .button.button-light.button-outline.active, .button.button-light.button-outline.activated {
+ background-color: #ddd;
+ box-shadow: none;
+ color: #fff; }
+ .button.button-stable {
+ border-color: transparent;
+ background-color: #f8f8f8;
+ color: #444; }
+ .button.button-stable:hover {
+ color: #444;
+ text-decoration: none; }
+ .button.button-stable.active, .button.button-stable.activated {
+ border-color: #a2a2a2;
+ background-color: #e5e5e5; }
+ .button.button-stable.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #b2b2b2; }
+ .button.button-stable.button-icon {
+ border-color: transparent;
+ background: none; }
+ .button.button-stable.button-outline {
+ border-color: #b2b2b2;
+ background: transparent;
+ color: #b2b2b2; }
+ .button.button-stable.button-outline.active, .button.button-stable.button-outline.activated {
+ background-color: #b2b2b2;
+ box-shadow: none;
+ color: #fff; }
+ .button.button-positive {
+ border-color: transparent;
+ background-color: #387ef5;
+ color: #fff; }
+ .button.button-positive:hover {
+ color: #fff;
+ text-decoration: none; }
+ .button.button-positive.active, .button.button-positive.activated {
+ border-color: #a2a2a2;
+ background-color: #0c60ee; }
+ .button.button-positive.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #387ef5; }
+ .button.button-positive.button-icon {
+ border-color: transparent;
+ background: none; }
+ .button.button-positive.button-outline {
+ border-color: #387ef5;
+ background: transparent;
+ color: #387ef5; }
+ .button.button-positive.button-outline.active, .button.button-positive.button-outline.activated {
+ background-color: #387ef5;
+ box-shadow: none;
+ color: #fff; }
+ .button.button-calm {
+ border-color: transparent;
+ background-color: #11c1f3;
+ color: #fff; }
+ .button.button-calm:hover {
+ color: #fff;
+ text-decoration: none; }
+ .button.button-calm.active, .button.button-calm.activated {
+ border-color: #a2a2a2;
+ background-color: #0a9dc7; }
+ .button.button-calm.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #11c1f3; }
+ .button.button-calm.button-icon {
+ border-color: transparent;
+ background: none; }
+ .button.button-calm.button-outline {
+ border-color: #11c1f3;
+ background: transparent;
+ color: #11c1f3; }
+ .button.button-calm.button-outline.active, .button.button-calm.button-outline.activated {
+ background-color: #11c1f3;
+ box-shadow: none;
+ color: #fff; }
+ .button.button-assertive {
+ border-color: transparent;
+ background-color: #ef473a;
+ color: #fff; }
+ .button.button-assertive:hover {
+ color: #fff;
+ text-decoration: none; }
+ .button.button-assertive.active, .button.button-assertive.activated {
+ border-color: #a2a2a2;
+ background-color: #e42112; }
+ .button.button-assertive.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #ef473a; }
+ .button.button-assertive.button-icon {
+ border-color: transparent;
+ background: none; }
+ .button.button-assertive.button-outline {
+ border-color: #ef473a;
+ background: transparent;
+ color: #ef473a; }
+ .button.button-assertive.button-outline.active, .button.button-assertive.button-outline.activated {
+ background-color: #ef473a;
+ box-shadow: none;
+ color: #fff; }
+ .button.button-balanced {
+ border-color: transparent;
+ background-color: #33cd5f;
+ color: #fff; }
+ .button.button-balanced:hover {
+ color: #fff;
+ text-decoration: none; }
+ .button.button-balanced.active, .button.button-balanced.activated {
+ border-color: #a2a2a2;
+ background-color: #28a54c; }
+ .button.button-balanced.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #33cd5f; }
+ .button.button-balanced.button-icon {
+ border-color: transparent;
+ background: none; }
+ .button.button-balanced.button-outline {
+ border-color: #33cd5f;
+ background: transparent;
+ color: #33cd5f; }
+ .button.button-balanced.button-outline.active, .button.button-balanced.button-outline.activated {
+ background-color: #33cd5f;
+ box-shadow: none;
+ color: #fff; }
+ .button.button-energized {
+ border-color: transparent;
+ background-color: #ffc900;
+ color: #fff; }
+ .button.button-energized:hover {
+ color: #fff;
+ text-decoration: none; }
+ .button.button-energized.active, .button.button-energized.activated {
+ border-color: #a2a2a2;
+ background-color: #e6b500; }
+ .button.button-energized.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #ffc900; }
+ .button.button-energized.button-icon {
+ border-color: transparent;
+ background: none; }
+ .button.button-energized.button-outline {
+ border-color: #ffc900;
+ background: transparent;
+ color: #ffc900; }
+ .button.button-energized.button-outline.active, .button.button-energized.button-outline.activated {
+ background-color: #ffc900;
+ box-shadow: none;
+ color: #fff; }
+ .button.button-royal {
+ border-color: transparent;
+ background-color: #886aea;
+ color: #fff; }
+ .button.button-royal:hover {
+ color: #fff;
+ text-decoration: none; }
+ .button.button-royal.active, .button.button-royal.activated {
+ border-color: #a2a2a2;
+ background-color: #6b46e5; }
+ .button.button-royal.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #886aea; }
+ .button.button-royal.button-icon {
+ border-color: transparent;
+ background: none; }
+ .button.button-royal.button-outline {
+ border-color: #886aea;
+ background: transparent;
+ color: #886aea; }
+ .button.button-royal.button-outline.active, .button.button-royal.button-outline.activated {
+ background-color: #886aea;
+ box-shadow: none;
+ color: #fff; }
+ .button.button-dark {
+ border-color: transparent;
+ background-color: #444;
+ color: #fff; }
+ .button.button-dark:hover {
+ color: #fff;
+ text-decoration: none; }
+ .button.button-dark.active, .button.button-dark.activated {
+ border-color: #a2a2a2;
+ background-color: #262626; }
+ .button.button-dark.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: #444; }
+ .button.button-dark.button-icon {
+ border-color: transparent;
+ background: none; }
+ .button.button-dark.button-outline {
+ border-color: #444;
+ background: transparent;
+ color: #444; }
+ .button.button-dark.button-outline.active, .button.button-dark.button-outline.activated {
+ background-color: #444;
+ box-shadow: none;
+ color: #fff; }
+
+.button-small {
+ padding: 2px 4px 1px;
+ min-width: 28px;
+ min-height: 30px;
+ font-size: 12px;
+ line-height: 26px; }
+ .button-small .icon:before, .button-small.icon:before, .button-small.icon-left:before, .button-small.icon-right:before {
+ font-size: 16px;
+ line-height: 19px;
+ margin-top: 3px; }
+
+.button-large {
+ padding: 0 16px;
+ min-width: 68px;
+ min-height: 59px;
+ font-size: 20px;
+ line-height: 53px; }
+ .button-large .icon:before, .button-large.icon:before, .button-large.icon-left:before, .button-large.icon-right:before {
+ padding-bottom: 2px;
+ font-size: 32px;
+ line-height: 51px; }
+
+.button-icon {
+ -webkit-transition: opacity 0.1s;
+ transition: opacity 0.1s;
+ padding: 0 6px;
+ min-width: initial;
+ border-color: transparent;
+ background: none; }
+ .button-icon.button.active, .button-icon.button.activated {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ opacity: 0.3; }
+ .button-icon .icon:before, .button-icon.icon:before {
+ font-size: 32px; }
+
+.button-clear {
+ -webkit-transition: opacity 0.1s;
+ transition: opacity 0.1s;
+ padding: 0 6px;
+ max-height: 42px;
+ border-color: transparent;
+ background: none;
+ box-shadow: none; }
+ .button-clear.button-clear {
+ border-color: transparent;
+ background: none;
+ box-shadow: none;
+ color: transparent; }
+ .button-clear.button-icon {
+ border-color: transparent;
+ background: none; }
+ .button-clear.active, .button-clear.activated {
+ opacity: 0.3; }
+
+.button-outline {
+ -webkit-transition: opacity 0.1s;
+ transition: opacity 0.1s;
+ background: none;
+ box-shadow: none; }
+ .button-outline.button-outline {
+ border-color: transparent;
+ background: transparent;
+ color: transparent; }
+ .button-outline.button-outline.active, .button-outline.button-outline.activated {
+ background-color: transparent;
+ box-shadow: none;
+ color: #fff; }
+
+.padding > .button.button-block:first-child {
+ margin-top: 0; }
+
+.button-block {
+ display: block;
+ clear: both; }
+ .button-block:after {
+ clear: both; }
+
+.button-full,
+.button-full > .button {
+ display: block;
+ margin-right: 0;
+ margin-left: 0;
+ border-right-width: 0;
+ border-left-width: 0;
+ border-radius: 0; }
+
+button.button-block,
+button.button-full,
+.button-full > button.button,
+input.button.button-block {
+ width: 100%; }
+
+a.button {
+ text-decoration: none; }
+ a.button .icon:before, a.button.icon:before, a.button.icon-left:before, a.button.icon-right:before {
+ margin-top: 2px; }
+
+.button.disabled,
+.button[disabled] {
+ opacity: .4;
+ cursor: default !important;
+ pointer-events: none; }
+
+/**
+ * Button Bar
+ * --------------------------------------------------
+ */
+.button-bar {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-flex: 1;
+ -webkit-flex: 1;
+ -moz-box-flex: 1;
+ -moz-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ width: 100%; }
+ .button-bar.button-bar-inline {
+ display: block;
+ width: auto;
+ *zoom: 1; }
+ .button-bar.button-bar-inline:before, .button-bar.button-bar-inline:after {
+ display: table;
+ content: "";
+ line-height: 0; }
+ .button-bar.button-bar-inline:after {
+ clear: both; }
+ .button-bar.button-bar-inline > .button {
+ width: auto;
+ display: inline-block;
+ float: left; }
+ .button-bar.bar-light > .button {
+ border-color: #ddd; }
+ .button-bar.bar-stable > .button {
+ border-color: #b2b2b2; }
+ .button-bar.bar-positive > .button {
+ border-color: #0c60ee; }
+ .button-bar.bar-calm > .button {
+ border-color: #0a9dc7; }
+ .button-bar.bar-assertive > .button {
+ border-color: #e42112; }
+ .button-bar.bar-balanced > .button {
+ border-color: #28a54c; }
+ .button-bar.bar-energized > .button {
+ border-color: #e6b500; }
+ .button-bar.bar-royal > .button {
+ border-color: #6b46e5; }
+ .button-bar.bar-dark > .button {
+ border-color: #111; }
+
+.button-bar > .button {
+ -webkit-box-flex: 1;
+ -webkit-flex: 1;
+ -moz-box-flex: 1;
+ -moz-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ display: block;
+ overflow: hidden;
+ padding: 0 16px;
+ width: 0;
+ border-width: 1px 0px 1px 1px;
+ border-radius: 0;
+ text-align: center;
+ text-overflow: ellipsis;
+ white-space: nowrap; }
+ .button-bar > .button:before,
+ .button-bar > .button .icon:before {
+ line-height: 44px; }
+ .button-bar > .button:first-child {
+ border-radius: 4px 0px 0px 4px; }
+ .button-bar > .button:last-child {
+ border-right-width: 1px;
+ border-radius: 0px 4px 4px 0px; }
+ .button-bar > .button:only-child {
+ border-radius: 4px; }
+
+.button-bar > .button-small:before,
+.button-bar > .button-small .icon:before {
+ line-height: 28px; }
+
+/**
+ * Grid
+ * --------------------------------------------------
+ * Using flexbox for the grid, inspired by Philip Walton:
+ * http://philipwalton.github.io/solved-by-flexbox/demos/grids/
+ * By default each .col within a .row will evenly take up
+ * available width, and the height of each .col with take
+ * up the height of the tallest .col in the same .row.
+ */
+.row {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -moz-box;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ padding: 5px;
+ width: 100%; }
+
+.row-wrap {
+ -webkit-flex-wrap: wrap;
+ -moz-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap; }
+
+.row-no-padding {
+ padding: 0; }
+ .row-no-padding > .col {
+ padding: 0; }
+
+.row + .row {
+ margin-top: -5px;
+ padding-top: 0; }
+
+.col {
+ -webkit-box-flex: 1;
+ -webkit-flex: 1;
+ -moz-box-flex: 1;
+ -moz-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ display: block;
+ padding: 5px;
+ width: 100%; }
+
+/* Vertically Align Columns */
+/* .row-* vertically aligns every .col in the .row */
+.row-top {
+ -webkit-box-align: start;
+ -ms-flex-align: start;
+ -webkit-align-items: flex-start;
+ -moz-align-items: flex-start;
+ align-items: flex-start; }
+
+.row-bottom {
+ -webkit-box-align: end;
+ -ms-flex-align: end;
+ -webkit-align-items: flex-end;
+ -moz-align-items: flex-end;
+ align-items: flex-end; }
+
+.row-center {
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ -moz-align-items: center;
+ align-items: center; }
+
+.row-stretch {
+ -webkit-box-align: stretch;
+ -ms-flex-align: stretch;
+ -webkit-align-items: stretch;
+ -moz-align-items: stretch;
+ align-items: stretch; }
+
+.row-baseline {
+ -webkit-box-align: baseline;
+ -ms-flex-align: baseline;
+ -webkit-align-items: baseline;
+ -moz-align-items: baseline;
+ align-items: baseline; }
+
+/* .col-* vertically aligns an individual .col */
+.col-top {
+ -webkit-align-self: flex-start;
+ -moz-align-self: flex-start;
+ -ms-flex-item-align: start;
+ align-self: flex-start; }
+
+.col-bottom {
+ -webkit-align-self: flex-end;
+ -moz-align-self: flex-end;
+ -ms-flex-item-align: end;
+ align-self: flex-end; }
+
+.col-center {
+ -webkit-align-self: center;
+ -moz-align-self: center;
+ -ms-flex-item-align: center;
+ align-self: center; }
+
+/* Column Offsets */
+.col-offset-10 {
+ margin-left: 10%; }
+
+.col-offset-20 {
+ margin-left: 20%; }
+
+.col-offset-25 {
+ margin-left: 25%; }
+
+.col-offset-33, .col-offset-34 {
+ margin-left: 33.3333%; }
+
+.col-offset-50 {
+ margin-left: 50%; }
+
+.col-offset-66, .col-offset-67 {
+ margin-left: 66.6666%; }
+
+.col-offset-75 {
+ margin-left: 75%; }
+
+.col-offset-80 {
+ margin-left: 80%; }
+
+.col-offset-90 {
+ margin-left: 90%; }
+
+/* Explicit Column Percent Sizes */
+/* By default each grid column will evenly distribute */
+/* across the grid. However, you can specify individual */
+/* columns to take up a certain size of the available area */
+.col-10 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 10%;
+ -moz-box-flex: 0;
+ -moz-flex: 0 0 10%;
+ -ms-flex: 0 0 10%;
+ flex: 0 0 10%;
+ max-width: 10%; }
+
+.col-20 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 20%;
+ -moz-box-flex: 0;
+ -moz-flex: 0 0 20%;
+ -ms-flex: 0 0 20%;
+ flex: 0 0 20%;
+ max-width: 20%; }
+
+.col-25 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 25%;
+ -moz-box-flex: 0;
+ -moz-flex: 0 0 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%; }
+
+.col-33, .col-34 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 33.3333%;
+ -moz-box-flex: 0;
+ -moz-flex: 0 0 33.3333%;
+ -ms-flex: 0 0 33.3333%;
+ flex: 0 0 33.3333%;
+ max-width: 33.3333%; }
+
+.col-40 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 40%;
+ -moz-box-flex: 0;
+ -moz-flex: 0 0 40%;
+ -ms-flex: 0 0 40%;
+ flex: 0 0 40%;
+ max-width: 40%; }
+
+.col-50 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 50%;
+ -moz-box-flex: 0;
+ -moz-flex: 0 0 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%; }
+
+.col-60 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 60%;
+ -moz-box-flex: 0;
+ -moz-flex: 0 0 60%;
+ -ms-flex: 0 0 60%;
+ flex: 0 0 60%;
+ max-width: 60%; }
+
+.col-66, .col-67 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 66.6666%;
+ -moz-box-flex: 0;
+ -moz-flex: 0 0 66.6666%;
+ -ms-flex: 0 0 66.6666%;
+ flex: 0 0 66.6666%;
+ max-width: 66.6666%; }
+
+.col-75 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 75%;
+ -moz-box-flex: 0;
+ -moz-flex: 0 0 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%; }
+
+.col-80 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 80%;
+ -moz-box-flex: 0;
+ -moz-flex: 0 0 80%;
+ -ms-flex: 0 0 80%;
+ flex: 0 0 80%;
+ max-width: 80%; }
+
+.col-90 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 90%;
+ -moz-box-flex: 0;
+ -moz-flex: 0 0 90%;
+ -ms-flex: 0 0 90%;
+ flex: 0 0 90%;
+ max-width: 90%; }
+
+/* Responsive Grid Classes */
+/* Adding a class of responsive-X to a row */
+/* will trigger the flex-direction to */
+/* change to column and add some margin */
+/* to any columns in the row for clearity */
+@media (max-width: 567px) {
+ .responsive-sm {
+ -webkit-box-direction: normal;
+ -moz-box-direction: normal;
+ -webkit-box-orient: vertical;
+ -moz-box-orient: vertical;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column; }
+ .responsive-sm .col, .responsive-sm .col-10, .responsive-sm .col-20, .responsive-sm .col-25, .responsive-sm .col-33, .responsive-sm .col-34, .responsive-sm .col-50, .responsive-sm .col-66, .responsive-sm .col-67, .responsive-sm .col-75, .responsive-sm .col-80, .responsive-sm .col-90 {
+ -webkit-box-flex: 1;
+ -webkit-flex: 1;
+ -moz-box-flex: 1;
+ -moz-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ margin-bottom: 15px;
+ margin-left: 0;
+ max-width: 100%;
+ width: 100%; } }
+
+@media (max-width: 767px) {
+ .responsive-md {
+ -webkit-box-direction: normal;
+ -moz-box-direction: normal;
+ -webkit-box-orient: vertical;
+ -moz-box-orient: vertical;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column; }
+ .responsive-md .col, .responsive-md .col-10, .responsive-md .col-20, .responsive-md .col-25, .responsive-md .col-33, .responsive-md .col-34, .responsive-md .col-50, .responsive-md .col-66, .responsive-md .col-67, .responsive-md .col-75, .responsive-md .col-80, .responsive-md .col-90 {
+ -webkit-box-flex: 1;
+ -webkit-flex: 1;
+ -moz-box-flex: 1;
+ -moz-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ margin-bottom: 15px;
+ margin-left: 0;
+ max-width: 100%;
+ width: 100%; } }
+
+@media (max-width: 1023px) {
+ .responsive-lg {
+ -webkit-box-direction: normal;
+ -moz-box-direction: normal;
+ -webkit-box-orient: vertical;
+ -moz-box-orient: vertical;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column; }
+ .responsive-lg .col, .responsive-lg .col-10, .responsive-lg .col-20, .responsive-lg .col-25, .responsive-lg .col-33, .responsive-lg .col-34, .responsive-lg .col-50, .responsive-lg .col-66, .responsive-lg .col-67, .responsive-lg .col-75, .responsive-lg .col-80, .responsive-lg .col-90 {
+ -webkit-box-flex: 1;
+ -webkit-flex: 1;
+ -moz-box-flex: 1;
+ -moz-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ margin-bottom: 15px;
+ margin-left: 0;
+ max-width: 100%;
+ width: 100%; } }
+
+/**
+ * Utility Classes
+ * --------------------------------------------------
+ */
+.hide {
+ display: none; }
+
+.opacity-hide {
+ opacity: 0; }
+
+.grade-b .opacity-hide,
+.grade-c .opacity-hide {
+ opacity: 1;
+ display: none; }
+
+.show {
+ display: block; }
+
+.opacity-show {
+ opacity: 1; }
+
+.invisible {
+ visibility: hidden; }
+
+.keyboard-open .hide-on-keyboard-open {
+ display: none; }
+
+.keyboard-open .tabs.hide-on-keyboard-open + .pane .has-tabs,
+.keyboard-open .bar-footer.hide-on-keyboard-open + .pane .has-footer {
+ bottom: 0; }
+
+.inline {
+ display: inline-block; }
+
+.disable-pointer-events {
+ pointer-events: none; }
+
+.enable-pointer-events {
+ pointer-events: auto; }
+
+.disable-user-behavior {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-touch-callout: none;
+ -webkit-tap-highlight-color: transparent;
+ -webkit-tap-highlight-color: transparent;
+ -webkit-user-drag: none;
+ -ms-touch-action: none;
+ -ms-content-zooming: none; }
+
+.click-block {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ opacity: 0;
+ z-index: 99999;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ overflow: hidden; }
+
+.click-block-hide {
+ -webkit-transform: translate3d(-9999px, 0, 0);
+ transform: translate3d(-9999px, 0, 0); }
+
+.no-resize {
+ resize: none; }
+
+.block {
+ display: block;
+ clear: both; }
+ .block:after {
+ display: block;
+ visibility: hidden;
+ clear: both;
+ height: 0;
+ content: "."; }
+
+.full-image {
+ width: 100%; }
+
+.clearfix {
+ *zoom: 1; }
+ .clearfix:before, .clearfix:after {
+ display: table;
+ content: "";
+ line-height: 0; }
+ .clearfix:after {
+ clear: both; }
+
+/**
+ * Content Padding
+ * --------------------------------------------------
+ */
+.padding {
+ padding: 10px; }
+
+.padding-top,
+.padding-vertical {
+ padding-top: 10px; }
+
+.padding-right,
+.padding-horizontal {
+ padding-right: 10px; }
+
+.padding-bottom,
+.padding-vertical {
+ padding-bottom: 10px; }
+
+.padding-left,
+.padding-horizontal {
+ padding-left: 10px; }
+
+/**
+ * Scrollable iFrames
+ * --------------------------------------------------
+ */
+.iframe-wrapper {
+ position: fixed;
+ -webkit-overflow-scrolling: touch;
+ overflow: scroll; }
+ .iframe-wrapper iframe {
+ height: 100%;
+ width: 100%; }
+
+/**
+ * Rounded
+ * --------------------------------------------------
+ */
+.rounded {
+ border-radius: 4px; }
+
+/**
+ * Utility Colors
+ * --------------------------------------------------
+ * Utility colors are added to help set a naming convention. You'll
+ * notice we purposely do not use words like "red" or "blue", but
+ * instead have colors which represent an emotion or generic theme.
+ */
+.light, a.light {
+ color: #fff; }
+
+.light-bg {
+ background-color: #fff; }
+
+.light-border {
+ border-color: #ddd; }
+
+.stable, a.stable {
+ color: #f8f8f8; }
+
+.stable-bg {
+ background-color: #f8f8f8; }
+
+.stable-border {
+ border-color: #b2b2b2; }
+
+.positive, a.positive {
+ color: #387ef5; }
+
+.positive-bg {
+ background-color: #387ef5; }
+
+.positive-border {
+ border-color: #0c60ee; }
+
+.calm, a.calm {
+ color: #11c1f3; }
+
+.calm-bg {
+ background-color: #11c1f3; }
+
+.calm-border {
+ border-color: #0a9dc7; }
+
+.assertive, a.assertive {
+ color: #ef473a; }
+
+.assertive-bg {
+ background-color: #ef473a; }
+
+.assertive-border {
+ border-color: #e42112; }
+
+.balanced, a.balanced {
+ color: #33cd5f; }
+
+.balanced-bg {
+ background-color: #33cd5f; }
+
+.balanced-border {
+ border-color: #28a54c; }
+
+.energized, a.energized {
+ color: #ffc900; }
+
+.energized-bg {
+ background-color: #ffc900; }
+
+.energized-border {
+ border-color: #e6b500; }
+
+.royal, a.royal {
+ color: #886aea; }
+
+.royal-bg {
+ background-color: #886aea; }
+
+.royal-border {
+ border-color: #6b46e5; }
+
+.dark, a.dark {
+ color: #444; }
+
+.dark-bg {
+ background-color: #444; }
+
+.dark-border {
+ border-color: #111; }
+
+[collection-repeat] {
+ /* Position is set by transforms */
+ left: 0 !important;
+ top: 0 !important;
+ position: absolute !important;
+ z-index: 1; }
+
+.collection-repeat-container {
+ position: relative;
+ z-index: 1; }
+
+.collection-repeat-after-container {
+ z-index: 0;
+ display: block;
+ /* when scrolling horizontally, make sure the after container doesn't take up 100% width */ }
+ .collection-repeat-after-container.horizontal {
+ display: inline-block; }
+
+[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak,
+.x-ng-cloak, .ng-hide:not(.ng-hide-animate) {
+ display: none !important; }
+
+/**
+ * Platform
+ * --------------------------------------------------
+ * Platform specific tweaks
+ */
+.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader) {
+ height: 64px; }
+ .platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader).item-input-inset .item-input-wrapper {
+ margin-top: 19px !important; }
+ .platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader) > * {
+ margin-top: 20px; }
+
+.platform-ios.platform-cordova:not(.fullscreen) .tabs-top > .tabs,
+.platform-ios.platform-cordova:not(.fullscreen) .tabs.tabs-top {
+ top: 64px; }
+
+.platform-ios.platform-cordova:not(.fullscreen) .has-header,
+.platform-ios.platform-cordova:not(.fullscreen) .bar-subheader {
+ top: 64px; }
+
+.platform-ios.platform-cordova:not(.fullscreen) .has-subheader {
+ top: 108px; }
+
+.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-tabs-top {
+ top: 113px; }
+
+.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-subheader.has-tabs-top {
+ top: 157px; }
+
+.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader) {
+ height: 44px; }
+ .platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader).item-input-inset .item-input-wrapper {
+ margin-top: -1px; }
+ .platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader) > * {
+ margin-top: 0; }
+
+.platform-ios.platform-cordova .popover .has-header,
+.platform-ios.platform-cordova .popover .bar-subheader {
+ top: 44px; }
+
+.platform-ios.platform-cordova .popover .has-subheader {
+ top: 88px; }
+
+.platform-ios.platform-cordova.status-bar-hide {
+ margin-bottom: 20px; }
+
+@media (orientation: landscape) {
+ .platform-ios.platform-browser.platform-ipad {
+ position: fixed; } }
+
+.platform-c:not(.enable-transitions) * {
+ -webkit-transition: none !important;
+ transition: none !important; }
+
+.slide-in-up {
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0); }
+
+.slide-in-up.ng-enter,
+.slide-in-up > .ng-enter {
+ -webkit-transition: all cubic-bezier(0.1, 0.7, 0.1, 1) 400ms;
+ transition: all cubic-bezier(0.1, 0.7, 0.1, 1) 400ms; }
+
+.slide-in-up.ng-enter-active,
+.slide-in-up > .ng-enter-active {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0); }
+
+.slide-in-up.ng-leave,
+.slide-in-up > .ng-leave {
+ -webkit-transition: all ease-in-out 250ms;
+ transition: all ease-in-out 250ms; }
+
+@-webkit-keyframes scaleOut {
+ from {
+ -webkit-transform: scale(1);
+ opacity: 1; }
+ to {
+ -webkit-transform: scale(0.8);
+ opacity: 0; } }
+
+@keyframes scaleOut {
+ from {
+ transform: scale(1);
+ opacity: 1; }
+ to {
+ transform: scale(0.8);
+ opacity: 0; } }
+
+@-webkit-keyframes superScaleIn {
+ from {
+ -webkit-transform: scale(1.2);
+ opacity: 0; }
+ to {
+ -webkit-transform: scale(1);
+ opacity: 1; } }
+
+@keyframes superScaleIn {
+ from {
+ transform: scale(1.2);
+ opacity: 0; }
+ to {
+ transform: scale(1);
+ opacity: 1; } }
+
+[nav-view-transition="ios"] [nav-view="entering"],
+[nav-view-transition="ios"] [nav-view="leaving"] {
+ -webkit-transition-duration: 500ms;
+ transition-duration: 500ms;
+ -webkit-transition-timing-function: cubic-bezier(0.36, 0.66, 0.04, 1);
+ transition-timing-function: cubic-bezier(0.36, 0.66, 0.04, 1);
+ -webkit-transition-property: opacity, -webkit-transform, box-shadow;
+ transition-property: opacity, transform, box-shadow; }
+
+[nav-view-transition="ios"][nav-view-direction="forward"], [nav-view-transition="ios"][nav-view-direction="back"] {
+ background-color: #000; }
+
+[nav-view-transition="ios"] [nav-view="active"],
+[nav-view-transition="ios"][nav-view-direction="forward"] [nav-view="entering"],
+[nav-view-transition="ios"][nav-view-direction="back"] [nav-view="leaving"] {
+ z-index: 3; }
+
+[nav-view-transition="ios"][nav-view-direction="back"] [nav-view="entering"],
+[nav-view-transition="ios"][nav-view-direction="forward"] [nav-view="leaving"] {
+ z-index: 2; }
+
+[nav-bar-transition="ios"] .title,
+[nav-bar-transition="ios"] .buttons,
+[nav-bar-transition="ios"] .back-text {
+ -webkit-transition-duration: 500ms;
+ transition-duration: 500ms;
+ -webkit-transition-timing-function: cubic-bezier(0.36, 0.66, 0.04, 1);
+ transition-timing-function: cubic-bezier(0.36, 0.66, 0.04, 1);
+ -webkit-transition-property: opacity, -webkit-transform;
+ transition-property: opacity, transform; }
+
+[nav-bar-transition="ios"] [nav-bar="active"],
+[nav-bar-transition="ios"] [nav-bar="entering"] {
+ z-index: 10; }
+ [nav-bar-transition="ios"] [nav-bar="active"] .bar,
+ [nav-bar-transition="ios"] [nav-bar="entering"] .bar {
+ background: transparent; }
+
+[nav-bar-transition="ios"] [nav-bar="cached"] {
+ display: block; }
+ [nav-bar-transition="ios"] [nav-bar="cached"] .header-item {
+ display: none; }
+
+[nav-view-transition="android"] [nav-view="entering"],
+[nav-view-transition="android"] [nav-view="leaving"] {
+ -webkit-transition-duration: 200ms;
+ transition-duration: 200ms;
+ -webkit-transition-timing-function: cubic-bezier(0.4, 0.6, 0.2, 1);
+ transition-timing-function: cubic-bezier(0.4, 0.6, 0.2, 1);
+ -webkit-transition-property: -webkit-transform;
+ transition-property: transform; }
+
+[nav-view-transition="android"] [nav-view="active"],
+[nav-view-transition="android"][nav-view-direction="forward"] [nav-view="entering"],
+[nav-view-transition="android"][nav-view-direction="back"] [nav-view="leaving"] {
+ z-index: 3; }
+
+[nav-view-transition="android"][nav-view-direction="back"] [nav-view="entering"],
+[nav-view-transition="android"][nav-view-direction="forward"] [nav-view="leaving"] {
+ z-index: 2; }
+
+[nav-bar-transition="android"] .title,
+[nav-bar-transition="android"] .buttons {
+ -webkit-transition-duration: 200ms;
+ transition-duration: 200ms;
+ -webkit-transition-timing-function: cubic-bezier(0.4, 0.6, 0.2, 1);
+ transition-timing-function: cubic-bezier(0.4, 0.6, 0.2, 1);
+ -webkit-transition-property: opacity;
+ transition-property: opacity; }
+
+[nav-bar-transition="android"] [nav-bar="active"],
+[nav-bar-transition="android"] [nav-bar="entering"] {
+ z-index: 10; }
+ [nav-bar-transition="android"] [nav-bar="active"] .bar,
+ [nav-bar-transition="android"] [nav-bar="entering"] .bar {
+ background: transparent; }
+
+[nav-bar-transition="android"] [nav-bar="cached"] {
+ display: block; }
+ [nav-bar-transition="android"] [nav-bar="cached"] .header-item {
+ display: none; }
+
+[nav-swipe="fast"] [nav-view],
+[nav-swipe="fast"] .title,
+[nav-swipe="fast"] .buttons,
+[nav-swipe="fast"] .back-text {
+ -webkit-transition-duration: 50ms;
+ transition-duration: 50ms;
+ -webkit-transition-timing-function: linear;
+ transition-timing-function: linear; }
+
+[nav-swipe="slow"] [nav-view],
+[nav-swipe="slow"] .title,
+[nav-swipe="slow"] .buttons,
+[nav-swipe="slow"] .back-text {
+ -webkit-transition-duration: 160ms;
+ transition-duration: 160ms;
+ -webkit-transition-timing-function: linear;
+ transition-timing-function: linear; }
+
+[nav-view="cached"],
+[nav-bar="cached"] {
+ display: none; }
+
+[nav-view="stage"] {
+ opacity: 0;
+ -webkit-transition-duration: 0;
+ transition-duration: 0; }
+
+[nav-bar="stage"] .title,
+[nav-bar="stage"] .buttons,
+[nav-bar="stage"] .back-text {
+ position: absolute;
+ opacity: 0;
+ -webkit-transition-duration: 0s;
+ transition-duration: 0s; }
diff --git a/www/lib/ionic/css/ionic.min.css b/www/lib/ionic/css/ionic.min.css
new file mode 100644
index 0000000..5dddf27
--- /dev/null
+++ b/www/lib/ionic/css/ionic.min.css
@@ -0,0 +1,23 @@
+@charset "UTF-8";/*!
+ * Copyright 2015 Drifty Co.
+ * http://drifty.com/
+ *
+ * Ionic, v1.3.1
+ * A powerful HTML5 mobile app framework.
+ * http://ionicframework.com/
+ *
+ * By @maxlynch, @benjsperry, @adamdbradley <3
+ *
+ * Licensed under the MIT license. Please see LICENSE for more information.
+ *
+ *//*!
+ Ionicons, v2.0.1
+ Created by Ben Sperry for the Ionic Framework, http://ionicons.com/
+ https://twitter.com/benjsperry https://twitter.com/ionicframework
+ MIT License: https://github.com/driftyco/ionicons
+
+ Android-style icons originally built by Google’s
+ Material Design Icons: https://github.com/google/material-design-icons
+ used under CC BY http://creativecommons.org/licenses/by/4.0/
+ Modified icons to fit ionicon’s grid from original.
+*/@font-face{font-family:Ionicons;src:url(../fonts/ionicons.eot?v=2.0.1);src:url(../fonts/ionicons.eot?v=2.0.1#iefix) format("embedded-opentype"),url(../fonts/ionicons.ttf?v=2.0.1) format("truetype"),url(../fonts/ionicons.woff?v=2.0.1) format("woff"),url(../fonts/ionicons.woff) format("woff"),url(../fonts/ionicons.svg?v=2.0.1#Ionicons) format("svg");font-weight:400;font-style:normal}.ion,.ion-alert-circled:before,.ion-alert:before,.ion-android-add-circle:before,.ion-android-add:before,.ion-android-alarm-clock:before,.ion-android-alert:before,.ion-android-apps:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down:before,.ion-android-arrow-dropdown-circle:before,.ion-android-arrow-dropdown:before,.ion-android-arrow-dropleft-circle:before,.ion-android-arrow-dropleft:before,.ion-android-arrow-dropright-circle:before,.ion-android-arrow-dropright:before,.ion-android-arrow-dropup-circle:before,.ion-android-arrow-dropup:before,.ion-android-arrow-forward:before,.ion-android-arrow-up:before,.ion-android-attach:before,.ion-android-bar:before,.ion-android-bicycle:before,.ion-android-boat:before,.ion-android-bookmark:before,.ion-android-bulb:before,.ion-android-bus:before,.ion-android-calendar:before,.ion-android-call:before,.ion-android-camera:before,.ion-android-cancel:before,.ion-android-car:before,.ion-android-cart:before,.ion-android-chat:before,.ion-android-checkbox-blank:before,.ion-android-checkbox-outline-blank:before,.ion-android-checkbox-outline:before,.ion-android-checkbox:before,.ion-android-checkmark-circle:before,.ion-android-clipboard:before,.ion-android-close:before,.ion-android-cloud-circle:before,.ion-android-cloud-done:before,.ion-android-cloud-outline:before,.ion-android-cloud:before,.ion-android-color-palette:before,.ion-android-compass:before,.ion-android-contact:before,.ion-android-contacts:before,.ion-android-contract:before,.ion-android-create:before,.ion-android-delete:before,.ion-android-desktop:before,.ion-android-document:before,.ion-android-done-all:before,.ion-android-done:before,.ion-android-download:before,.ion-android-drafts:before,.ion-android-exit:before,.ion-android-expand:before,.ion-android-favorite-outline:before,.ion-android-favorite:before,.ion-android-film:before,.ion-android-folder-open:before,.ion-android-folder:before,.ion-android-funnel:before,.ion-android-globe:before,.ion-android-hand:before,.ion-android-hangout:before,.ion-android-happy:before,.ion-android-home:before,.ion-android-image:before,.ion-android-laptop:before,.ion-android-list:before,.ion-android-locate:before,.ion-android-lock:before,.ion-android-mail:before,.ion-android-map:before,.ion-android-menu:before,.ion-android-microphone-off:before,.ion-android-microphone:before,.ion-android-more-horizontal:before,.ion-android-more-vertical:before,.ion-android-navigate:before,.ion-android-notifications-none:before,.ion-android-notifications-off:before,.ion-android-notifications:before,.ion-android-open:before,.ion-android-options:before,.ion-android-people:before,.ion-android-person-add:before,.ion-android-person:before,.ion-android-phone-landscape:before,.ion-android-phone-portrait:before,.ion-android-pin:before,.ion-android-plane:before,.ion-android-playstore:before,.ion-android-print:before,.ion-android-radio-button-off:before,.ion-android-radio-button-on:before,.ion-android-refresh:before,.ion-android-remove-circle:before,.ion-android-remove:before,.ion-android-restaurant:before,.ion-android-sad:before,.ion-android-search:before,.ion-android-send:before,.ion-android-settings:before,.ion-android-share-alt:before,.ion-android-share:before,.ion-android-star-half:before,.ion-android-star-outline:before,.ion-android-star:before,.ion-android-stopwatch:before,.ion-android-subway:before,.ion-android-sunny:before,.ion-android-sync:before,.ion-android-textsms:before,.ion-android-time:before,.ion-android-train:before,.ion-android-unlock:before,.ion-android-upload:before,.ion-android-volume-down:before,.ion-android-volume-mute:before,.ion-android-volume-off:before,.ion-android-volume-up:before,.ion-android-walk:before,.ion-android-warning:before,.ion-android-watch:before,.ion-android-wifi:before,.ion-aperture:before,.ion-archive:before,.ion-arrow-down-a:before,.ion-arrow-down-b:before,.ion-arrow-down-c:before,.ion-arrow-expand:before,.ion-arrow-graph-down-left:before,.ion-arrow-graph-down-right:before,.ion-arrow-graph-up-left:before,.ion-arrow-graph-up-right:before,.ion-arrow-left-a:before,.ion-arrow-left-b:before,.ion-arrow-left-c:before,.ion-arrow-move:before,.ion-arrow-resize:before,.ion-arrow-return-left:before,.ion-arrow-return-right:before,.ion-arrow-right-a:before,.ion-arrow-right-b:before,.ion-arrow-right-c:before,.ion-arrow-shrink:before,.ion-arrow-swap:before,.ion-arrow-up-a:before,.ion-arrow-up-b:before,.ion-arrow-up-c:before,.ion-asterisk:before,.ion-at:before,.ion-backspace-outline:before,.ion-backspace:before,.ion-bag:before,.ion-battery-charging:before,.ion-battery-empty:before,.ion-battery-full:before,.ion-battery-half:before,.ion-battery-low:before,.ion-beaker:before,.ion-beer:before,.ion-bluetooth:before,.ion-bonfire:before,.ion-bookmark:before,.ion-bowtie:before,.ion-briefcase:before,.ion-bug:before,.ion-calculator:before,.ion-calendar:before,.ion-camera:before,.ion-card:before,.ion-cash:before,.ion-chatbox-working:before,.ion-chatbox:before,.ion-chatboxes:before,.ion-chatbubble-working:before,.ion-chatbubble:before,.ion-chatbubbles:before,.ion-checkmark-circled:before,.ion-checkmark-round:before,.ion-checkmark:before,.ion-chevron-down:before,.ion-chevron-left:before,.ion-chevron-right:before,.ion-chevron-up:before,.ion-clipboard:before,.ion-clock:before,.ion-close-circled:before,.ion-close-round:before,.ion-close:before,.ion-closed-captioning:before,.ion-cloud:before,.ion-code-download:before,.ion-code-working:before,.ion-code:before,.ion-coffee:before,.ion-compass:before,.ion-compose:before,.ion-connection-bars:before,.ion-contrast:before,.ion-crop:before,.ion-cube:before,.ion-disc:before,.ion-document-text:before,.ion-document:before,.ion-drag:before,.ion-earth:before,.ion-easel:before,.ion-edit:before,.ion-egg:before,.ion-eject:before,.ion-email-unread:before,.ion-email:before,.ion-erlenmeyer-flask-bubbles:before,.ion-erlenmeyer-flask:before,.ion-eye-disabled:before,.ion-eye:before,.ion-female:before,.ion-filing:before,.ion-film-marker:before,.ion-fireball:before,.ion-flag:before,.ion-flame:before,.ion-flash-off:before,.ion-flash:before,.ion-folder:before,.ion-fork-repo:before,.ion-fork:before,.ion-forward:before,.ion-funnel:before,.ion-gear-a:before,.ion-gear-b:before,.ion-grid:before,.ion-hammer:before,.ion-happy-outline:before,.ion-happy:before,.ion-headphone:before,.ion-heart-broken:before,.ion-heart:before,.ion-help-buoy:before,.ion-help-circled:before,.ion-help:before,.ion-home:before,.ion-icecream:before,.ion-image:before,.ion-images:before,.ion-information-circled:before,.ion-information:before,.ion-ionic:before,.ion-ios-alarm-outline:before,.ion-ios-alarm:before,.ion-ios-albums-outline:before,.ion-ios-albums:before,.ion-ios-americanfootball-outline:before,.ion-ios-americanfootball:before,.ion-ios-analytics-outline:before,.ion-ios-analytics:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-left:before,.ion-ios-arrow-right:before,.ion-ios-arrow-thin-down:before,.ion-ios-arrow-thin-left:before,.ion-ios-arrow-thin-right:before,.ion-ios-arrow-thin-up:before,.ion-ios-arrow-up:before,.ion-ios-at-outline:before,.ion-ios-at:before,.ion-ios-barcode-outline:before,.ion-ios-barcode:before,.ion-ios-baseball-outline:before,.ion-ios-baseball:before,.ion-ios-basketball-outline:before,.ion-ios-basketball:before,.ion-ios-bell-outline:before,.ion-ios-bell:before,.ion-ios-body-outline:before,.ion-ios-body:before,.ion-ios-bolt-outline:before,.ion-ios-bolt:before,.ion-ios-book-outline:before,.ion-ios-book:before,.ion-ios-bookmarks-outline:before,.ion-ios-bookmarks:before,.ion-ios-box-outline:before,.ion-ios-box:before,.ion-ios-briefcase-outline:before,.ion-ios-briefcase:before,.ion-ios-browsers-outline:before,.ion-ios-browsers:before,.ion-ios-calculator-outline:before,.ion-ios-calculator:before,.ion-ios-calendar-outline:before,.ion-ios-calendar:before,.ion-ios-camera-outline:before,.ion-ios-camera:before,.ion-ios-cart-outline:before,.ion-ios-cart:before,.ion-ios-chatboxes-outline:before,.ion-ios-chatboxes:before,.ion-ios-chatbubble-outline:before,.ion-ios-chatbubble:before,.ion-ios-checkmark-empty:before,.ion-ios-checkmark-outline:before,.ion-ios-checkmark:before,.ion-ios-circle-filled:before,.ion-ios-circle-outline:before,.ion-ios-clock-outline:before,.ion-ios-clock:before,.ion-ios-close-empty:before,.ion-ios-close-outline:before,.ion-ios-close:before,.ion-ios-cloud-download-outline:before,.ion-ios-cloud-download:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloud:before,.ion-ios-cloudy-night-outline:before,.ion-ios-cloudy-night:before,.ion-ios-cloudy-outline:before,.ion-ios-cloudy:before,.ion-ios-cog-outline:before,.ion-ios-cog:before,.ion-ios-color-filter-outline:before,.ion-ios-color-filter:before,.ion-ios-color-wand-outline:before,.ion-ios-color-wand:before,.ion-ios-compose-outline:before,.ion-ios-compose:before,.ion-ios-contact-outline:before,.ion-ios-contact:before,.ion-ios-copy-outline:before,.ion-ios-copy:before,.ion-ios-crop-strong:before,.ion-ios-crop:before,.ion-ios-download-outline:before,.ion-ios-download:before,.ion-ios-drag:before,.ion-ios-email-outline:before,.ion-ios-email:before,.ion-ios-eye-outline:before,.ion-ios-eye:before,.ion-ios-fastforward-outline:before,.ion-ios-fastforward:before,.ion-ios-filing-outline:before,.ion-ios-filing:before,.ion-ios-film-outline:before,.ion-ios-film:before,.ion-ios-flag-outline:before,.ion-ios-flag:before,.ion-ios-flame-outline:before,.ion-ios-flame:before,.ion-ios-flask-outline:before,.ion-ios-flask:before,.ion-ios-flower-outline:before,.ion-ios-flower:before,.ion-ios-folder-outline:before,.ion-ios-folder:before,.ion-ios-football-outline:before,.ion-ios-football:before,.ion-ios-game-controller-a-outline:before,.ion-ios-game-controller-a:before,.ion-ios-game-controller-b-outline:before,.ion-ios-game-controller-b:before,.ion-ios-gear-outline:before,.ion-ios-gear:before,.ion-ios-glasses-outline:before,.ion-ios-glasses:before,.ion-ios-grid-view-outline:before,.ion-ios-grid-view:before,.ion-ios-heart-outline:before,.ion-ios-heart:before,.ion-ios-help-empty:before,.ion-ios-help-outline:before,.ion-ios-help:before,.ion-ios-home-outline:before,.ion-ios-home:before,.ion-ios-infinite-outline:before,.ion-ios-infinite:before,.ion-ios-information-empty:before,.ion-ios-information-outline:before,.ion-ios-information:before,.ion-ios-ionic-outline:before,.ion-ios-keypad-outline:before,.ion-ios-keypad:before,.ion-ios-lightbulb-outline:before,.ion-ios-lightbulb:before,.ion-ios-list-outline:before,.ion-ios-list:before,.ion-ios-location-outline:before,.ion-ios-location:before,.ion-ios-locked-outline:before,.ion-ios-locked:before,.ion-ios-loop-strong:before,.ion-ios-loop:before,.ion-ios-medical-outline:before,.ion-ios-medical:before,.ion-ios-medkit-outline:before,.ion-ios-medkit:before,.ion-ios-mic-off:before,.ion-ios-mic-outline:before,.ion-ios-mic:before,.ion-ios-minus-empty:before,.ion-ios-minus-outline:before,.ion-ios-minus:before,.ion-ios-monitor-outline:before,.ion-ios-monitor:before,.ion-ios-moon-outline:before,.ion-ios-moon:before,.ion-ios-more-outline:before,.ion-ios-more:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate-outline:before,.ion-ios-navigate:before,.ion-ios-nutrition-outline:before,.ion-ios-nutrition:before,.ion-ios-paper-outline:before,.ion-ios-paper:before,.ion-ios-paperplane-outline:before,.ion-ios-paperplane:before,.ion-ios-partlysunny-outline:before,.ion-ios-partlysunny:before,.ion-ios-pause-outline:before,.ion-ios-pause:before,.ion-ios-paw-outline:before,.ion-ios-paw:before,.ion-ios-people-outline:before,.ion-ios-people:before,.ion-ios-person-outline:before,.ion-ios-person:before,.ion-ios-personadd-outline:before,.ion-ios-personadd:before,.ion-ios-photos-outline:before,.ion-ios-photos:before,.ion-ios-pie-outline:before,.ion-ios-pie:before,.ion-ios-pint-outline:before,.ion-ios-pint:before,.ion-ios-play-outline:before,.ion-ios-play:before,.ion-ios-plus-empty:before,.ion-ios-plus-outline:before,.ion-ios-plus:before,.ion-ios-pricetag-outline:before,.ion-ios-pricetag:before,.ion-ios-pricetags-outline:before,.ion-ios-pricetags:before,.ion-ios-printer-outline:before,.ion-ios-printer:before,.ion-ios-pulse-strong:before,.ion-ios-pulse:before,.ion-ios-rainy-outline:before,.ion-ios-rainy:before,.ion-ios-recording-outline:before,.ion-ios-recording:before,.ion-ios-redo-outline:before,.ion-ios-redo:before,.ion-ios-refresh-empty:before,.ion-ios-refresh-outline:before,.ion-ios-refresh:before,.ion-ios-reload:before,.ion-ios-reverse-camera-outline:before,.ion-ios-reverse-camera:before,.ion-ios-rewind-outline:before,.ion-ios-rewind:before,.ion-ios-rose-outline:before,.ion-ios-rose:before,.ion-ios-search-strong:before,.ion-ios-search:before,.ion-ios-settings-strong:before,.ion-ios-settings:before,.ion-ios-shuffle-strong:before,.ion-ios-shuffle:before,.ion-ios-skipbackward-outline:before,.ion-ios-skipbackward:before,.ion-ios-skipforward-outline:before,.ion-ios-skipforward:before,.ion-ios-snowy:before,.ion-ios-speedometer-outline:before,.ion-ios-speedometer:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-star:before,.ion-ios-stopwatch-outline:before,.ion-ios-stopwatch:before,.ion-ios-sunny-outline:before,.ion-ios-sunny:before,.ion-ios-telephone-outline:before,.ion-ios-telephone:before,.ion-ios-tennisball-outline:before,.ion-ios-tennisball:before,.ion-ios-thunderstorm-outline:before,.ion-ios-thunderstorm:before,.ion-ios-time-outline:before,.ion-ios-time:before,.ion-ios-timer-outline:before,.ion-ios-timer:before,.ion-ios-toggle-outline:before,.ion-ios-toggle:before,.ion-ios-trash-outline:before,.ion-ios-trash:before,.ion-ios-undo-outline:before,.ion-ios-undo:before,.ion-ios-unlocked-outline:before,.ion-ios-unlocked:before,.ion-ios-upload-outline:before,.ion-ios-upload:before,.ion-ios-videocam-outline:before,.ion-ios-videocam:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-wineglass-outline:before,.ion-ios-wineglass:before,.ion-ios-world-outline:before,.ion-ios-world:before,.ion-ipad:before,.ion-iphone:before,.ion-ipod:before,.ion-jet:before,.ion-key:before,.ion-knife:before,.ion-laptop:before,.ion-leaf:before,.ion-levels:before,.ion-lightbulb:before,.ion-link:before,.ion-load-a:before,.ion-load-b:before,.ion-load-c:before,.ion-load-d:before,.ion-location:before,.ion-lock-combination:before,.ion-locked:before,.ion-log-in:before,.ion-log-out:before,.ion-loop:before,.ion-magnet:before,.ion-male:before,.ion-man:before,.ion-map:before,.ion-medkit:before,.ion-merge:before,.ion-mic-a:before,.ion-mic-b:before,.ion-mic-c:before,.ion-minus-circled:before,.ion-minus-round:before,.ion-minus:before,.ion-model-s:before,.ion-monitor:before,.ion-more:before,.ion-mouse:before,.ion-music-note:before,.ion-navicon-round:before,.ion-navicon:before,.ion-navigate:before,.ion-network:before,.ion-no-smoking:before,.ion-nuclear:before,.ion-outlet:before,.ion-paintbrush:before,.ion-paintbucket:before,.ion-paper-airplane:before,.ion-paperclip:before,.ion-pause:before,.ion-person-add:before,.ion-person-stalker:before,.ion-person:before,.ion-pie-graph:before,.ion-pin:before,.ion-pinpoint:before,.ion-pizza:before,.ion-plane:before,.ion-planet:before,.ion-play:before,.ion-playstation:before,.ion-plus-circled:before,.ion-plus-round:before,.ion-plus:before,.ion-podium:before,.ion-pound:before,.ion-power:before,.ion-pricetag:before,.ion-pricetags:before,.ion-printer:before,.ion-pull-request:before,.ion-qr-scanner:before,.ion-quote:before,.ion-radio-waves:before,.ion-record:before,.ion-refresh:before,.ion-reply-all:before,.ion-reply:before,.ion-ribbon-a:before,.ion-ribbon-b:before,.ion-sad-outline:before,.ion-sad:before,.ion-scissors:before,.ion-search:before,.ion-settings:before,.ion-share:before,.ion-shuffle:before,.ion-skip-backward:before,.ion-skip-forward:before,.ion-social-android-outline:before,.ion-social-android:before,.ion-social-angular-outline:before,.ion-social-angular:before,.ion-social-apple-outline:before,.ion-social-apple:before,.ion-social-bitcoin-outline:before,.ion-social-bitcoin:before,.ion-social-buffer-outline:before,.ion-social-buffer:before,.ion-social-chrome-outline:before,.ion-social-chrome:before,.ion-social-codepen-outline:before,.ion-social-codepen:before,.ion-social-css3-outline:before,.ion-social-css3:before,.ion-social-designernews-outline:before,.ion-social-designernews:before,.ion-social-dribbble-outline:before,.ion-social-dribbble:before,.ion-social-dropbox-outline:before,.ion-social-dropbox:before,.ion-social-euro-outline:before,.ion-social-euro:before,.ion-social-facebook-outline:before,.ion-social-facebook:before,.ion-social-foursquare-outline:before,.ion-social-foursquare:before,.ion-social-freebsd-devil:before,.ion-social-github-outline:before,.ion-social-github:before,.ion-social-google-outline:before,.ion-social-google:before,.ion-social-googleplus-outline:before,.ion-social-googleplus:before,.ion-social-hackernews-outline:before,.ion-social-hackernews:before,.ion-social-html5-outline:before,.ion-social-html5:before,.ion-social-instagram-outline:before,.ion-social-instagram:before,.ion-social-javascript-outline:before,.ion-social-javascript:before,.ion-social-linkedin-outline:before,.ion-social-linkedin:before,.ion-social-markdown:before,.ion-social-nodejs:before,.ion-social-octocat:before,.ion-social-pinterest-outline:before,.ion-social-pinterest:before,.ion-social-python:before,.ion-social-reddit-outline:before,.ion-social-reddit:before,.ion-social-rss-outline:before,.ion-social-rss:before,.ion-social-sass:before,.ion-social-skype-outline:before,.ion-social-skype:before,.ion-social-snapchat-outline:before,.ion-social-snapchat:before,.ion-social-tumblr-outline:before,.ion-social-tumblr:before,.ion-social-tux:before,.ion-social-twitch-outline:before,.ion-social-twitch:before,.ion-social-twitter-outline:before,.ion-social-twitter:before,.ion-social-usd-outline:before,.ion-social-usd:before,.ion-social-vimeo-outline:before,.ion-social-vimeo:before,.ion-social-whatsapp-outline:before,.ion-social-whatsapp:before,.ion-social-windows-outline:before,.ion-social-windows:before,.ion-social-wordpress-outline:before,.ion-social-wordpress:before,.ion-social-yahoo-outline:before,.ion-social-yahoo:before,.ion-social-yen-outline:before,.ion-social-yen:before,.ion-social-youtube-outline:before,.ion-social-youtube:before,.ion-soup-can-outline:before,.ion-soup-can:before,.ion-speakerphone:before,.ion-speedometer:before,.ion-spoon:before,.ion-star:before,.ion-stats-bars:before,.ion-steam:before,.ion-stop:before,.ion-thermometer:before,.ion-thumbsdown:before,.ion-thumbsup:before,.ion-toggle-filled:before,.ion-toggle:before,.ion-transgender:before,.ion-trash-a:before,.ion-trash-b:before,.ion-trophy:before,.ion-tshirt-outline:before,.ion-tshirt:before,.ion-umbrella:before,.ion-university:before,.ion-unlocked:before,.ion-upload:before,.ion-usb:before,.ion-videocamera:before,.ion-volume-high:before,.ion-volume-low:before,.ion-volume-medium:before,.ion-volume-mute:before,.ion-wand:before,.ion-waterdrop:before,.ion-wifi:before,.ion-wineglass:before,.ion-woman:before,.ion-wrench:before,.ion-xbox:before,.ionicons{display:inline-block;font-family:Ionicons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-alert:before{content:""}.ion-alert-circled:before{content:""}.ion-android-add:before{content:""}.ion-android-add-circle:before{content:""}.ion-android-alarm-clock:before{content:""}.ion-android-alert:before{content:""}.ion-android-apps:before{content:""}.ion-android-archive:before{content:""}.ion-android-arrow-back:before{content:""}.ion-android-arrow-down:before{content:""}.ion-android-arrow-dropdown:before{content:""}.ion-android-arrow-dropdown-circle:before{content:""}.ion-android-arrow-dropleft:before{content:""}.ion-android-arrow-dropleft-circle:before{content:""}.ion-android-arrow-dropright:before{content:""}.ion-android-arrow-dropright-circle:before{content:""}.ion-android-arrow-dropup:before{content:""}.ion-android-arrow-dropup-circle:before{content:""}.ion-android-arrow-forward:before{content:""}.ion-android-arrow-up:before{content:""}.ion-android-attach:before{content:""}.ion-android-bar:before{content:""}.ion-android-bicycle:before{content:""}.ion-android-boat:before{content:""}.ion-android-bookmark:before{content:""}.ion-android-bulb:before{content:""}.ion-android-bus:before{content:""}.ion-android-calendar:before{content:""}.ion-android-call:before{content:""}.ion-android-camera:before{content:""}.ion-android-cancel:before{content:""}.ion-android-car:before{content:""}.ion-android-cart:before{content:""}.ion-android-chat:before{content:""}.ion-android-checkbox:before{content:""}.ion-android-checkbox-blank:before{content:""}.ion-android-checkbox-outline:before{content:""}.ion-android-checkbox-outline-blank:before{content:""}.ion-android-checkmark-circle:before{content:""}.ion-android-clipboard:before{content:""}.ion-android-close:before{content:""}.ion-android-cloud:before{content:""}.ion-android-cloud-circle:before{content:""}.ion-android-cloud-done:before{content:""}.ion-android-cloud-outline:before{content:""}.ion-android-color-palette:before{content:""}.ion-android-compass:before{content:""}.ion-android-contact:before{content:""}.ion-android-contacts:before{content:""}.ion-android-contract:before{content:""}.ion-android-create:before{content:""}.ion-android-delete:before{content:""}.ion-android-desktop:before{content:""}.ion-android-document:before{content:""}.ion-android-done:before{content:""}.ion-android-done-all:before{content:""}.ion-android-download:before{content:""}.ion-android-drafts:before{content:""}.ion-android-exit:before{content:""}.ion-android-expand:before{content:""}.ion-android-favorite:before{content:""}.ion-android-favorite-outline:before{content:""}.ion-android-film:before{content:""}.ion-android-folder:before{content:""}.ion-android-folder-open:before{content:""}.ion-android-funnel:before{content:""}.ion-android-globe:before{content:""}.ion-android-hand:before{content:""}.ion-android-hangout:before{content:""}.ion-android-happy:before{content:""}.ion-android-home:before{content:""}.ion-android-image:before{content:""}.ion-android-laptop:before{content:""}.ion-android-list:before{content:""}.ion-android-locate:before{content:""}.ion-android-lock:before{content:""}.ion-android-mail:before{content:""}.ion-android-map:before{content:""}.ion-android-menu:before{content:""}.ion-android-microphone:before{content:""}.ion-android-microphone-off:before{content:""}.ion-android-more-horizontal:before{content:""}.ion-android-more-vertical:before{content:""}.ion-android-navigate:before{content:""}.ion-android-notifications:before{content:""}.ion-android-notifications-none:before{content:""}.ion-android-notifications-off:before{content:""}.ion-android-open:before{content:""}.ion-android-options:before{content:""}.ion-android-people:before{content:""}.ion-android-person:before{content:""}.ion-android-person-add:before{content:""}.ion-android-phone-landscape:before{content:""}.ion-android-phone-portrait:before{content:""}.ion-android-pin:before{content:""}.ion-android-plane:before{content:""}.ion-android-playstore:before{content:""}.ion-android-print:before{content:""}.ion-android-radio-button-off:before{content:""}.ion-android-radio-button-on:before{content:""}.ion-android-refresh:before{content:""}.ion-android-remove:before{content:""}.ion-android-remove-circle:before{content:""}.ion-android-restaurant:before{content:""}.ion-android-sad:before{content:""}.ion-android-search:before{content:""}.ion-android-send:before{content:""}.ion-android-settings:before{content:""}.ion-android-share:before{content:""}.ion-android-share-alt:before{content:""}.ion-android-star:before{content:""}.ion-android-star-half:before{content:""}.ion-android-star-outline:before{content:""}.ion-android-stopwatch:before{content:""}.ion-android-subway:before{content:""}.ion-android-sunny:before{content:""}.ion-android-sync:before{content:""}.ion-android-textsms:before{content:""}.ion-android-time:before{content:""}.ion-android-train:before{content:""}.ion-android-unlock:before{content:""}.ion-android-upload:before{content:""}.ion-android-volume-down:before{content:""}.ion-android-volume-mute:before{content:""}.ion-android-volume-off:before{content:""}.ion-android-volume-up:before{content:""}.ion-android-walk:before{content:""}.ion-android-warning:before{content:""}.ion-android-watch:before{content:""}.ion-android-wifi:before{content:""}.ion-aperture:before{content:""}.ion-archive:before{content:""}.ion-arrow-down-a:before{content:""}.ion-arrow-down-b:before{content:""}.ion-arrow-down-c:before{content:""}.ion-arrow-expand:before{content:""}.ion-arrow-graph-down-left:before{content:""}.ion-arrow-graph-down-right:before{content:""}.ion-arrow-graph-up-left:before{content:""}.ion-arrow-graph-up-right:before{content:""}.ion-arrow-left-a:before{content:""}.ion-arrow-left-b:before{content:""}.ion-arrow-left-c:before{content:""}.ion-arrow-move:before{content:""}.ion-arrow-resize:before{content:""}.ion-arrow-return-left:before{content:""}.ion-arrow-return-right:before{content:""}.ion-arrow-right-a:before{content:""}.ion-arrow-right-b:before{content:""}.ion-arrow-right-c:before{content:""}.ion-arrow-shrink:before{content:""}.ion-arrow-swap:before{content:""}.ion-arrow-up-a:before{content:""}.ion-arrow-up-b:before{content:""}.ion-arrow-up-c:before{content:""}.ion-asterisk:before{content:""}.ion-at:before{content:""}.ion-backspace:before{content:""}.ion-backspace-outline:before{content:""}.ion-bag:before{content:""}.ion-battery-charging:before{content:""}.ion-battery-empty:before{content:""}.ion-battery-full:before{content:""}.ion-battery-half:before{content:""}.ion-battery-low:before{content:""}.ion-beaker:before{content:""}.ion-beer:before{content:""}.ion-bluetooth:before{content:""}.ion-bonfire:before{content:""}.ion-bookmark:before{content:""}.ion-bowtie:before{content:""}.ion-briefcase:before{content:""}.ion-bug:before{content:""}.ion-calculator:before{content:""}.ion-calendar:before{content:""}.ion-camera:before{content:""}.ion-card:before{content:""}.ion-cash:before{content:""}.ion-chatbox:before{content:""}.ion-chatbox-working:before{content:""}.ion-chatboxes:before{content:""}.ion-chatbubble:before{content:""}.ion-chatbubble-working:before{content:""}.ion-chatbubbles:before{content:""}.ion-checkmark:before{content:""}.ion-checkmark-circled:before{content:""}.ion-checkmark-round:before{content:""}.ion-chevron-down:before{content:""}.ion-chevron-left:before{content:""}.ion-chevron-right:before{content:""}.ion-chevron-up:before{content:""}.ion-clipboard:before{content:""}.ion-clock:before{content:""}.ion-close:before{content:""}.ion-close-circled:before{content:""}.ion-close-round:before{content:""}.ion-closed-captioning:before{content:""}.ion-cloud:before{content:""}.ion-code:before{content:""}.ion-code-download:before{content:""}.ion-code-working:before{content:""}.ion-coffee:before{content:""}.ion-compass:before{content:""}.ion-compose:before{content:""}.ion-connection-bars:before{content:""}.ion-contrast:before{content:""}.ion-crop:before{content:""}.ion-cube:before{content:""}.ion-disc:before{content:""}.ion-document:before{content:""}.ion-document-text:before{content:""}.ion-drag:before{content:""}.ion-earth:before{content:""}.ion-easel:before{content:""}.ion-edit:before{content:""}.ion-egg:before{content:""}.ion-eject:before{content:""}.ion-email:before{content:""}.ion-email-unread:before{content:""}.ion-erlenmeyer-flask:before{content:""}.ion-erlenmeyer-flask-bubbles:before{content:""}.ion-eye:before{content:""}.ion-eye-disabled:before{content:""}.ion-female:before{content:""}.ion-filing:before{content:""}.ion-film-marker:before{content:""}.ion-fireball:before{content:""}.ion-flag:before{content:""}.ion-flame:before{content:""}.ion-flash:before{content:""}.ion-flash-off:before{content:""}.ion-folder:before{content:""}.ion-fork:before{content:""}.ion-fork-repo:before{content:""}.ion-forward:before{content:""}.ion-funnel:before{content:""}.ion-gear-a:before{content:""}.ion-gear-b:before{content:""}.ion-grid:before{content:""}.ion-hammer:before{content:""}.ion-happy:before{content:""}.ion-happy-outline:before{content:""}.ion-headphone:before{content:""}.ion-heart:before{content:""}.ion-heart-broken:before{content:""}.ion-help:before{content:""}.ion-help-buoy:before{content:""}.ion-help-circled:before{content:""}.ion-home:before{content:""}.ion-icecream:before{content:""}.ion-image:before{content:""}.ion-images:before{content:""}.ion-information:before{content:""}.ion-information-circled:before{content:""}.ion-ionic:before{content:""}.ion-ios-alarm:before{content:""}.ion-ios-alarm-outline:before{content:""}.ion-ios-albums:before{content:""}.ion-ios-albums-outline:before{content:""}.ion-ios-americanfootball:before{content:""}.ion-ios-americanfootball-outline:before{content:""}.ion-ios-analytics:before{content:""}.ion-ios-analytics-outline:before{content:""}.ion-ios-arrow-back:before{content:""}.ion-ios-arrow-down:before{content:""}.ion-ios-arrow-forward:before{content:""}.ion-ios-arrow-left:before{content:""}.ion-ios-arrow-right:before{content:""}.ion-ios-arrow-thin-down:before{content:""}.ion-ios-arrow-thin-left:before{content:""}.ion-ios-arrow-thin-right:before{content:""}.ion-ios-arrow-thin-up:before{content:""}.ion-ios-arrow-up:before{content:""}.ion-ios-at:before{content:""}.ion-ios-at-outline:before{content:""}.ion-ios-barcode:before{content:""}.ion-ios-barcode-outline:before{content:""}.ion-ios-baseball:before{content:""}.ion-ios-baseball-outline:before{content:""}.ion-ios-basketball:before{content:""}.ion-ios-basketball-outline:before{content:""}.ion-ios-bell:before{content:""}.ion-ios-bell-outline:before{content:""}.ion-ios-body:before{content:""}.ion-ios-body-outline:before{content:""}.ion-ios-bolt:before{content:""}.ion-ios-bolt-outline:before{content:""}.ion-ios-book:before{content:""}.ion-ios-book-outline:before{content:""}.ion-ios-bookmarks:before{content:""}.ion-ios-bookmarks-outline:before{content:""}.ion-ios-box:before{content:""}.ion-ios-box-outline:before{content:""}.ion-ios-briefcase:before{content:""}.ion-ios-briefcase-outline:before{content:""}.ion-ios-browsers:before{content:""}.ion-ios-browsers-outline:before{content:""}.ion-ios-calculator:before{content:""}.ion-ios-calculator-outline:before{content:""}.ion-ios-calendar:before{content:""}.ion-ios-calendar-outline:before{content:""}.ion-ios-camera:before{content:""}.ion-ios-camera-outline:before{content:""}.ion-ios-cart:before{content:""}.ion-ios-cart-outline:before{content:""}.ion-ios-chatboxes:before{content:""}.ion-ios-chatboxes-outline:before{content:""}.ion-ios-chatbubble:before{content:""}.ion-ios-chatbubble-outline:before{content:""}.ion-ios-checkmark:before{content:""}.ion-ios-checkmark-empty:before{content:""}.ion-ios-checkmark-outline:before{content:""}.ion-ios-circle-filled:before{content:""}.ion-ios-circle-outline:before{content:""}.ion-ios-clock:before{content:""}.ion-ios-clock-outline:before{content:""}.ion-ios-close:before{content:""}.ion-ios-close-empty:before{content:""}.ion-ios-close-outline:before{content:""}.ion-ios-cloud:before{content:""}.ion-ios-cloud-download:before{content:""}.ion-ios-cloud-download-outline:before{content:""}.ion-ios-cloud-outline:before{content:""}.ion-ios-cloud-upload:before{content:""}.ion-ios-cloud-upload-outline:before{content:""}.ion-ios-cloudy:before{content:""}.ion-ios-cloudy-night:before{content:""}.ion-ios-cloudy-night-outline:before{content:""}.ion-ios-cloudy-outline:before{content:""}.ion-ios-cog:before{content:""}.ion-ios-cog-outline:before{content:""}.ion-ios-color-filter:before{content:""}.ion-ios-color-filter-outline:before{content:""}.ion-ios-color-wand:before{content:""}.ion-ios-color-wand-outline:before{content:""}.ion-ios-compose:before{content:""}.ion-ios-compose-outline:before{content:""}.ion-ios-contact:before{content:""}.ion-ios-contact-outline:before{content:""}.ion-ios-copy:before{content:""}.ion-ios-copy-outline:before{content:""}.ion-ios-crop:before{content:""}.ion-ios-crop-strong:before{content:""}.ion-ios-download:before{content:""}.ion-ios-download-outline:before{content:""}.ion-ios-drag:before{content:""}.ion-ios-email:before{content:""}.ion-ios-email-outline:before{content:""}.ion-ios-eye:before{content:""}.ion-ios-eye-outline:before{content:""}.ion-ios-fastforward:before{content:""}.ion-ios-fastforward-outline:before{content:""}.ion-ios-filing:before{content:""}.ion-ios-filing-outline:before{content:""}.ion-ios-film:before{content:""}.ion-ios-film-outline:before{content:""}.ion-ios-flag:before{content:""}.ion-ios-flag-outline:before{content:""}.ion-ios-flame:before{content:""}.ion-ios-flame-outline:before{content:""}.ion-ios-flask:before{content:""}.ion-ios-flask-outline:before{content:""}.ion-ios-flower:before{content:""}.ion-ios-flower-outline:before{content:""}.ion-ios-folder:before{content:""}.ion-ios-folder-outline:before{content:""}.ion-ios-football:before{content:""}.ion-ios-football-outline:before{content:""}.ion-ios-game-controller-a:before{content:""}.ion-ios-game-controller-a-outline:before{content:""}.ion-ios-game-controller-b:before{content:""}.ion-ios-game-controller-b-outline:before{content:""}.ion-ios-gear:before{content:""}.ion-ios-gear-outline:before{content:""}.ion-ios-glasses:before{content:""}.ion-ios-glasses-outline:before{content:""}.ion-ios-grid-view:before{content:""}.ion-ios-grid-view-outline:before{content:""}.ion-ios-heart:before{content:""}.ion-ios-heart-outline:before{content:""}.ion-ios-help:before{content:""}.ion-ios-help-empty:before{content:""}.ion-ios-help-outline:before{content:""}.ion-ios-home:before{content:""}.ion-ios-home-outline:before{content:""}.ion-ios-infinite:before{content:""}.ion-ios-infinite-outline:before{content:""}.ion-ios-information:before{content:""}.ion-ios-information-empty:before{content:""}.ion-ios-information-outline:before{content:""}.ion-ios-ionic-outline:before{content:""}.ion-ios-keypad:before{content:""}.ion-ios-keypad-outline:before{content:""}.ion-ios-lightbulb:before{content:""}.ion-ios-lightbulb-outline:before{content:""}.ion-ios-list:before{content:""}.ion-ios-list-outline:before{content:""}.ion-ios-location:before{content:""}.ion-ios-location-outline:before{content:""}.ion-ios-locked:before{content:""}.ion-ios-locked-outline:before{content:""}.ion-ios-loop:before{content:""}.ion-ios-loop-strong:before{content:""}.ion-ios-medical:before{content:""}.ion-ios-medical-outline:before{content:""}.ion-ios-medkit:before{content:""}.ion-ios-medkit-outline:before{content:""}.ion-ios-mic:before{content:""}.ion-ios-mic-off:before{content:""}.ion-ios-mic-outline:before{content:""}.ion-ios-minus:before{content:""}.ion-ios-minus-empty:before{content:""}.ion-ios-minus-outline:before{content:""}.ion-ios-monitor:before{content:""}.ion-ios-monitor-outline:before{content:""}.ion-ios-moon:before{content:""}.ion-ios-moon-outline:before{content:""}.ion-ios-more:before{content:""}.ion-ios-more-outline:before{content:""}.ion-ios-musical-note:before{content:""}.ion-ios-musical-notes:before{content:""}.ion-ios-navigate:before{content:""}.ion-ios-navigate-outline:before{content:""}.ion-ios-nutrition:before{content:""}.ion-ios-nutrition-outline:before{content:""}.ion-ios-paper:before{content:""}.ion-ios-paper-outline:before{content:""}.ion-ios-paperplane:before{content:""}.ion-ios-paperplane-outline:before{content:""}.ion-ios-partlysunny:before{content:""}.ion-ios-partlysunny-outline:before{content:""}.ion-ios-pause:before{content:""}.ion-ios-pause-outline:before{content:""}.ion-ios-paw:before{content:""}.ion-ios-paw-outline:before{content:""}.ion-ios-people:before{content:""}.ion-ios-people-outline:before{content:""}.ion-ios-person:before{content:""}.ion-ios-person-outline:before{content:""}.ion-ios-personadd:before{content:""}.ion-ios-personadd-outline:before{content:""}.ion-ios-photos:before{content:""}.ion-ios-photos-outline:before{content:""}.ion-ios-pie:before{content:""}.ion-ios-pie-outline:before{content:""}.ion-ios-pint:before{content:""}.ion-ios-pint-outline:before{content:""}.ion-ios-play:before{content:""}.ion-ios-play-outline:before{content:""}.ion-ios-plus:before{content:""}.ion-ios-plus-empty:before{content:""}.ion-ios-plus-outline:before{content:""}.ion-ios-pricetag:before{content:""}.ion-ios-pricetag-outline:before{content:""}.ion-ios-pricetags:before{content:""}.ion-ios-pricetags-outline:before{content:""}.ion-ios-printer:before{content:""}.ion-ios-printer-outline:before{content:""}.ion-ios-pulse:before{content:""}.ion-ios-pulse-strong:before{content:""}.ion-ios-rainy:before{content:""}.ion-ios-rainy-outline:before{content:""}.ion-ios-recording:before{content:""}.ion-ios-recording-outline:before{content:""}.ion-ios-redo:before{content:""}.ion-ios-redo-outline:before{content:""}.ion-ios-refresh:before{content:""}.ion-ios-refresh-empty:before{content:""}.ion-ios-refresh-outline:before{content:""}.ion-ios-reload:before{content:""}.ion-ios-reverse-camera:before{content:""}.ion-ios-reverse-camera-outline:before{content:""}.ion-ios-rewind:before{content:""}.ion-ios-rewind-outline:before{content:""}.ion-ios-rose:before{content:""}.ion-ios-rose-outline:before{content:""}.ion-ios-search:before{content:""}.ion-ios-search-strong:before{content:""}.ion-ios-settings:before{content:""}.ion-ios-settings-strong:before{content:""}.ion-ios-shuffle:before{content:""}.ion-ios-shuffle-strong:before{content:""}.ion-ios-skipbackward:before{content:""}.ion-ios-skipbackward-outline:before{content:""}.ion-ios-skipforward:before{content:""}.ion-ios-skipforward-outline:before{content:""}.ion-ios-snowy:before{content:""}.ion-ios-speedometer:before{content:""}.ion-ios-speedometer-outline:before{content:""}.ion-ios-star:before{content:""}.ion-ios-star-half:before{content:""}.ion-ios-star-outline:before{content:""}.ion-ios-stopwatch:before{content:""}.ion-ios-stopwatch-outline:before{content:""}.ion-ios-sunny:before{content:""}.ion-ios-sunny-outline:before{content:""}.ion-ios-telephone:before{content:""}.ion-ios-telephone-outline:before{content:""}.ion-ios-tennisball:before{content:""}.ion-ios-tennisball-outline:before{content:""}.ion-ios-thunderstorm:before{content:""}.ion-ios-thunderstorm-outline:before{content:""}.ion-ios-time:before{content:""}.ion-ios-time-outline:before{content:""}.ion-ios-timer:before{content:""}.ion-ios-timer-outline:before{content:""}.ion-ios-toggle:before{content:""}.ion-ios-toggle-outline:before{content:""}.ion-ios-trash:before{content:""}.ion-ios-trash-outline:before{content:""}.ion-ios-undo:before{content:""}.ion-ios-undo-outline:before{content:""}.ion-ios-unlocked:before{content:""}.ion-ios-unlocked-outline:before{content:""}.ion-ios-upload:before{content:""}.ion-ios-upload-outline:before{content:""}.ion-ios-videocam:before{content:""}.ion-ios-videocam-outline:before{content:""}.ion-ios-volume-high:before{content:""}.ion-ios-volume-low:before{content:""}.ion-ios-wineglass:before{content:""}.ion-ios-wineglass-outline:before{content:""}.ion-ios-world:before{content:""}.ion-ios-world-outline:before{content:""}.ion-ipad:before{content:""}.ion-iphone:before{content:""}.ion-ipod:before{content:""}.ion-jet:before{content:""}.ion-key:before{content:""}.ion-knife:before{content:""}.ion-laptop:before{content:""}.ion-leaf:before{content:""}.ion-levels:before{content:""}.ion-lightbulb:before{content:""}.ion-link:before{content:""}.ion-load-a:before{content:""}.ion-load-b:before{content:""}.ion-load-c:before{content:""}.ion-load-d:before{content:""}.ion-location:before{content:""}.ion-lock-combination:before{content:""}.ion-locked:before{content:""}.ion-log-in:before{content:""}.ion-log-out:before{content:""}.ion-loop:before{content:""}.ion-magnet:before{content:""}.ion-male:before{content:""}.ion-man:before{content:""}.ion-map:before{content:""}.ion-medkit:before{content:""}.ion-merge:before{content:""}.ion-mic-a:before{content:""}.ion-mic-b:before{content:""}.ion-mic-c:before{content:""}.ion-minus:before{content:""}.ion-minus-circled:before{content:""}.ion-minus-round:before{content:""}.ion-model-s:before{content:""}.ion-monitor:before{content:""}.ion-more:before{content:""}.ion-mouse:before{content:""}.ion-music-note:before{content:""}.ion-navicon:before{content:""}.ion-navicon-round:before{content:""}.ion-navigate:before{content:""}.ion-network:before{content:""}.ion-no-smoking:before{content:""}.ion-nuclear:before{content:""}.ion-outlet:before{content:""}.ion-paintbrush:before{content:""}.ion-paintbucket:before{content:""}.ion-paper-airplane:before{content:""}.ion-paperclip:before{content:""}.ion-pause:before{content:""}.ion-person:before{content:""}.ion-person-add:before{content:""}.ion-person-stalker:before{content:""}.ion-pie-graph:before{content:""}.ion-pin:before{content:""}.ion-pinpoint:before{content:""}.ion-pizza:before{content:""}.ion-plane:before{content:""}.ion-planet:before{content:""}.ion-play:before{content:""}.ion-playstation:before{content:""}.ion-plus:before{content:""}.ion-plus-circled:before{content:""}.ion-plus-round:before{content:""}.ion-podium:before{content:""}.ion-pound:before{content:""}.ion-power:before{content:""}.ion-pricetag:before{content:""}.ion-pricetags:before{content:""}.ion-printer:before{content:""}.ion-pull-request:before{content:""}.ion-qr-scanner:before{content:""}.ion-quote:before{content:""}.ion-radio-waves:before{content:""}.ion-record:before{content:""}.ion-refresh:before{content:""}.ion-reply:before{content:""}.ion-reply-all:before{content:""}.ion-ribbon-a:before{content:""}.ion-ribbon-b:before{content:""}.ion-sad:before{content:""}.ion-sad-outline:before{content:""}.ion-scissors:before{content:""}.ion-search:before{content:""}.ion-settings:before{content:""}.ion-share:before{content:""}.ion-shuffle:before{content:""}.ion-skip-backward:before{content:""}.ion-skip-forward:before{content:""}.ion-social-android:before{content:""}.ion-social-android-outline:before{content:""}.ion-social-angular:before{content:""}.ion-social-angular-outline:before{content:""}.ion-social-apple:before{content:""}.ion-social-apple-outline:before{content:""}.ion-social-bitcoin:before{content:""}.ion-social-bitcoin-outline:before{content:""}.ion-social-buffer:before{content:""}.ion-social-buffer-outline:before{content:""}.ion-social-chrome:before{content:""}.ion-social-chrome-outline:before{content:""}.ion-social-codepen:before{content:""}.ion-social-codepen-outline:before{content:""}.ion-social-css3:before{content:""}.ion-social-css3-outline:before{content:""}.ion-social-designernews:before{content:""}.ion-social-designernews-outline:before{content:""}.ion-social-dribbble:before{content:""}.ion-social-dribbble-outline:before{content:""}.ion-social-dropbox:before{content:""}.ion-social-dropbox-outline:before{content:""}.ion-social-euro:before{content:""}.ion-social-euro-outline:before{content:""}.ion-social-facebook:before{content:""}.ion-social-facebook-outline:before{content:""}.ion-social-foursquare:before{content:""}.ion-social-foursquare-outline:before{content:""}.ion-social-freebsd-devil:before{content:""}.ion-social-github:before{content:""}.ion-social-github-outline:before{content:""}.ion-social-google:before{content:""}.ion-social-google-outline:before{content:""}.ion-social-googleplus:before{content:""}.ion-social-googleplus-outline:before{content:""}.ion-social-hackernews:before{content:""}.ion-social-hackernews-outline:before{content:""}.ion-social-html5:before{content:""}.ion-social-html5-outline:before{content:""}.ion-social-instagram:before{content:""}.ion-social-instagram-outline:before{content:""}.ion-social-javascript:before{content:""}.ion-social-javascript-outline:before{content:""}.ion-social-linkedin:before{content:""}.ion-social-linkedin-outline:before{content:""}.ion-social-markdown:before{content:""}.ion-social-nodejs:before{content:""}.ion-social-octocat:before{content:""}.ion-social-pinterest:before{content:""}.ion-social-pinterest-outline:before{content:""}.ion-social-python:before{content:""}.ion-social-reddit:before{content:""}.ion-social-reddit-outline:before{content:""}.ion-social-rss:before{content:""}.ion-social-rss-outline:before{content:""}.ion-social-sass:before{content:""}.ion-social-skype:before{content:""}.ion-social-skype-outline:before{content:""}.ion-social-snapchat:before{content:""}.ion-social-snapchat-outline:before{content:""}.ion-social-tumblr:before{content:""}.ion-social-tumblr-outline:before{content:""}.ion-social-tux:before{content:""}.ion-social-twitch:before{content:""}.ion-social-twitch-outline:before{content:""}.ion-social-twitter:before{content:""}.ion-social-twitter-outline:before{content:""}.ion-social-usd:before{content:""}.ion-social-usd-outline:before{content:""}.ion-social-vimeo:before{content:""}.ion-social-vimeo-outline:before{content:""}.ion-social-whatsapp:before{content:""}.ion-social-whatsapp-outline:before{content:""}.ion-social-windows:before{content:""}.ion-social-windows-outline:before{content:""}.ion-social-wordpress:before{content:""}.ion-social-wordpress-outline:before{content:""}.ion-social-yahoo:before{content:""}.ion-social-yahoo-outline:before{content:""}.ion-social-yen:before{content:""}.ion-social-yen-outline:before{content:""}.ion-social-youtube:before{content:""}.ion-social-youtube-outline:before{content:""}.ion-soup-can:before{content:""}.ion-soup-can-outline:before{content:""}.ion-speakerphone:before{content:""}.ion-speedometer:before{content:""}.ion-spoon:before{content:""}.ion-star:before{content:""}.ion-stats-bars:before{content:""}.ion-steam:before{content:""}.ion-stop:before{content:""}.ion-thermometer:before{content:""}.ion-thumbsdown:before{content:""}.ion-thumbsup:before{content:""}.ion-toggle:before{content:""}.ion-toggle-filled:before{content:""}.ion-transgender:before{content:""}.ion-trash-a:before{content:""}.ion-trash-b:before{content:""}.ion-trophy:before{content:""}.ion-tshirt:before{content:""}.ion-tshirt-outline:before{content:""}.ion-umbrella:before{content:""}.ion-university:before{content:""}.ion-unlocked:before{content:""}.ion-upload:before{content:""}.ion-usb:before{content:""}.ion-videocamera:before{content:""}.ion-volume-high:before{content:""}.ion-volume-low:before{content:""}.ion-volume-medium:before{content:""}.ion-volume-mute:before{content:""}.ion-wand:before{content:""}.ion-waterdrop:before{content:""}.ion-wifi:before{content:""}.ion-wineglass:before{content:""}.ion-woman:before{content:""}.ion-wrench:before{content:""}.ion-xbox:before{content:""}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;vertical-align:baseline;font:inherit;font-size:100%}ol,ul{list-style:none}blockquote,q{quotes:none}audio:not([controls]){display:none;height:0}[hidden],template{display:none}script{display:none!important}html{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}:focus,a,a:active,a:focus,a:hover,button,button:focus{outline:0}a{-webkit-user-drag:none;-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent}a[href]:hover{cursor:pointer}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}code,kbd,pre,samp{font-size:1em;font-family:monospace,serif}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}sub,sup{position:relative;vertical-align:baseline;font-size:75%;line-height:0}sup{top:-.5em}sub{bottom:-.25em}fieldset{margin:0 2px;padding:.35em .625em .75em;border:1px solid silver}button,input,select,textarea{margin:0;outline-offset:0;outline-style:none;outline-width:0;-webkit-font-smoothing:inherit;background-image:none}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto}img{-webkit-user-drag:none}table{border-spacing:0;border-collapse:collapse}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{overflow:hidden;-ms-touch-action:pan-y;touch-action:pan-y}.ionic-body,body{-webkit-touch-callout:none;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0;padding:0;color:#000;word-wrap:break-word;font-size:14px;font-family:-apple-system;font-family:"-apple-system","Helvetica Neue",Roboto,"Segoe UI",sans-serif;line-height:20px;text-rendering:optimizeLegibility;-webkit-backface-visibility:hidden;-webkit-user-drag:none;-ms-content-zooming:none}body.grade-b,body.grade-c{text-rendering:auto}.content{position:relative}.scroll-content{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;margin-top:-1px;padding-top:1px;margin-bottom:-1px;width:auto;height:auto}.menu .scroll-content.scroll-content-false{z-index:11}.scroll-view{position:relative;display:block;overflow:hidden;margin-top:-1px}.scroll-view.overflow-scroll{position:relative}.scroll-view.scroll-x{overflow-x:scroll;overflow-y:hidden}.scroll-view.scroll-y{overflow-x:hidden;overflow-y:scroll}.scroll-view.scroll-xy{overflow-x:scroll;overflow-y:scroll}.scroll{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-transform-origin:left top;transform-origin:left top}@-ms-viewport{width:device-width}.scroll-bar{position:absolute;z-index:9999}.ng-animate .scroll-bar{visibility:hidden}.scroll-bar-h{right:2px;bottom:3px;left:2px;height:3px}.scroll-bar-h .scroll-bar-indicator{height:100%}.scroll-bar-v{top:2px;right:3px;bottom:2px;width:3px}.scroll-bar-v .scroll-bar-indicator{width:100%}.scroll-bar-indicator{position:absolute;border-radius:4px;background:rgba(0,0,0,.3);opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.scroll-bar-indicator.scroll-bar-fade-out{opacity:0}.platform-android .scroll-bar-indicator{border-radius:0}.grade-b .scroll-bar-indicator,.grade-c .scroll-bar-indicator{background:#aaa}.grade-b .scroll-bar-indicator.scroll-bar-fade-out,.grade-c .scroll-bar-indicator.scroll-bar-fade-out{-webkit-transition:none;transition:none}ion-infinite-scroll{height:60px;width:100%;display:block;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:row;-moz-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}ion-infinite-scroll .icon{font-size:30px;color:#666}ion-infinite-scroll:not(.active) .icon:before,ion-infinite-scroll:not(.active) .spinner{display:none}.overflow-scroll{overflow-x:hidden;overflow-y:scroll;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;top:0;right:0;bottom:0;left:0;position:absolute}.overflow-scroll.pane{overflow-x:hidden;overflow-y:scroll}.overflow-scroll .scroll{position:static;height:100%;-webkit-transform:translate3d(0,0,0)}.has-header{top:44px}.no-header{top:0}.has-subheader{top:88px}.has-tabs-top{top:93px}.has-header.has-subheader.has-tabs-top{top:137px}.has-footer{bottom:44px}.has-subfooter{bottom:88px}.bar-footer.has-tabs,.has-tabs{bottom:49px}.bar-footer.has-tabs.pane,.has-tabs.pane{bottom:49px;height:auto}.bar-subfooter.has-tabs,.has-footer.has-tabs{bottom:93px}.pane{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-duration:0;transition-duration:0;z-index:1}.view{z-index:1}.pane,.view{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;background-color:#fff;overflow:hidden}.view-container{position:absolute;display:block;width:100%;height:100%}p{margin:0 0 10px}small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:#000;font-weight:500;font-family:"-apple-system","Helvetica Neue",Roboto,"Segoe UI",sans-serif;line-height:1.2}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400;line-height:1}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1:first-child,.h2:first-child,.h3:first-child,h1:first-child,h2:first-child,h3:first-child{margin-top:0}.h1+.h1,.h1+.h2,.h1+.h3,.h1+h1,.h1+h2,.h1+h3,.h2+.h1,.h2+.h2,.h2+.h3,.h2+h1,.h2+h2,.h2+h3,.h3+.h1,.h3+.h2,.h3+.h3,.h3+h1,.h3+h2,.h3+h3,h1+.h1,h1+.h2,h1+.h3,h1+h1,h1+h2,h1+h3,h2+.h1,h2+.h2,h2+.h3,h2+h1,h2+h2,h2+h3,h3+.h1,h3+.h2,h3+.h3,h3+h1,h3+h2,h3+h3{margin-top:10px}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}.h1 small,h1 small{font-size:24px}.h2 small,h2 small{font-size:18px}.h3 small,.h4 small,h3 small,h4 small{font-size:14px}dl{margin-bottom:20px}dd,dt{line-height:1.42857}dt{font-weight:700}blockquote{margin:0 0 20px;padding:10px 20px;border-left:5px solid gray}blockquote p{font-weight:300;font-size:17.5px;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.42857}blockquote small:before{content:'\2014 \00A0'}blockquote:after,blockquote:before,q:after,q:before{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:1.42857}a{color:#387ef5}a.subdued{padding-right:10px;color:#888;text-decoration:none}a.subdued:hover{text-decoration:none}a.subdued:last-child{padding-right:0}.action-sheet-backdrop{-webkit-transition:background-color 150ms ease-in-out;transition:background-color 150ms ease-in-out;position:fixed;top:0;left:0;z-index:11;width:100%;height:100%;background-color:transparent}.action-sheet-backdrop.active{background-color:rgba(0,0,0,.4)}.action-sheet-wrapper{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-transition:all cubic-bezier(.36,.66,.04,1) 500ms;transition:all cubic-bezier(.36,.66,.04,1) 500ms;position:absolute;bottom:0;left:0;right:0;width:100%;max-width:500px;margin:auto}.action-sheet-up{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.action-sheet{margin-left:8px;margin-right:8px;width:auto;z-index:11;overflow:hidden}.action-sheet .button{display:block;padding:1px;width:100%;border-radius:0;border-color:#d1d3d6;background-color:transparent;color:#007aff;font-size:21px}.action-sheet .button:hover{color:#007aff}.action-sheet .button.destructive,.action-sheet .button.destructive:hover{color:#ff3b30}.action-sheet .button.activated,.action-sheet .button.active{box-shadow:none;border-color:#d1d3d6;color:#007aff;background:#e4e5e7}.action-sheet-has-icons .icon{position:absolute;left:16px}.action-sheet-title{padding:16px;color:#8f8f8f;text-align:center;font-size:13px}.action-sheet-group{margin-bottom:8px;border-radius:4px;background-color:#fff;overflow:hidden}.action-sheet-group .button{border-width:1px 0 0 0}.action-sheet-group .button:first-child:last-child{border-width:0}.action-sheet-options{background:#f1f2f3}.action-sheet-cancel .button{font-weight:500}.action-sheet-open,.action-sheet-open.modal-open .modal{pointer-events:none}.action-sheet-open .action-sheet-backdrop{pointer-events:auto}.platform-android .action-sheet-backdrop.active{background-color:rgba(0,0,0,.2)}.platform-android .action-sheet{margin:0}.platform-android .action-sheet .action-sheet-title,.platform-android .action-sheet .button{text-align:left;border-color:transparent;font-size:16px;color:inherit}.platform-android .action-sheet .action-sheet-title{font-size:14px;padding:16px;color:#666}.platform-android .action-sheet .button.activated,.platform-android .action-sheet .button.active{background:#e8e8e8}.platform-android .action-sheet-group{margin:0;border-radius:0;background-color:#fafafa}.platform-android .action-sheet-cancel{display:none}.platform-android .action-sheet-has-icons .button{padding-left:56px}.backdrop{position:fixed;top:0;left:0;z-index:11;width:100%;height:100%;background-color:rgba(0,0,0,.4);visibility:hidden;opacity:0;-webkit-transition:.1s opacity linear;transition:.1s opacity linear}.backdrop.visible{visibility:visible}.backdrop.active{opacity:1}.bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;right:0;left:0;z-index:9;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:5px;width:100%;height:44px;border-width:0;border-style:solid;border-top:1px solid transparent;border-bottom:1px solid #ddd;background-color:#fff;background-size:0}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.bar{border:none;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);background-position:bottom;background-size:100% 1px;background-repeat:no-repeat}}.bar.bar-clear{border:none;background:0 0;color:#fff}.bar.bar-clear .button,.bar.bar-clear .title{color:#fff}.bar.item-input-inset .item-input-wrapper{margin-top:-1px}.bar.item-input-inset .item-input-wrapper input{padding-left:8px;width:94%;height:28px;background:0 0}.bar.bar-light{border-color:#ddd;background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);color:#444}.bar.bar-light .title{color:#444}.bar.bar-light.bar-footer{background-image:linear-gradient(180deg,#ddd,#ddd 50%,transparent 50%)}.bar.bar-stable{border-color:#b2b2b2;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444}.bar.bar-stable .title{color:#444}.bar.bar-stable.bar-footer{background-image:linear-gradient(180deg,#b2b2b2,#b2b2b2 50%,transparent 50%)}.bar.bar-positive{border-color:#0c60ee;background-color:#387ef5;background-image:linear-gradient(0deg,#0c60ee,#0c60ee 50%,transparent 50%);color:#fff}.bar.bar-positive .title{color:#fff}.bar.bar-positive.bar-footer{background-image:linear-gradient(180deg,#0c60ee,#0c60ee 50%,transparent 50%)}.bar.bar-calm{border-color:#0a9dc7;background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9dc7,#0a9dc7 50%,transparent 50%);color:#fff}.bar.bar-calm .title{color:#fff}.bar.bar-calm.bar-footer{background-image:linear-gradient(180deg,#0a9dc7,#0a9dc7 50%,transparent 50%)}.bar.bar-assertive{border-color:#e42112;background-color:#ef473a;background-image:linear-gradient(0deg,#e42112,#e42112 50%,transparent 50%);color:#fff}.bar.bar-assertive .title{color:#fff}.bar.bar-assertive.bar-footer{background-image:linear-gradient(180deg,#e42112,#e42112 50%,transparent 50%)}.bar.bar-balanced{border-color:#28a54c;background-color:#33cd5f;background-image:linear-gradient(0deg,#28a54c,#28a54c 50%,transparent 50%);color:#fff}.bar.bar-balanced .title{color:#fff}.bar.bar-balanced.bar-footer{background-image:linear-gradient(180deg,#28a54c,#28a54c 50%,transparent 50%)}.bar.bar-energized{border-color:#e6b500;background-color:#ffc900;background-image:linear-gradient(0deg,#e6b500,#e6b500 50%,transparent 50%);color:#fff}.bar.bar-energized .title{color:#fff}.bar.bar-energized.bar-footer{background-image:linear-gradient(180deg,#e6b500,#e6b500 50%,transparent 50%)}.bar.bar-royal{border-color:#6b46e5;background-color:#886aea;background-image:linear-gradient(0deg,#6b46e5,#6b46e5 50%,transparent 50%);color:#fff}.bar.bar-royal .title{color:#fff}.bar.bar-royal.bar-footer{background-image:linear-gradient(180deg,#6b46e5,#6b46e5 50%,transparent 50%)}.bar.bar-dark{border-color:#111;background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);color:#fff}.bar.bar-dark .title{color:#fff}.bar.bar-dark.bar-footer{background-image:linear-gradient(180deg,#111,#111 50%,transparent 50%)}.bar .title{display:block;position:absolute;top:0;right:0;left:0;z-index:0;overflow:hidden;margin:0 10px;min-width:30px;height:43px;text-align:center;text-overflow:ellipsis;white-space:nowrap;font-size:17px;font-weight:500;line-height:44px}.bar .title.title-left{text-align:left}.bar .title.title-right{text-align:right}.bar .title a{color:inherit}.bar .button,.bar button{z-index:1;padding:0 8px;min-width:initial;min-height:31px;font-weight:400;font-size:13px;line-height:32px}.bar .button .icon:before,.bar .button.button-icon:before,.bar .button.icon-left:before,.bar .button.icon-right:before,.bar .button.icon:before,.bar button .icon:before,.bar button.button-icon:before,.bar button.icon-left:before,.bar button.icon-right:before,.bar button.icon:before{padding-right:2px;padding-left:2px;font-size:20px;line-height:32px}.bar .button.button-icon,.bar button.button-icon{font-size:17px}.bar .button.button-icon .icon:before,.bar .button.button-icon.icon-left:before,.bar .button.button-icon.icon-right:before,.bar .button.button-icon:before,.bar button.button-icon .icon:before,.bar button.button-icon.icon-left:before,.bar button.button-icon.icon-right:before,.bar button.button-icon:before{vertical-align:top;font-size:32px;line-height:32px}.bar .button.button-clear,.bar button.button-clear{padding-right:2px;padding-left:2px;font-weight:300;font-size:17px}.bar .button.button-clear .icon:before,.bar .button.button-clear.icon-left:before,.bar .button.button-clear.icon-right:before,.bar .button.button-clear.icon:before,.bar button.button-clear .icon:before,.bar button.button-clear.icon-left:before,.bar button.button-clear.icon-right:before,.bar button.button-clear.icon:before{font-size:32px;line-height:32px}.bar .button.back-button,.bar button.back-button{display:block;margin-right:5px;padding:0;white-space:nowrap;font-weight:400}.bar .button.back-button.activated,.bar .button.back-button.active,.bar button.back-button.activated,.bar button.back-button.active{opacity:.2}.bar .button-bar>.button,.bar .buttons>.button{min-height:31px;line-height:32px}.bar .button+.button-bar,.bar .button-bar+.button{margin-left:5px}.bar .buttons,.bar .buttons.primary-buttons,.bar .buttons.secondary-buttons{display:inherit}.bar .buttons span{display:inline-block}.bar .buttons-left span{margin-right:5px;display:inherit}.bar .buttons-right span{margin-left:5px;display:inherit}.bar .buttons.pull-right,.bar .title+.button:last-child,.bar .title+.buttons,.bar>.button+.button:last-child,.bar>.button.pull-right{position:absolute;top:5px;right:5px;bottom:5px}.platform-android .nav-bar-has-subheader .bar{background-image:none}.platform-android .bar .back-button .icon:before{font-size:24px}.platform-android .bar .title{font-size:19px;line-height:44px}.bar-light .button{border-color:#ddd;background-color:#fff;color:#444}.bar-light .button:hover{color:#444;text-decoration:none}.bar-light .button.activated,.bar-light .button.active{border-color:#ccc;background-color:#fafafa}.bar-light .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444;font-size:17px}.bar-light .button.button-icon{border-color:transparent;background:0 0}.bar-stable .button{border-color:#b2b2b2;background-color:#f8f8f8;color:#444}.bar-stable .button:hover{color:#444;text-decoration:none}.bar-stable .button.activated,.bar-stable .button.active{border-color:#a2a2a2;background-color:#e5e5e5}.bar-stable .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444;font-size:17px}.bar-stable .button.button-icon{border-color:transparent;background:0 0}.bar-positive .button{border-color:#0c60ee;background-color:#387ef5;color:#fff}.bar-positive .button:hover{color:#fff;text-decoration:none}.bar-positive .button.activated,.bar-positive .button.active{border-color:#0c60ee;background-color:#0c60ee}.bar-positive .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-positive .button.button-icon{border-color:transparent;background:0 0}.bar-calm .button{border-color:#0a9dc7;background-color:#11c1f3;color:#fff}.bar-calm .button:hover{color:#fff;text-decoration:none}.bar-calm .button.activated,.bar-calm .button.active{border-color:#0a9dc7;background-color:#0a9dc7}.bar-calm .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-calm .button.button-icon{border-color:transparent;background:0 0}.bar-assertive .button{border-color:#e42112;background-color:#ef473a;color:#fff}.bar-assertive .button:hover{color:#fff;text-decoration:none}.bar-assertive .button.activated,.bar-assertive .button.active{border-color:#e42112;background-color:#e42112}.bar-assertive .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-assertive .button.button-icon{border-color:transparent;background:0 0}.bar-balanced .button{border-color:#28a54c;background-color:#33cd5f;color:#fff}.bar-balanced .button:hover{color:#fff;text-decoration:none}.bar-balanced .button.activated,.bar-balanced .button.active{border-color:#28a54c;background-color:#28a54c}.bar-balanced .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-balanced .button.button-icon{border-color:transparent;background:0 0}.bar-energized .button{border-color:#e6b500;background-color:#ffc900;color:#fff}.bar-energized .button:hover{color:#fff;text-decoration:none}.bar-energized .button.activated,.bar-energized .button.active{border-color:#e6b500;background-color:#e6b500}.bar-energized .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-energized .button.button-icon{border-color:transparent;background:0 0}.bar-royal .button{border-color:#6b46e5;background-color:#886aea;color:#fff}.bar-royal .button:hover{color:#fff;text-decoration:none}.bar-royal .button.activated,.bar-royal .button.active{border-color:#6b46e5;background-color:#6b46e5}.bar-royal .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-royal .button.button-icon{border-color:transparent;background:0 0}.bar-dark .button{border-color:#111;background-color:#444;color:#fff}.bar-dark .button:hover{color:#fff;text-decoration:none}.bar-dark .button.activated,.bar-dark .button.active{border-color:#000;background-color:#262626}.bar-dark .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-dark .button.button-icon{border-color:transparent;background:0 0}.bar-header{top:0;border-top-width:0;border-bottom-width:1px}.bar-header.has-tabs-top,.tabs-top .bar-header{border-bottom-width:0;background-image:none}.bar-footer{bottom:0;border-top-width:1px;border-bottom-width:0;background-position:top;height:44px}.bar-footer.item-input-inset{position:absolute}.bar-footer .title{height:43px;line-height:44px}.bar-tabs{padding:0}.bar-subheader{top:44px;height:44px}.bar-subheader .title{height:43px;line-height:44px}.bar-subfooter{bottom:44px;height:44px}.bar-subfooter .title{height:43px;line-height:44px}.nav-bar-block{position:absolute;top:0;right:0;left:0;z-index:9}.bar .back-button.hide,.bar .buttons .hide{display:none}.nav-bar-tabs-top .bar{background-image:none}.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:horizontal;-moz-flex-direction:horizontal;-ms-flex-direction:horizontal;flex-direction:horizontal;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);border-color:#b2b2b2;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444;position:absolute;bottom:0;z-index:5;width:100%;height:49px;border-style:solid;border-top-width:1px;background-size:0;line-height:49px}.tabs .tab-item .badge{background-color:#444;color:#f8f8f8}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.tabs{padding-top:2px;border-top:none!important;border-bottom:none;background-position:top;background-size:100% 1px;background-repeat:no-repeat}}.tabs-light>.tabs,.tabs.tabs-light{border-color:#ddd;background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);color:#444}.tabs-light>.tabs .tab-item .badge,.tabs.tabs-light .tab-item .badge{background-color:#444;color:#fff}.tabs-stable>.tabs,.tabs.tabs-stable{border-color:#b2b2b2;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444}.tabs-stable>.tabs .tab-item .badge,.tabs.tabs-stable .tab-item .badge{background-color:#444;color:#f8f8f8}.tabs-positive>.tabs,.tabs.tabs-positive{border-color:#0c60ee;background-color:#387ef5;background-image:linear-gradient(0deg,#0c60ee,#0c60ee 50%,transparent 50%);color:#fff}.tabs-positive>.tabs .tab-item .badge,.tabs.tabs-positive .tab-item .badge{background-color:#fff;color:#387ef5}.tabs-calm>.tabs,.tabs.tabs-calm{border-color:#0a9dc7;background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9dc7,#0a9dc7 50%,transparent 50%);color:#fff}.tabs-calm>.tabs .tab-item .badge,.tabs.tabs-calm .tab-item .badge{background-color:#fff;color:#11c1f3}.tabs-assertive>.tabs,.tabs.tabs-assertive{border-color:#e42112;background-color:#ef473a;background-image:linear-gradient(0deg,#e42112,#e42112 50%,transparent 50%);color:#fff}.tabs-assertive>.tabs .tab-item .badge,.tabs.tabs-assertive .tab-item .badge{background-color:#fff;color:#ef473a}.tabs-balanced>.tabs,.tabs.tabs-balanced{border-color:#28a54c;background-color:#33cd5f;background-image:linear-gradient(0deg,#28a54c,#28a54c 50%,transparent 50%);color:#fff}.tabs-balanced>.tabs .tab-item .badge,.tabs.tabs-balanced .tab-item .badge{background-color:#fff;color:#33cd5f}.tabs-energized>.tabs,.tabs.tabs-energized{border-color:#e6b500;background-color:#ffc900;background-image:linear-gradient(0deg,#e6b500,#e6b500 50%,transparent 50%);color:#fff}.tabs-energized>.tabs .tab-item .badge,.tabs.tabs-energized .tab-item .badge{background-color:#fff;color:#ffc900}.tabs-royal>.tabs,.tabs.tabs-royal{border-color:#6b46e5;background-color:#886aea;background-image:linear-gradient(0deg,#6b46e5,#6b46e5 50%,transparent 50%);color:#fff}.tabs-royal>.tabs .tab-item .badge,.tabs.tabs-royal .tab-item .badge{background-color:#fff;color:#886aea}.tabs-dark>.tabs,.tabs.tabs-dark{border-color:#111;background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);color:#fff}.tabs-dark>.tabs .tab-item .badge,.tabs.tabs-dark .tab-item .badge{background-color:#fff;color:#444}.tabs-striped .tabs{background-color:#fff;background-image:none;border:none;border-bottom:1px solid #ddd;padding-top:2px}.tabs-striped .tab-item.activated,.tabs-striped .tab-item.active,.tabs-striped .tab-item.tab-item-active{margin-top:-2px;border-style:solid;border-width:2px 0 0 0;border-color:#444}.tabs-striped .tab-item.activated .badge,.tabs-striped .tab-item.active .badge,.tabs-striped .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-light .tabs{background-color:#fff}.tabs-striped.tabs-light .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-striped.tabs-light .tab-item .badge{opacity:.4}.tabs-striped.tabs-light .tab-item.activated,.tabs-striped.tabs-light .tab-item.active,.tabs-striped.tabs-light .tab-item.tab-item-active{margin-top:-2px;color:#444;border-style:solid;border-width:2px 0 0 0;border-color:#444}.tabs-striped.tabs-stable .tabs{background-color:#f8f8f8}.tabs-striped.tabs-stable .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-striped.tabs-stable .tab-item .badge{opacity:.4}.tabs-striped.tabs-stable .tab-item.activated,.tabs-striped.tabs-stable .tab-item.active,.tabs-striped.tabs-stable .tab-item.tab-item-active{margin-top:-2px;color:#444;border-style:solid;border-width:2px 0 0 0;border-color:#444}.tabs-striped.tabs-positive .tabs{background-color:#387ef5}.tabs-striped.tabs-positive .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-positive .tab-item .badge{opacity:.4}.tabs-striped.tabs-positive .tab-item.activated,.tabs-striped.tabs-positive .tab-item.active,.tabs-striped.tabs-positive .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-calm .tabs{background-color:#11c1f3}.tabs-striped.tabs-calm .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-calm .tab-item .badge{opacity:.4}.tabs-striped.tabs-calm .tab-item.activated,.tabs-striped.tabs-calm .tab-item.active,.tabs-striped.tabs-calm .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-assertive .tabs{background-color:#ef473a}.tabs-striped.tabs-assertive .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-assertive .tab-item .badge{opacity:.4}.tabs-striped.tabs-assertive .tab-item.activated,.tabs-striped.tabs-assertive .tab-item.active,.tabs-striped.tabs-assertive .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-balanced .tabs{background-color:#33cd5f}.tabs-striped.tabs-balanced .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-balanced .tab-item .badge{opacity:.4}.tabs-striped.tabs-balanced .tab-item.activated,.tabs-striped.tabs-balanced .tab-item.active,.tabs-striped.tabs-balanced .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-energized .tabs{background-color:#ffc900}.tabs-striped.tabs-energized .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-energized .tab-item .badge{opacity:.4}.tabs-striped.tabs-energized .tab-item.activated,.tabs-striped.tabs-energized .tab-item.active,.tabs-striped.tabs-energized .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-royal .tabs{background-color:#886aea}.tabs-striped.tabs-royal .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-royal .tab-item .badge{opacity:.4}.tabs-striped.tabs-royal .tab-item.activated,.tabs-striped.tabs-royal .tab-item.active,.tabs-striped.tabs-royal .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-dark .tabs{background-color:#444}.tabs-striped.tabs-dark .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-dark .tab-item .badge{opacity:.4}.tabs-striped.tabs-dark .tab-item.activated,.tabs-striped.tabs-dark .tab-item.active,.tabs-striped.tabs-dark .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-top .tab-item.activated .badge,.tabs-striped.tabs-top .tab-item.active .badge,.tabs-striped.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-striped.tabs-background-light .tabs{background-color:#fff;background-image:none}.tabs-striped.tabs-background-stable .tabs{background-color:#f8f8f8;background-image:none}.tabs-striped.tabs-background-positive .tabs{background-color:#387ef5;background-image:none}.tabs-striped.tabs-background-calm .tabs{background-color:#11c1f3;background-image:none}.tabs-striped.tabs-background-assertive .tabs{background-color:#ef473a;background-image:none}.tabs-striped.tabs-background-balanced .tabs{background-color:#33cd5f;background-image:none}.tabs-striped.tabs-background-energized .tabs{background-color:#ffc900;background-image:none}.tabs-striped.tabs-background-royal .tabs{background-color:#886aea;background-image:none}.tabs-striped.tabs-background-dark .tabs{background-color:#444;background-image:none}.tabs-striped.tabs-color-light .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-color-light .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-light .tab-item.activated,.tabs-striped.tabs-color-light .tab-item.active,.tabs-striped.tabs-color-light .tab-item.tab-item-active{margin-top:-2px;color:#fff;border:0 solid #fff;border-top-width:2px}.tabs-striped.tabs-color-light .tab-item.activated .badge,.tabs-striped.tabs-color-light .tab-item.active .badge,.tabs-striped.tabs-color-light .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-stable .tab-item{color:rgba(248,248,248,.4);opacity:1}.tabs-striped.tabs-color-stable .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-stable .tab-item.activated,.tabs-striped.tabs-color-stable .tab-item.active,.tabs-striped.tabs-color-stable .tab-item.tab-item-active{margin-top:-2px;color:#f8f8f8;border:0 solid #f8f8f8;border-top-width:2px}.tabs-striped.tabs-color-stable .tab-item.activated .badge,.tabs-striped.tabs-color-stable .tab-item.active .badge,.tabs-striped.tabs-color-stable .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-positive .tab-item{color:rgba(56,126,245,.4);opacity:1}.tabs-striped.tabs-color-positive .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-positive .tab-item.activated,.tabs-striped.tabs-color-positive .tab-item.active,.tabs-striped.tabs-color-positive .tab-item.tab-item-active{margin-top:-2px;color:#387ef5;border:0 solid #387ef5;border-top-width:2px}.tabs-striped.tabs-color-positive .tab-item.activated .badge,.tabs-striped.tabs-color-positive .tab-item.active .badge,.tabs-striped.tabs-color-positive .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-calm .tab-item{color:rgba(17,193,243,.4);opacity:1}.tabs-striped.tabs-color-calm .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-calm .tab-item.activated,.tabs-striped.tabs-color-calm .tab-item.active,.tabs-striped.tabs-color-calm .tab-item.tab-item-active{margin-top:-2px;color:#11c1f3;border:0 solid #11c1f3;border-top-width:2px}.tabs-striped.tabs-color-calm .tab-item.activated .badge,.tabs-striped.tabs-color-calm .tab-item.active .badge,.tabs-striped.tabs-color-calm .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-assertive .tab-item{color:rgba(239,71,58,.4);opacity:1}.tabs-striped.tabs-color-assertive .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-assertive .tab-item.activated,.tabs-striped.tabs-color-assertive .tab-item.active,.tabs-striped.tabs-color-assertive .tab-item.tab-item-active{margin-top:-2px;color:#ef473a;border:0 solid #ef473a;border-top-width:2px}.tabs-striped.tabs-color-assertive .tab-item.activated .badge,.tabs-striped.tabs-color-assertive .tab-item.active .badge,.tabs-striped.tabs-color-assertive .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-balanced .tab-item{color:rgba(51,205,95,.4);opacity:1}.tabs-striped.tabs-color-balanced .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-balanced .tab-item.activated,.tabs-striped.tabs-color-balanced .tab-item.active,.tabs-striped.tabs-color-balanced .tab-item.tab-item-active{margin-top:-2px;color:#33cd5f;border:0 solid #33cd5f;border-top-width:2px}.tabs-striped.tabs-color-balanced .tab-item.activated .badge,.tabs-striped.tabs-color-balanced .tab-item.active .badge,.tabs-striped.tabs-color-balanced .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-energized .tab-item{color:rgba(255,201,0,.4);opacity:1}.tabs-striped.tabs-color-energized .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-energized .tab-item.activated,.tabs-striped.tabs-color-energized .tab-item.active,.tabs-striped.tabs-color-energized .tab-item.tab-item-active{margin-top:-2px;color:#ffc900;border:0 solid #ffc900;border-top-width:2px}.tabs-striped.tabs-color-energized .tab-item.activated .badge,.tabs-striped.tabs-color-energized .tab-item.active .badge,.tabs-striped.tabs-color-energized .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-royal .tab-item{color:rgba(136,106,234,.4);opacity:1}.tabs-striped.tabs-color-royal .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-royal .tab-item.activated,.tabs-striped.tabs-color-royal .tab-item.active,.tabs-striped.tabs-color-royal .tab-item.tab-item-active{margin-top:-2px;color:#886aea;border:0 solid #886aea;border-top-width:2px}.tabs-striped.tabs-color-royal .tab-item.activated .badge,.tabs-striped.tabs-color-royal .tab-item.active .badge,.tabs-striped.tabs-color-royal .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-dark .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-striped.tabs-color-dark .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-dark .tab-item.activated,.tabs-striped.tabs-color-dark .tab-item.active,.tabs-striped.tabs-color-dark .tab-item.tab-item-active{margin-top:-2px;color:#444;border:0 solid #444;border-top-width:2px}.tabs-striped.tabs-color-dark .tab-item.activated .badge,.tabs-striped.tabs-color-dark .tab-item.active .badge,.tabs-striped.tabs-color-dark .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-background-light .tabs,.tabs-background-light>.tabs{background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);border-color:#ddd}.tabs-background-stable .tabs,.tabs-background-stable>.tabs{background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);border-color:#b2b2b2}.tabs-background-positive .tabs,.tabs-background-positive>.tabs{background-color:#387ef5;background-image:linear-gradient(0deg,#0c60ee,#0c60ee 50%,transparent 50%);border-color:#0c60ee}.tabs-background-calm .tabs,.tabs-background-calm>.tabs{background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9dc7,#0a9dc7 50%,transparent 50%);border-color:#0a9dc7}.tabs-background-assertive .tabs,.tabs-background-assertive>.tabs{background-color:#ef473a;background-image:linear-gradient(0deg,#e42112,#e42112 50%,transparent 50%);border-color:#e42112}.tabs-background-balanced .tabs,.tabs-background-balanced>.tabs{background-color:#33cd5f;background-image:linear-gradient(0deg,#28a54c,#28a54c 50%,transparent 50%);border-color:#28a54c}.tabs-background-energized .tabs,.tabs-background-energized>.tabs{background-color:#ffc900;background-image:linear-gradient(0deg,#e6b500,#e6b500 50%,transparent 50%);border-color:#e6b500}.tabs-background-royal .tabs,.tabs-background-royal>.tabs{background-color:#886aea;background-image:linear-gradient(0deg,#6b46e5,#6b46e5 50%,transparent 50%);border-color:#6b46e5}.tabs-background-dark .tabs,.tabs-background-dark>.tabs{background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);border-color:#111}.tabs-color-light .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-color-light .tab-item .badge{opacity:.4}.tabs-color-light .tab-item.activated,.tabs-color-light .tab-item.active,.tabs-color-light .tab-item.tab-item-active{color:#fff;border:0 solid #fff}.tabs-color-light .tab-item.activated .badge,.tabs-color-light .tab-item.active .badge,.tabs-color-light .tab-item.tab-item-active .badge{opacity:1}.tabs-color-stable .tab-item{color:rgba(248,248,248,.4);opacity:1}.tabs-color-stable .tab-item .badge{opacity:.4}.tabs-color-stable .tab-item.activated,.tabs-color-stable .tab-item.active,.tabs-color-stable .tab-item.tab-item-active{color:#f8f8f8;border:0 solid #f8f8f8}.tabs-color-stable .tab-item.activated .badge,.tabs-color-stable .tab-item.active .badge,.tabs-color-stable .tab-item.tab-item-active .badge{opacity:1}.tabs-color-positive .tab-item{color:rgba(56,126,245,.4);opacity:1}.tabs-color-positive .tab-item .badge{opacity:.4}.tabs-color-positive .tab-item.activated,.tabs-color-positive .tab-item.active,.tabs-color-positive .tab-item.tab-item-active{color:#387ef5;border:0 solid #387ef5}.tabs-color-positive .tab-item.activated .badge,.tabs-color-positive .tab-item.active .badge,.tabs-color-positive .tab-item.tab-item-active .badge{opacity:1}.tabs-color-calm .tab-item{color:rgba(17,193,243,.4);opacity:1}.tabs-color-calm .tab-item .badge{opacity:.4}.tabs-color-calm .tab-item.activated,.tabs-color-calm .tab-item.active,.tabs-color-calm .tab-item.tab-item-active{color:#11c1f3;border:0 solid #11c1f3}.tabs-color-calm .tab-item.activated .badge,.tabs-color-calm .tab-item.active .badge,.tabs-color-calm .tab-item.tab-item-active .badge{opacity:1}.tabs-color-assertive .tab-item{color:rgba(239,71,58,.4);opacity:1}.tabs-color-assertive .tab-item .badge{opacity:.4}.tabs-color-assertive .tab-item.activated,.tabs-color-assertive .tab-item.active,.tabs-color-assertive .tab-item.tab-item-active{color:#ef473a;border:0 solid #ef473a}.tabs-color-assertive .tab-item.activated .badge,.tabs-color-assertive .tab-item.active .badge,.tabs-color-assertive .tab-item.tab-item-active .badge{opacity:1}.tabs-color-balanced .tab-item{color:rgba(51,205,95,.4);opacity:1}.tabs-color-balanced .tab-item .badge{opacity:.4}.tabs-color-balanced .tab-item.activated,.tabs-color-balanced .tab-item.active,.tabs-color-balanced .tab-item.tab-item-active{color:#33cd5f;border:0 solid #33cd5f}.tabs-color-balanced .tab-item.activated .badge,.tabs-color-balanced .tab-item.active .badge,.tabs-color-balanced .tab-item.tab-item-active .badge{opacity:1}.tabs-color-energized .tab-item{color:rgba(255,201,0,.4);opacity:1}.tabs-color-energized .tab-item .badge{opacity:.4}.tabs-color-energized .tab-item.activated,.tabs-color-energized .tab-item.active,.tabs-color-energized .tab-item.tab-item-active{color:#ffc900;border:0 solid #ffc900}.tabs-color-energized .tab-item.activated .badge,.tabs-color-energized .tab-item.active .badge,.tabs-color-energized .tab-item.tab-item-active .badge{opacity:1}.tabs-color-royal .tab-item{color:rgba(136,106,234,.4);opacity:1}.tabs-color-royal .tab-item .badge{opacity:.4}.tabs-color-royal .tab-item.activated,.tabs-color-royal .tab-item.active,.tabs-color-royal .tab-item.tab-item-active{color:#886aea;border:0 solid #886aea}.tabs-color-royal .tab-item.activated .badge,.tabs-color-royal .tab-item.active .badge,.tabs-color-royal .tab-item.tab-item-active .badge{opacity:1}.tabs-color-dark .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-color-dark .tab-item .badge{opacity:.4}.tabs-color-dark .tab-item.activated,.tabs-color-dark .tab-item.active,.tabs-color-dark .tab-item.tab-item-active{color:#444;border:0 solid #444}.tabs-color-dark .tab-item.activated .badge,.tabs-color-dark .tab-item.active .badge,.tabs-color-dark .tab-item.tab-item-active .badge{opacity:1}ion-tabs.tabs-color-active-light .tab-item{color:#444}ion-tabs.tabs-color-active-light .tab-item.activated,ion-tabs.tabs-color-active-light .tab-item.active,ion-tabs.tabs-color-active-light .tab-item.tab-item-active{color:#fff}ion-tabs.tabs-striped.tabs-color-active-light .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-light .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-light .tab-item.tab-item-active{border-color:#fff;color:#fff}ion-tabs.tabs-color-active-stable .tab-item{color:#444}ion-tabs.tabs-color-active-stable .tab-item.activated,ion-tabs.tabs-color-active-stable .tab-item.active,ion-tabs.tabs-color-active-stable .tab-item.tab-item-active{color:#f8f8f8}ion-tabs.tabs-striped.tabs-color-active-stable .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-stable .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-stable .tab-item.tab-item-active{border-color:#f8f8f8;color:#f8f8f8}ion-tabs.tabs-color-active-positive .tab-item{color:#444}ion-tabs.tabs-color-active-positive .tab-item.activated,ion-tabs.tabs-color-active-positive .tab-item.active,ion-tabs.tabs-color-active-positive .tab-item.tab-item-active{color:#387ef5}ion-tabs.tabs-striped.tabs-color-active-positive .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-positive .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-positive .tab-item.tab-item-active{border-color:#387ef5;color:#387ef5}ion-tabs.tabs-color-active-calm .tab-item{color:#444}ion-tabs.tabs-color-active-calm .tab-item.activated,ion-tabs.tabs-color-active-calm .tab-item.active,ion-tabs.tabs-color-active-calm .tab-item.tab-item-active{color:#11c1f3}ion-tabs.tabs-striped.tabs-color-active-calm .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-calm .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-calm .tab-item.tab-item-active{border-color:#11c1f3;color:#11c1f3}ion-tabs.tabs-color-active-assertive .tab-item{color:#444}ion-tabs.tabs-color-active-assertive .tab-item.activated,ion-tabs.tabs-color-active-assertive .tab-item.active,ion-tabs.tabs-color-active-assertive .tab-item.tab-item-active{color:#ef473a}ion-tabs.tabs-striped.tabs-color-active-assertive .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-assertive .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-assertive .tab-item.tab-item-active{border-color:#ef473a;color:#ef473a}ion-tabs.tabs-color-active-balanced .tab-item{color:#444}ion-tabs.tabs-color-active-balanced .tab-item.activated,ion-tabs.tabs-color-active-balanced .tab-item.active,ion-tabs.tabs-color-active-balanced .tab-item.tab-item-active{color:#33cd5f}ion-tabs.tabs-striped.tabs-color-active-balanced .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-balanced .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-balanced .tab-item.tab-item-active{border-color:#33cd5f;color:#33cd5f}ion-tabs.tabs-color-active-energized .tab-item{color:#444}ion-tabs.tabs-color-active-energized .tab-item.activated,ion-tabs.tabs-color-active-energized .tab-item.active,ion-tabs.tabs-color-active-energized .tab-item.tab-item-active{color:#ffc900}ion-tabs.tabs-striped.tabs-color-active-energized .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-energized .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-energized .tab-item.tab-item-active{border-color:#ffc900;color:#ffc900}ion-tabs.tabs-color-active-royal .tab-item{color:#444}ion-tabs.tabs-color-active-royal .tab-item.activated,ion-tabs.tabs-color-active-royal .tab-item.active,ion-tabs.tabs-color-active-royal .tab-item.tab-item-active{color:#886aea}ion-tabs.tabs-striped.tabs-color-active-royal .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-royal .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-royal .tab-item.tab-item-active{border-color:#886aea;color:#886aea}ion-tabs.tabs-color-active-dark .tab-item{color:#fff}ion-tabs.tabs-color-active-dark .tab-item.activated,ion-tabs.tabs-color-active-dark .tab-item.active,ion-tabs.tabs-color-active-dark .tab-item.tab-item-active{color:#444}ion-tabs.tabs-striped.tabs-color-active-dark .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-dark .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-dark .tab-item.tab-item-active{border-color:#444;color:#444}.tabs-top.tabs-striped{padding-bottom:0}.tabs-top.tabs-striped .tab-item{background:0 0;-webkit-transition:color .1s ease;-moz-transition:color .1s ease;-ms-transition:color .1s ease;-o-transition:color .1s ease;transition:color .1s ease}.tabs-top.tabs-striped .tab-item.activated,.tabs-top.tabs-striped .tab-item.active,.tabs-top.tabs-striped .tab-item.tab-item-active{margin-top:1px;border-width:0 0 2px 0!important;border-style:solid}.tabs-top.tabs-striped .tab-item.activated>.badge,.tabs-top.tabs-striped .tab-item.activated>i,.tabs-top.tabs-striped .tab-item.active>.badge,.tabs-top.tabs-striped .tab-item.active>i,.tabs-top.tabs-striped .tab-item.tab-item-active>.badge,.tabs-top.tabs-striped .tab-item.tab-item-active>i{margin-top:-1px}.tabs-top.tabs-striped .tab-item .badge{-webkit-transition:color .2s ease;-moz-transition:color .2s ease;-ms-transition:color .2s ease;-o-transition:color .2s ease;transition:color .2s ease}.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.activated .tab-title,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.activated i,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.active .tab-title,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.active i,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.tab-item-active .tab-title,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.tab-item-active i{display:block;margin-top:-1px}.tabs-top.tabs-striped.tabs-icon-left .tab-item{margin-top:1px}.tabs-top.tabs-striped.tabs-icon-left .tab-item.activated .tab-title,.tabs-top.tabs-striped.tabs-icon-left .tab-item.activated i,.tabs-top.tabs-striped.tabs-icon-left .tab-item.active .tab-title,.tabs-top.tabs-striped.tabs-icon-left .tab-item.active i,.tabs-top.tabs-striped.tabs-icon-left .tab-item.tab-item-active .tab-title,.tabs-top.tabs-striped.tabs-icon-left .tab-item.tab-item-active i{margin-top:-.1em}.tabs-top>.tabs,.tabs.tabs-top{top:44px;padding-top:0;background-position:bottom;border-top-width:0;border-bottom-width:1px}.tabs-top>.tabs .tab-item.activated .badge,.tabs-top>.tabs .tab-item.active .badge,.tabs-top>.tabs .tab-item.tab-item-active .badge,.tabs.tabs-top .tab-item.activated .badge,.tabs.tabs-top .tab-item.active .badge,.tabs.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-top~.bar-header{border-bottom-width:0}.tab-item{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;max-width:150px;height:100%;color:inherit;text-align:center;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;font-weight:400;font-size:14px;font-family:"-apple-system","Helvetica Neue",Roboto,"Segoe UI",sans-serif;opacity:.7}.tab-item:hover{cursor:pointer}.tab-item.tab-hidden,.tabs-item-hide>.tabs,.tabs.tabs-item-hide{display:none}.tabs-icon-bottom.tabs .tab-item,.tabs-icon-bottom>.tabs .tab-item,.tabs-icon-top.tabs .tab-item,.tabs-icon-top>.tabs .tab-item{font-size:10px;line-height:14px}.tab-item .icon{display:block;margin:0 auto;height:32px;font-size:32px}.tabs-icon-left.tabs .tab-item,.tabs-icon-left>.tabs .tab-item,.tabs-icon-right.tabs .tab-item,.tabs-icon-right>.tabs .tab-item{font-size:10px}.tabs-icon-left.tabs .tab-item .icon,.tabs-icon-left.tabs .tab-item .tab-title,.tabs-icon-left>.tabs .tab-item .icon,.tabs-icon-left>.tabs .tab-item .tab-title,.tabs-icon-right.tabs .tab-item .icon,.tabs-icon-right.tabs .tab-item .tab-title,.tabs-icon-right>.tabs .tab-item .icon,.tabs-icon-right>.tabs .tab-item .tab-title{display:inline-block;vertical-align:top;margin-top:-.1em}.tabs-icon-left.tabs .tab-item .icon:before,.tabs-icon-left.tabs .tab-item .tab-title:before,.tabs-icon-left>.tabs .tab-item .icon:before,.tabs-icon-left>.tabs .tab-item .tab-title:before,.tabs-icon-right.tabs .tab-item .icon:before,.tabs-icon-right.tabs .tab-item .tab-title:before,.tabs-icon-right>.tabs .tab-item .icon:before,.tabs-icon-right>.tabs .tab-item .tab-title:before{font-size:24px;line-height:49px}.tabs-icon-left.tabs .tab-item .icon,.tabs-icon-left>.tabs .tab-item .icon{padding-right:3px}.tabs-icon-right.tabs .tab-item .icon,.tabs-icon-right>.tabs .tab-item .icon{padding-left:3px}.tabs-icon-only.tabs .icon,.tabs-icon-only>.tabs .icon{line-height:inherit}.tab-item.has-badge{position:relative}.tab-item .badge{position:absolute;top:4%;right:33%;right:calc(50% - 26px);padding:1px 6px;height:auto;font-size:12px;line-height:16px}.tab-item.activated,.tab-item.active,.tab-item.tab-item-active{opacity:1}.tab-item.activated.tab-item-light,.tab-item.active.tab-item-light,.tab-item.tab-item-active.tab-item-light{color:#fff}.tab-item.activated.tab-item-stable,.tab-item.active.tab-item-stable,.tab-item.tab-item-active.tab-item-stable{color:#f8f8f8}.tab-item.activated.tab-item-positive,.tab-item.active.tab-item-positive,.tab-item.tab-item-active.tab-item-positive{color:#387ef5}.tab-item.activated.tab-item-calm,.tab-item.active.tab-item-calm,.tab-item.tab-item-active.tab-item-calm{color:#11c1f3}.tab-item.activated.tab-item-assertive,.tab-item.active.tab-item-assertive,.tab-item.tab-item-active.tab-item-assertive{color:#ef473a}.tab-item.activated.tab-item-balanced,.tab-item.active.tab-item-balanced,.tab-item.tab-item-active.tab-item-balanced{color:#33cd5f}.tab-item.activated.tab-item-energized,.tab-item.active.tab-item-energized,.tab-item.tab-item-active.tab-item-energized{color:#ffc900}.tab-item.activated.tab-item-royal,.tab-item.active.tab-item-royal,.tab-item.tab-item-active.tab-item-royal{color:#886aea}.tab-item.activated.tab-item-dark,.tab-item.active.tab-item-dark,.tab-item.tab-item-active.tab-item-dark{color:#444}.item.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:0}.item.tabs .icon:before{position:relative}.tab-item.disabled,.tab-item[disabled]{opacity:.4;cursor:default;pointer-events:none}.nav-bar-tabs-top.hide~.view-container .tabs-top .tabs{top:0}.pane[hide-nav-bar=true] .has-tabs-top{top:49px}.menu{position:absolute;top:0;bottom:0;z-index:0;overflow:hidden;min-height:100%;max-height:100%;width:275px;background-color:#fff}.menu .scroll-content{z-index:10}.menu .bar-header{z-index:11}.menu-content{-webkit-transform:none;transform:none;box-shadow:-1px 0 2px rgba(0,0,0,.2),1px 0 2px rgba(0,0,0,.2)}.menu-open .menu-content .pane,.menu-open .menu-content .scroll-content,.menu-open .menu-content .scroll-content .scroll{pointer-events:none}.menu-open .menu-content .scroll-content:not(.overflow-scroll){overflow:hidden}.grade-b .menu-content,.grade-c .menu-content{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;right:-1px;left:-1px;border-right:1px solid #ccc;border-left:1px solid #ccc;box-shadow:none}.menu-left{left:0}.menu-right{right:0}.aside-open.aside-resizing .menu-right{display:none}.menu-animated{-webkit-transition:-webkit-transform 200ms ease;transition:transform 200ms ease}.modal-backdrop,.modal-backdrop-bg{position:fixed;top:0;left:0;z-index:10;width:100%;height:100%}.modal-backdrop-bg{pointer-events:none}.modal{display:block;position:absolute;top:0;z-index:10;overflow:hidden;min-height:100%;width:100%;background-color:#fff}@media (min-width:680px){.modal{top:20%;right:20%;bottom:20%;left:20%;min-height:240px;width:60%}.modal.ng-leave-active{bottom:0}.platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader){height:44px}.platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader)>*{margin-top:0}.platform-ios.platform-cordova .modal-wrapper .modal .bar-subheader,.platform-ios.platform-cordova .modal-wrapper .modal .has-header,.platform-ios.platform-cordova .modal-wrapper .modal .tabs-top>.tabs,.platform-ios.platform-cordova .modal-wrapper .modal .tabs.tabs-top{top:44px}.platform-ios.platform-cordova .modal-wrapper .modal .has-subheader{top:88px}.platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-tabs-top{top:93px}.platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-subheader.has-tabs-top{top:137px}.modal-backdrop-bg{-webkit-transition:opacity 300ms ease-in-out;transition:opacity 300ms ease-in-out;background-color:#000;opacity:0}.active .modal-backdrop-bg{opacity:.5}}.modal-open{pointer-events:none}.modal-open .modal,.modal-open .modal-backdrop{pointer-events:auto}.modal-open.loading-active .modal,.modal-open.loading-active .modal-backdrop{pointer-events:none}.popover-backdrop{position:fixed;top:0;left:0;z-index:10;width:100%;height:100%;background-color:transparent}.popover-backdrop.active{background-color:rgba(0,0,0,.1)}.popover{position:absolute;top:25%;left:50%;z-index:10;display:block;margin-top:12px;margin-left:-110px;height:280px;width:220px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4);opacity:0}.popover .item:first-child{border-top:0}.popover .item:last-child{border-bottom:0}.popover.popover-bottom{margin-top:-12px}.popover,.popover .bar-header{border-radius:2px}.popover .scroll-content{z-index:1;margin:2px 0}.popover .bar-header{border-bottom-right-radius:0;border-bottom-left-radius:0}.popover .has-header{border-top-right-radius:0;border-top-left-radius:0}.popover-arrow{display:none}.platform-ios .popover{box-shadow:0 0 40px rgba(0,0,0,.08);border-radius:10px}.platform-ios .popover .bar-header{-webkit-border-top-right-radius:10px;border-top-right-radius:10px;-webkit-border-top-left-radius:10px;border-top-left-radius:10px}.platform-ios .popover .scroll-content{margin:8px 0;border-radius:10px}.platform-ios .popover .scroll-content.has-header{margin-top:0}.platform-ios .popover-arrow{position:absolute;display:block;top:-17px;width:30px;height:19px;overflow:hidden}.platform-ios .popover-arrow:after{position:absolute;top:12px;left:5px;width:20px;height:20px;background-color:#fff;border-radius:3px;content:'';-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.platform-ios .popover-bottom .popover-arrow{top:auto;bottom:-10px}.platform-ios .popover-bottom .popover-arrow:after{top:-6px}.platform-android .popover{margin-top:-32px;background-color:#fafafa;box-shadow:0 2px 6px rgba(0,0,0,.35)}.platform-android .popover .item{border-color:#fafafa;background-color:#fafafa;color:#4d4d4d}.platform-android .popover.popover-bottom{margin-top:32px}.platform-android .popover-backdrop,.platform-android .popover-backdrop.active{background-color:transparent}.popover-open{pointer-events:none}.popover-open .popover,.popover-open .popover-backdrop{pointer-events:auto}.popover-open.loading-active .popover,.popover-open.loading-active .popover-backdrop{pointer-events:none}@media (min-width:680px){.popover{width:360px;margin-left:-180px}}.popup-container{position:absolute;top:0;left:0;bottom:0;right:0;background:0 0;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;z-index:12;visibility:hidden}.popup-container.popup-showing{visibility:visible}.popup-container.popup-hidden .popup{-webkit-animation-name:scaleOut;animation-name:scaleOut;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.popup-container.active .popup{-webkit-animation-name:superScaleIn;animation-name:superScaleIn;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.popup-container .popup{width:250px;max-width:100%;max-height:90%;border-radius:0;background-color:rgba(255,255,255,.9);display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:vertical;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.popup-container input,.popup-container textarea{width:100%}.popup-head{padding:15px 10px;border-bottom:1px solid #eee;text-align:center}.popup-title{margin:0;padding:0;font-size:15px}.popup-sub-title{margin:5px 0 0 0;padding:0;font-weight:400;font-size:11px}.popup-body{padding:10px;overflow:auto}.popup-buttons{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:row;-moz-flex-direction:row;-ms-flex-direction:row;flex-direction:row;padding:10px;min-height:65px}.popup-buttons .button{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;min-height:45px;border-radius:2px;line-height:20px;margin-right:5px}.popup-buttons .button:last-child{margin-right:0}.popup-open,.popup-open.modal-open .modal{pointer-events:none}.popup-open .popup,.popup-open .popup-backdrop{pointer-events:auto}.loading-container{position:absolute;left:0;top:0;right:0;bottom:0;z-index:13;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-transition:.2s opacity linear;transition:.2s opacity linear;visibility:hidden;opacity:0}.loading-container:not(.visible) .icon,.loading-container:not(.visible) .spinner{display:none}.loading-container.visible{visibility:visible}.loading-container.active{opacity:1}.loading-container .loading{padding:20px;border-radius:5px;background-color:rgba(0,0,0,.7);color:#fff;text-align:center;text-overflow:ellipsis;font-size:15px}.loading-container .loading h1,.loading-container .loading h2,.loading-container .loading h3,.loading-container .loading h4,.loading-container .loading h5,.loading-container .loading h6{color:#fff}.item{border-color:#ddd;background-color:#fff;color:#444;position:relative;z-index:2;display:block;margin:-1px;padding:16px;border-width:1px;border-style:solid;font-size:16px}.item h2{margin:0 0 2px 0;font-size:16px;font-weight:400}.item h3{margin:0 0 4px 0;font-size:14px}.item h4{margin:0 0 4px 0;font-size:12px}.item h5,.item h6{margin:0 0 3px 0;font-size:10px}.item p{color:#666;font-size:14px;margin-bottom:2px}.item h1:last-child,.item h2:last-child,.item h3:last-child,.item h4:last-child,.item h5:last-child,.item h6:last-child,.item p:last-child{margin-bottom:0}.item .badge{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;position:absolute;top:16px;right:32px}.item.item-button-right .badge{right:67px}.item.item-divider .badge{top:8px}.item .badge+.badge{margin-right:5px}.item.item-light{border-color:#ddd;background-color:#fff;color:#444}.item.item-stable{border-color:#b2b2b2;background-color:#f8f8f8;color:#444}.item.item-positive{border-color:#0c60ee;background-color:#387ef5;color:#fff}.item.item-calm{border-color:#0a9dc7;background-color:#11c1f3;color:#fff}.item.item-assertive{border-color:#e42112;background-color:#ef473a;color:#fff}.item.item-balanced{border-color:#28a54c;background-color:#33cd5f;color:#fff}.item.item-energized{border-color:#e6b500;background-color:#ffc900;color:#fff}.item.item-royal{border-color:#6b46e5;background-color:#886aea;color:#fff}.item.item-dark{border-color:#111;background-color:#444;color:#fff}.item[ng-click]:hover{cursor:pointer}.item-borderless,.list-borderless .item{border-width:0}.item .item-content.activated,.item .item-content.activated.item-complex>.item-content,.item .item-content.active,.item .item-content.active.item-complex>.item-content,.item-complex.activated .item-content,.item-complex.activated .item-content.item-complex>.item-content,.item-complex.active .item-content,.item-complex.active .item-content.item-complex>.item-content,.item.activated,.item.activated.item-complex>.item-content,.item.active,.item.active.item-complex>.item-content{border-color:#ccc;background-color:#D9D9D9}.item .item-content.activated.item-light,.item .item-content.activated.item-light.item-complex>.item-content,.item .item-content.active.item-light,.item .item-content.active.item-light.item-complex>.item-content,.item-complex.activated .item-content.item-light,.item-complex.activated .item-content.item-light.item-complex>.item-content,.item-complex.active .item-content.item-light,.item-complex.active .item-content.item-light.item-complex>.item-content,.item.activated.item-light,.item.activated.item-light.item-complex>.item-content,.item.active.item-light,.item.active.item-light.item-complex>.item-content{border-color:#ccc;background-color:#fafafa}.item .item-content.activated.item-stable,.item .item-content.activated.item-stable.item-complex>.item-content,.item .item-content.active.item-stable,.item .item-content.active.item-stable.item-complex>.item-content,.item-complex.activated .item-content.item-stable,.item-complex.activated .item-content.item-stable.item-complex>.item-content,.item-complex.active .item-content.item-stable,.item-complex.active .item-content.item-stable.item-complex>.item-content,.item.activated.item-stable,.item.activated.item-stable.item-complex>.item-content,.item.active.item-stable,.item.active.item-stable.item-complex>.item-content{border-color:#a2a2a2;background-color:#e5e5e5}.item .item-content.activated.item-positive,.item .item-content.activated.item-positive.item-complex>.item-content,.item .item-content.active.item-positive,.item .item-content.active.item-positive.item-complex>.item-content,.item-complex.activated .item-content.item-positive,.item-complex.activated .item-content.item-positive.item-complex>.item-content,.item-complex.active .item-content.item-positive,.item-complex.active .item-content.item-positive.item-complex>.item-content,.item.activated.item-positive,.item.activated.item-positive.item-complex>.item-content,.item.active.item-positive,.item.active.item-positive.item-complex>.item-content{border-color:#0c60ee;background-color:#0c60ee}.item .item-content.activated.item-calm,.item .item-content.activated.item-calm.item-complex>.item-content,.item .item-content.active.item-calm,.item .item-content.active.item-calm.item-complex>.item-content,.item-complex.activated .item-content.item-calm,.item-complex.activated .item-content.item-calm.item-complex>.item-content,.item-complex.active .item-content.item-calm,.item-complex.active .item-content.item-calm.item-complex>.item-content,.item.activated.item-calm,.item.activated.item-calm.item-complex>.item-content,.item.active.item-calm,.item.active.item-calm.item-complex>.item-content{border-color:#0a9dc7;background-color:#0a9dc7}.item .item-content.activated.item-assertive,.item .item-content.activated.item-assertive.item-complex>.item-content,.item .item-content.active.item-assertive,.item .item-content.active.item-assertive.item-complex>.item-content,.item-complex.activated .item-content.item-assertive,.item-complex.activated .item-content.item-assertive.item-complex>.item-content,.item-complex.active .item-content.item-assertive,.item-complex.active .item-content.item-assertive.item-complex>.item-content,.item.activated.item-assertive,.item.activated.item-assertive.item-complex>.item-content,.item.active.item-assertive,.item.active.item-assertive.item-complex>.item-content{border-color:#e42112;background-color:#e42112}.item .item-content.activated.item-balanced,.item .item-content.activated.item-balanced.item-complex>.item-content,.item .item-content.active.item-balanced,.item .item-content.active.item-balanced.item-complex>.item-content,.item-complex.activated .item-content.item-balanced,.item-complex.activated .item-content.item-balanced.item-complex>.item-content,.item-complex.active .item-content.item-balanced,.item-complex.active .item-content.item-balanced.item-complex>.item-content,.item.activated.item-balanced,.item.activated.item-balanced.item-complex>.item-content,.item.active.item-balanced,.item.active.item-balanced.item-complex>.item-content{border-color:#28a54c;background-color:#28a54c}.item .item-content.activated.item-energized,.item .item-content.activated.item-energized.item-complex>.item-content,.item .item-content.active.item-energized,.item .item-content.active.item-energized.item-complex>.item-content,.item-complex.activated .item-content.item-energized,.item-complex.activated .item-content.item-energized.item-complex>.item-content,.item-complex.active .item-content.item-energized,.item-complex.active .item-content.item-energized.item-complex>.item-content,.item.activated.item-energized,.item.activated.item-energized.item-complex>.item-content,.item.active.item-energized,.item.active.item-energized.item-complex>.item-content{border-color:#e6b500;background-color:#e6b500}.item .item-content.activated.item-royal,.item .item-content.activated.item-royal.item-complex>.item-content,.item .item-content.active.item-royal,.item .item-content.active.item-royal.item-complex>.item-content,.item-complex.activated .item-content.item-royal,.item-complex.activated .item-content.item-royal.item-complex>.item-content,.item-complex.active .item-content.item-royal,.item-complex.active .item-content.item-royal.item-complex>.item-content,.item.activated.item-royal,.item.activated.item-royal.item-complex>.item-content,.item.active.item-royal,.item.active.item-royal.item-complex>.item-content{border-color:#6b46e5;background-color:#6b46e5}.item .item-content.activated.item-dark,.item .item-content.activated.item-dark.item-complex>.item-content,.item .item-content.active.item-dark,.item .item-content.active.item-dark.item-complex>.item-content,.item-complex.activated .item-content.item-dark,.item-complex.activated .item-content.item-dark.item-complex>.item-content,.item-complex.active .item-content.item-dark,.item-complex.active .item-content.item-dark.item-complex>.item-content,.item.activated.item-dark,.item.activated.item-dark.item-complex>.item-content,.item.active.item-dark,.item.active.item-dark.item-complex>.item-content{border-color:#000;background-color:#262626}.item,.item h1,.item h2,.item h3,.item h4,.item h5,.item h6,.item p,.item-content,.item-content h1,.item-content h2,.item-content h3,.item-content h4,.item-content h5,.item-content h6,.item-content p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}a.item{color:inherit;text-decoration:none}a.item:focus,a.item:hover{text-decoration:none}.item-complex,a.item.item-complex,button.item.item-complex{padding:0}.item-complex .item-content,.item-radio .item-content{position:relative;z-index:2;padding:16px 49px 16px 16px;border:none;background-color:#fff}a.item-content{display:block;color:inherit;text-decoration:none}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p,.item-complex.item-text-wrap,.item-complex.item-text-wrap .item-content,.item-complex.item-text-wrap h1,.item-complex.item-text-wrap h2,.item-complex.item-text-wrap h3,.item-complex.item-text-wrap h4,.item-complex.item-text-wrap h5,.item-complex.item-text-wrap h6,.item-complex.item-text-wrap p,.item-text-wrap,.item-text-wrap .item,.item-text-wrap .item-content,.item-text-wrap h1,.item-text-wrap h2,.item-text-wrap h3,.item-text-wrap h4,.item-text-wrap h5,.item-text-wrap h6,.item-text-wrap p{overflow:visible;white-space:normal}.item-complex.item-light>.item-content{border-color:#ddd;background-color:#fff;color:#444}.item-complex.item-light>.item-content.active,.item-complex.item-light>.item-content.active.item-complex>.item-content,.item-complex.item-light>.item-content:active,.item-complex.item-light>.item-content:active.item-complex>.item-content{border-color:#ccc;background-color:#fafafa}.item-complex.item-stable>.item-content{border-color:#b2b2b2;background-color:#f8f8f8;color:#444}.item-complex.item-stable>.item-content.active,.item-complex.item-stable>.item-content.active.item-complex>.item-content,.item-complex.item-stable>.item-content:active,.item-complex.item-stable>.item-content:active.item-complex>.item-content{border-color:#a2a2a2;background-color:#e5e5e5}.item-complex.item-positive>.item-content{border-color:#0c60ee;background-color:#387ef5;color:#fff}.item-complex.item-positive>.item-content.active,.item-complex.item-positive>.item-content.active.item-complex>.item-content,.item-complex.item-positive>.item-content:active,.item-complex.item-positive>.item-content:active.item-complex>.item-content{border-color:#0c60ee;background-color:#0c60ee}.item-complex.item-calm>.item-content{border-color:#0a9dc7;background-color:#11c1f3;color:#fff}.item-complex.item-calm>.item-content.active,.item-complex.item-calm>.item-content.active.item-complex>.item-content,.item-complex.item-calm>.item-content:active,.item-complex.item-calm>.item-content:active.item-complex>.item-content{border-color:#0a9dc7;background-color:#0a9dc7}.item-complex.item-assertive>.item-content{border-color:#e42112;background-color:#ef473a;color:#fff}.item-complex.item-assertive>.item-content.active,.item-complex.item-assertive>.item-content.active.item-complex>.item-content,.item-complex.item-assertive>.item-content:active,.item-complex.item-assertive>.item-content:active.item-complex>.item-content{border-color:#e42112;background-color:#e42112}.item-complex.item-balanced>.item-content{border-color:#28a54c;background-color:#33cd5f;color:#fff}.item-complex.item-balanced>.item-content.active,.item-complex.item-balanced>.item-content.active.item-complex>.item-content,.item-complex.item-balanced>.item-content:active,.item-complex.item-balanced>.item-content:active.item-complex>.item-content{border-color:#28a54c;background-color:#28a54c}.item-complex.item-energized>.item-content{border-color:#e6b500;background-color:#ffc900;color:#fff}.item-complex.item-energized>.item-content.active,.item-complex.item-energized>.item-content.active.item-complex>.item-content,.item-complex.item-energized>.item-content:active,.item-complex.item-energized>.item-content:active.item-complex>.item-content{border-color:#e6b500;background-color:#e6b500}.item-complex.item-royal>.item-content{border-color:#6b46e5;background-color:#886aea;color:#fff}.item-complex.item-royal>.item-content.active,.item-complex.item-royal>.item-content.active.item-complex>.item-content,.item-complex.item-royal>.item-content:active,.item-complex.item-royal>.item-content:active.item-complex>.item-content{border-color:#6b46e5;background-color:#6b46e5}.item-complex.item-dark>.item-content{border-color:#111;background-color:#444;color:#fff}.item-complex.item-dark>.item-content.active,.item-complex.item-dark>.item-content.active.item-complex>.item-content,.item-complex.item-dark>.item-content:active,.item-complex.item-dark>.item-content:active.item-complex>.item-content{border-color:#000;background-color:#262626}.item-icon-left .icon,.item-icon-right .icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-icon-left .icon:before,.item-icon-right .icon:before{display:block;width:32px;text-align:center}.item .fill-icon{min-width:30px;min-height:30px;font-size:28px}.item-icon-left{padding-left:54px}.item-icon-left .icon{left:11px}.item-complex.item-icon-left{padding-left:0}.item-complex.item-icon-left .item-content{padding-left:54px}.item-icon-right{padding-right:54px}.item-icon-right .icon{right:11px}.item-complex.item-icon-right{padding-right:0}.item-complex.item-icon-right .item-content{padding-right:54px}.item-icon-left.item-icon-right .icon:first-child{right:auto}.item-icon-left .item-delete .icon,.item-icon-left.item-icon-right .icon:last-child{left:auto}.item-icon-left .icon-accessory,.item-icon-right .icon-accessory{color:#ccc;font-size:16px}.item-icon-left .icon-accessory{left:3px}.item-icon-right .icon-accessory{right:3px}.item-button-left{padding-left:72px}.item-button-left .item-content>.button,.item-button-left>.button{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:8px;left:11px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-button-left .item-content>.button .icon:before,.item-button-left>.button .icon:before{position:relative;left:auto;width:auto;line-height:31px}.item-button-left .item-content>.button>.button,.item-button-left>.button>.button{margin:0 2px;min-height:34px;font-size:18px;line-height:32px}.item-button-right,a.item.item-button-right,button.item.item-button-right{padding-right:80px}.item-button-right .item-content>.button,.item-button-right .item-content>.buttons,.item-button-right>.button,.item-button-right>.buttons{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:8px;right:16px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-button-right .item-content>.button .icon:before,.item-button-right .item-content>.buttons .icon:before,.item-button-right>.button .icon:before,.item-button-right>.buttons .icon:before{position:relative;left:auto;width:auto;line-height:31px}.item-button-right .item-content>.button>.button,.item-button-right .item-content>.buttons>.button,.item-button-right>.button>.button,.item-button-right>.buttons>.button{margin:0 2px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-button-left.item-button-right .button:first-child{right:auto}.item-button-left.item-button-right .button:last-child{left:auto}.item-avatar,.item-avatar .item-content,.item-avatar-left,.item-avatar-left .item-content{padding-left:72px;min-height:72px}.item-avatar .item-content .item-image,.item-avatar .item-content>img:first-child,.item-avatar .item-image,.item-avatar-left .item-content .item-image,.item-avatar-left .item-content>img:first-child,.item-avatar-left .item-image,.item-avatar-left>img:first-child,.item-avatar>img:first-child{position:absolute;top:16px;left:16px;max-width:40px;max-height:40px;width:100%;height:100%;border-radius:50%}.item-avatar-right,.item-avatar-right .item-content{padding-right:72px;min-height:72px}.item-avatar-right .item-content .item-image,.item-avatar-right .item-content>img:first-child,.item-avatar-right .item-image,.item-avatar-right>img:first-child{position:absolute;top:16px;right:16px;max-width:40px;max-height:40px;width:100%;height:100%;border-radius:50%}.item-thumbnail-left,.item-thumbnail-left .item-content{padding-top:8px;padding-left:106px;min-height:100px}.item-thumbnail-left .item-content .item-image,.item-thumbnail-left .item-content>img:first-child,.item-thumbnail-left .item-image,.item-thumbnail-left>img:first-child{position:absolute;top:10px;left:10px;max-width:80px;max-height:80px;width:100%;height:100%}.item-avatar-left.item-complex,.item-avatar.item-complex,.item-thumbnail-left.item-complex{padding-top:0;padding-left:0}.item-thumbnail-right,.item-thumbnail-right .item-content{padding-top:8px;padding-right:106px;min-height:100px}.item-thumbnail-right .item-content .item-image,.item-thumbnail-right .item-content>img:first-child,.item-thumbnail-right .item-image,.item-thumbnail-right>img:first-child{position:absolute;top:10px;right:10px;max-width:80px;max-height:80px;width:100%;height:100%}.item-avatar-right.item-complex,.item-thumbnail-right.item-complex{padding-top:0;padding-right:0}.item-image{padding:0;text-align:center}.item-image .list-img,.item-image img:first-child{width:100%;vertical-align:middle}.item-body{overflow:auto;padding:16px;text-overflow:inherit;white-space:normal}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p{margin-top:16px;margin-bottom:16px}.item-divider{padding-top:8px;padding-bottom:8px;min-height:30px;background-color:#f5f5f5;color:#222;font-weight:500}.item-divider-ios,.platform-ios .item-divider-platform{padding-top:26px;text-transform:uppercase;font-weight:300;font-size:13px;background-color:#efeff4;color:#555}.item-divider-android,.platform-android .item-divider-platform{font-weight:300;font-size:13px}.item-note{float:right;color:#aaa;font-size:14px}.item-left-editable .item-content,.item-right-editable .item-content{-webkit-transition-duration:250ms;transition-duration:250ms;-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;transition-property:transform}.item-left-editing.item-left-editable .item-content,.list-left-editing .item-left-editable .item-content{-webkit-transform:translate3d(50px,0,0);transform:translate3d(50px,0,0)}.item-remove-animate.ng-leave{-webkit-transition-duration:300ms;transition-duration:300ms}.item-remove-animate.ng-leave .item-content,.item-remove-animate.ng-leave:last-of-type{-webkit-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-property:all;transition-property:all}.item-remove-animate.ng-leave.ng-leave-active .item-content{opacity:0;-webkit-transform:translate3d(-100%,0,0)!important;transform:translate3d(-100%,0,0)!important}.item-remove-animate.ng-leave.ng-leave-active:last-of-type{opacity:0}.item-remove-animate.ng-leave.ng-leave-active~ion-item:not(.ng-leave){-webkit-transform:translate3d(0,-webkit-calc(-100% + 1px),0);transform:translate3d(0,calc(-100% + 1px),0);-webkit-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:cubic-bezier(.25,.81,.24,1);transition-timing-function:cubic-bezier(.25,.81,.24,1);-webkit-transition-property:all;transition-property:all}.item-left-edit{-webkit-transition:all ease-in-out 125ms;transition:all ease-in-out 125ms;position:absolute;top:0;left:0;z-index:0;width:50px;height:100%;line-height:100%;display:none;opacity:0;-webkit-transform:translate3d(-21px,0,0);transform:translate3d(-21px,0,0)}.item-left-edit .button{height:100%}.item-left-edit .button.icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%}.item-left-edit.visible{display:block}.item-left-edit.visible.active{opacity:1;-webkit-transform:translate3d(8px,0,0);transform:translate3d(8px,0,0)}.list-left-editing .item-left-edit{-webkit-transition-delay:125ms;transition-delay:125ms}.item-delete .button.icon{color:#ef473a;font-size:24px}.item-delete .button.icon:hover{opacity:.7}.item-right-edit{-webkit-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:0;z-index:3;width:75px;height:100%;background:inherit;padding-left:20px;display:block;opacity:0;-webkit-transform:translate3d(75px,0,0);transform:translate3d(75px,0,0)}.item-right-edit .button{min-width:50px;height:100%}.item-right-edit .button.icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-right-edit.visible{display:block}.item-right-edit.visible.active{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.item-reorder .button.icon{color:#444;font-size:32px}.item-reordering{position:absolute;left:0;top:0;z-index:9;width:100%;box-shadow:0 0 10px 0 #aaa}.item-reordering .item-reorder{z-index:9}.item-placeholder{opacity:.7}.item-options{position:absolute;top:0;right:0;z-index:1;height:100%}.item-options .button{height:100%;border:none;border-radius:0;display:-webkit-inline-box;display:-webkit-inline-flex;display:-moz-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}.item-options .button:before{margin:0 auto}.list{position:relative;padding-top:1px;padding-bottom:1px;padding-left:0;margin-bottom:20px}.list:last-child{margin-bottom:0}.list:last-child.card{margin-bottom:40px}.list-header{margin-top:20px;padding:5px 15px;background-color:transparent;color:#222;font-weight:700}.card.list .list-item{padding-right:1px;padding-left:1px}.card,.list-inset{overflow:hidden;margin:20px 10px;border-radius:2px;background-color:#fff}.card{padding-top:1px;padding-bottom:1px;box-shadow:0 1px 3px rgba(0,0,0,.3)}.card .item{border-left:0;border-right:0}.card .item:first-child{border-top:0}.card .item:last-child{border-bottom:0}.padding .card,.padding .list-inset{margin-left:0;margin-right:0}.card .item:first-child,.card .item:first-child .item-content,.list-inset .item:first-child,.list-inset .item:first-child .item-content,.padding>.list .item:first-child,.padding>.list .item:first-child .item-content{border-top-left-radius:2px;border-top-right-radius:2px}.card .item:last-child,.card .item:last-child .item-content,.list-inset .item:last-child,.list-inset .item:last-child .item-content,.padding>.list .item:last-child,.padding>.list .item:last-child .item-content{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.card .item:last-child,.list-inset .item:last-child{margin-bottom:-1px}.card .item,.list-inset .item,.padding-horizontal>.list .item,.padding>.list .item{margin-right:0;margin-left:0}.card .item.item-input input,.list-inset .item.item-input input,.padding-horizontal>.list .item.item-input input,.padding>.list .item.item-input input{padding-right:44px}.padding-left>.list .item{margin-left:0}.padding-right>.list .item{margin-right:0}.badge{background-color:transparent;color:#AAA;z-index:1;display:inline-block;padding:3px 8px;min-width:10px;border-radius:10px;vertical-align:baseline;text-align:center;white-space:nowrap;font-weight:700;font-size:14px;line-height:16px}.badge:empty{display:none}.badge.badge-light,.tabs .tab-item .badge.badge-light{background-color:#fff;color:#444}.badge.badge-stable,.tabs .tab-item .badge.badge-stable{background-color:#f8f8f8;color:#444}.badge.badge-positive,.tabs .tab-item .badge.badge-positive{background-color:#387ef5;color:#fff}.badge.badge-calm,.tabs .tab-item .badge.badge-calm{background-color:#11c1f3;color:#fff}.badge.badge-assertive,.tabs .tab-item .badge.badge-assertive{background-color:#ef473a;color:#fff}.badge.badge-balanced,.tabs .tab-item .badge.badge-balanced{background-color:#33cd5f;color:#fff}.badge.badge-energized,.tabs .tab-item .badge.badge-energized{background-color:#ffc900;color:#fff}.badge.badge-royal,.tabs .tab-item .badge.badge-royal{background-color:#886aea;color:#fff}.badge.badge-dark,.tabs .tab-item .badge.badge-dark{background-color:#444;color:#fff}.button .badge{position:relative;top:-1px}.slider{position:relative;visibility:hidden;overflow:hidden}.slider-slides{position:relative;height:100%}.slider-slide{position:relative;display:block;float:left;width:100%;height:100%;vertical-align:top}.slider-slide-image>img{width:100%}.slider-pager{position:absolute;bottom:20px;z-index:1;width:100%;height:15px;text-align:center}.slider-pager .slider-pager-page{display:inline-block;margin:0 3px;width:15px;color:#000;text-decoration:none;opacity:.3}.slider-pager .slider-pager-page.active{-webkit-transition:opacity .4s ease-in;transition:opacity .4s ease-in;opacity:1}.slider-pager-page.ng-animate,.slider-pager-page.ng-enter,.slider-pager-page.ng-leave,.slider-slide.ng-animate,.slider-slide.ng-enter,.slider-slide.ng-leave{-webkit-transition:none!important;transition:none!important}.slider-pager-page.ng-animate,.slider-slide.ng-animate{-webkit-animation:none 0s;animation:none 0s}.swiper-container{margin:0 auto;position:relative;z-index:1}.swiper-container-no-flexbox .swiper-slide{float:left}.swiper-container-vertical>.swiper-wrapper{-webkit-box-orient:vertical;-moz-box-orient:vertical;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.swiper-wrapper{z-index:1;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.swiper-container-android .swiper-slide,.swiper-wrapper{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate(0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.swiper-container-multirow>.swiper-wrapper{-webkit-box-lines:multiple;-moz-box-lines:multiple;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}.swiper-container-free-mode>.swiper-wrapper{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out;margin:0 auto}.swiper-slide{display:block;-webkit-flex-shrink:0;-ms-flex:0 0 auto;flex-shrink:0;position:relative}.swiper-container-autoheight,.swiper-container-autoheight .swiper-slide{height:auto}.swiper-container-autoheight .swiper-wrapper{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start;-webkit-transition-property:-webkit-transform,height;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform,height}.swiper-container .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-wp8-horizontal{-ms-touch-action:pan-y;touch-action:pan-y}.swiper-wp8-vertical{-ms-touch-action:pan-x;touch-action:pan-x}.swiper-button-next,.swiper-button-prev{position:absolute;top:50%;width:27px;height:44px;margin-top:-22px;z-index:10;cursor:pointer;-moz-background-size:27px 44px;-webkit-background-size:27px 44px;background-size:27px 44px;background-position:center;background-repeat:no-repeat}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-prev,.swiper-container-rtl .swiper-button-next{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");left:10px;right:auto}.swiper-button-prev.swiper-button-black,.swiper-container-rtl .swiper-button-next.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-prev.swiper-button-white,.swiper-container-rtl .swiper-button-next.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next,.swiper-container-rtl .swiper-button-prev{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");right:10px;left:auto}.swiper-button-next.swiper-button-black,.swiper-container-rtl .swiper-button-prev.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next.swiper-button-white,.swiper-container-rtl .swiper-button-prev.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-pagination{position:absolute;text-align:center;-webkit-transition:300ms;-moz-transition:300ms;-o-transition:300ms;transition:300ms;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-pagination-bullet{width:8px;height:8px;display:inline-block;border-radius:100%;background:#000;opacity:.2}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-white .swiper-pagination-bullet{background:#fff}.swiper-pagination-bullet-active{opacity:1}.swiper-pagination-white .swiper-pagination-bullet-active{background:#fff}.swiper-pagination-black .swiper-pagination-bullet-active{background:#000}.swiper-container-vertical>.swiper-pagination{right:10px;top:50%;-webkit-transform:translate3d(0,-50%,0);-moz-transform:translate3d(0,-50%,0);-o-transform:translate(0,-50%);-ms-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.swiper-container-vertical>.swiper-pagination .swiper-pagination-bullet{margin:5px 0;display:block}.swiper-container-horizontal>.swiper-pagination{bottom:10px;left:0;width:100%}.swiper-container-horizontal>.swiper-pagination .swiper-pagination-bullet{margin:0 5px}.swiper-container-3d{-webkit-perspective:1200px;-moz-perspective:1200px;-o-perspective:1200px;perspective:1200px}.swiper-container-3d .swiper-cube-shadow,.swiper-container-3d .swiper-slide,.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top,.swiper-container-3d .swiper-wrapper{-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d}.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-container-3d .swiper-slide-shadow-left{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(right,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(right,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(right,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to left,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-right{background-image:-webkit-gradient(linear,right top,left top,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(left,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(left,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to right,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-top{background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(bottom,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(bottom,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(bottom,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to top,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-bottom{background-image:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(top,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(top,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(top,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to bottom,rgba(0,0,0,.5),transparent)}.swiper-container-coverflow .swiper-wrapper{-ms-perspective:1200px}.swiper-container-fade.swiper-container-free-mode .swiper-slide{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out}.swiper-container-fade .swiper-slide,.swiper-container-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-fade .swiper-slide-active,.swiper-container-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube{overflow:visible}.swiper-container-cube .swiper-slide{pointer-events:none;visibility:hidden;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;width:100%;height:100%;z-index:1}.swiper-container-cube.swiper-container-rtl .swiper-slide{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-next,.swiper-container-cube .swiper-slide-next+.swiper-slide,.swiper-container-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-container-cube .swiper-slide-shadow-bottom,.swiper-container-cube .swiper-slide-shadow-left,.swiper-container-cube .swiper-slide-shadow-right,.swiper-container-cube .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.swiper-container-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0;width:100%;height:100%;background:#000;opacity:.6;-webkit-filter:blur(50px);filter:blur(50px);z-index:0}.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-container-horizontal>.swiper-scrollbar{position:absolute;left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-container-vertical>.swiper-scrollbar{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;-webkit-transform-origin:50%;-moz-transform-origin:50%;transform-origin:50%;-webkit-animation:swiper-preloader-spin 1s steps(12,end) infinite;-moz-animation:swiper-preloader-spin 1s steps(12,end) infinite;animation:swiper-preloader-spin 1s steps(12,end) infinite}.swiper-lazy-preloader:after{display:block;content:"";width:100%;height:100%;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");background-position:50%;-webkit-background-size:100%;background-size:100%;background-repeat:no-repeat}.swiper-lazy-preloader-white:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")}@-webkit-keyframes swiper-preloader-spin{100%{-webkit-transform:rotate(360deg)}}@keyframes swiper-preloader-spin{100%{transform:rotate(360deg)}}ion-slides{width:100%;height:100%;display:block}.slide-zoom{display:block;width:100%;text-align:center}.swiper-container{width:100%;height:100%;padding:0;overflow:hidden}.swiper-wrapper{position:absolute;left:0;top:0;width:100%;height:100%;padding:0}.swiper-slide{width:100%;height:100%;box-sizing:border-box}.swiper-slide img{width:auto;height:auto;max-width:100%;max-height:100%}.scroll-refresher{position:absolute;top:-60px;right:0;left:0;overflow:hidden;margin:auto;height:60px}.scroll-refresher .ionic-refresher-content{position:absolute;bottom:15px;left:0;width:100%;color:#666;text-align:center;font-size:30px}.scroll-refresher .ionic-refresher-content .text-pulling,.scroll-refresher .ionic-refresher-content .text-refreshing{font-size:16px;line-height:16px}.scroll-refresher .ionic-refresher-content.ionic-refresher-with-text{bottom:10px}.scroll-refresher .icon-pulling,.scroll-refresher .icon-refreshing{width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.scroll-refresher .icon-pulling{-webkit-animation-name:refresh-spin-back;animation-name:refresh-spin-back;-webkit-animation-duration:200ms;animation-duration:200ms;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:none;animation-fill-mode:none;-webkit-transform:translate3d(0,0,0) rotate(0deg);transform:translate3d(0,0,0) rotate(0deg)}.scroll-refresher .icon-refreshing,.scroll-refresher .text-refreshing{display:none}.scroll-refresher .icon-refreshing{-webkit-animation-duration:1.5s;animation-duration:1.5s}.scroll-refresher.active .icon-pulling:not(.pulling-rotation-disabled){-webkit-animation-name:refresh-spin;animation-name:refresh-spin;-webkit-transform:translate3d(0,0,0) rotate(-180deg);transform:translate3d(0,0,0) rotate(-180deg)}.scroll-refresher.active.refreshing{-webkit-transition:transform .2s;transition:transform .2s;-webkit-transform:scale(1,1);transform:scale(1,1)}.scroll-refresher.active.refreshing .icon-pulling,.scroll-refresher.active.refreshing .text-pulling{display:none}.scroll-refresher.active.refreshing .icon-refreshing,.scroll-refresher.active.refreshing .text-refreshing{display:block}.scroll-refresher.active.refreshing.refreshing-tail{-webkit-transform:scale(0,0);transform:scale(0,0)}.overflow-scroll>.scroll{-webkit-overflow-scrolling:touch;width:100%}.overflow-scroll>.scroll.overscroll{position:fixed;right:0;left:0}.overflow-scroll.padding>.scroll.overscroll{padding:10px}@-webkit-keyframes refresh-spin{0%{-webkit-transform:translate3d(0,0,0) rotate(0)}100%{-webkit-transform:translate3d(0,0,0) rotate(180deg)}}@keyframes refresh-spin{0%{transform:translate3d(0,0,0) rotate(0)}100%{transform:translate3d(0,0,0) rotate(180deg)}}@-webkit-keyframes refresh-spin-back{0%{-webkit-transform:translate3d(0,0,0) rotate(180deg)}100%{-webkit-transform:translate3d(0,0,0) rotate(0)}}@keyframes refresh-spin-back{0%{transform:translate3d(0,0,0) rotate(180deg)}100%{transform:translate3d(0,0,0) rotate(0)}}.spinner{stroke:#444;fill:#444}.spinner svg{width:28px;height:28px}.spinner.spinner-light{stroke:#fff;fill:#fff}.spinner.spinner-stable{stroke:#f8f8f8;fill:#f8f8f8}.spinner.spinner-positive{stroke:#387ef5;fill:#387ef5}.spinner.spinner-calm{stroke:#11c1f3;fill:#11c1f3}.spinner.spinner-balanced{stroke:#33cd5f;fill:#33cd5f}.spinner.spinner-assertive{stroke:#ef473a;fill:#ef473a}.spinner.spinner-energized{stroke:#ffc900;fill:#ffc900}.spinner.spinner-royal{stroke:#886aea;fill:#886aea}.spinner.spinner-dark{stroke:#444;fill:#444}.spinner-android{stroke:#4b8bf4}.spinner-ios,.spinner-ios-small{stroke:#69717d}.spinner-spiral .stop1{stop-color:#fff;stop-opacity:0}.spinner-spiral.spinner-light .stop1{stop-color:#444}.spinner-spiral.spinner-light .stop2{stop-color:#fff}.spinner-spiral.spinner-stable .stop2{stop-color:#f8f8f8}.spinner-spiral.spinner-positive .stop2{stop-color:#387ef5}.spinner-spiral.spinner-calm .stop2{stop-color:#11c1f3}.spinner-spiral.spinner-balanced .stop2{stop-color:#33cd5f}.spinner-spiral.spinner-assertive .stop2{stop-color:#ef473a}.spinner-spiral.spinner-energized .stop2{stop-color:#ffc900}.spinner-spiral.spinner-royal .stop2{stop-color:#886aea}.spinner-spiral.spinner-dark .stop2{stop-color:#444}form{margin:0 0 1.42857}legend{display:block;margin-bottom:1.42857;padding:0;width:100%;border:1px solid #ddd;color:#444;font-size:21px;line-height:2.85714}legend small{color:#f8f8f8;font-size:1.07143}button,input,label,select,textarea{font-weight:400;font-size:14px;line-height:1.42857}button,input,select,textarea{font-family:"-apple-system","Helvetica Neue",Roboto,"Segoe UI",sans-serif}.item-input{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:6px 0 5px 16px}.item-input input{-webkit-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 220px;-moz-box-flex:1;-moz-flex:1 220px;-ms-flex:1 220px;flex:1 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:0;padding-right:24px;background-color:transparent}.item-input .button .icon{-webkit-box-flex:0;-webkit-flex:0 0 24px;-moz-box-flex:0;-moz-flex:0 0 24px;-ms-flex:0 0 24px;flex:0 0 24px;position:static;display:inline-block;height:auto;text-align:center;font-size:16px}.item-input .button-bar{-webkit-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 0 220px;-moz-box-flex:1;-moz-flex:1 0 220px;-ms-flex:1 0 220px;flex:1 0 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.item-input .icon{min-width:14px}.platform-windowsphone .item-input input{flex-shrink:1}.item-input-inset{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:10.67px}.item-input-wrapper{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 0;-moz-box-flex:1;-moz-flex:1 0;-ms-flex:1 0;flex:1 0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-border-radius:4px;border-radius:4px;padding-right:8px;padding-left:8px;background:#eee}.item-input-inset .item-input-wrapper input{padding-left:4px;height:29px;background:0 0;line-height:18px}.item-input-wrapper~.button{margin-left:10.67px}.input-label{display:table;padding:7px 10px 7px 0;max-width:200px;width:35%;color:#444;font-size:16px}.placeholder-icon{color:#aaa}.placeholder-icon:first-child{padding-right:6px}.placeholder-icon:last-child{padding-left:6px}.item-stacked-label{display:block;background-color:transparent;box-shadow:none}.item-stacked-label .icon,.item-stacked-label .input-label{display:inline-block;padding:4px 0 0 0;vertical-align:middle}.item-stacked-label input,.item-stacked-label textarea{-webkit-border-radius:2px;border-radius:2px;padding:4px 8px 3px 0;border:none;background-color:#fff}.item-stacked-label input{overflow:hidden;height:46px}.item-select.item-stacked-label select{position:relative;padding:0;max-width:90%;direction:ltr;white-space:pre-wrap;margin:-3px}.item-floating-label{display:block;background-color:transparent;box-shadow:none}.item-floating-label .input-label{position:relative;padding:5px 0 0 0;opacity:0;top:10px;-webkit-transition:opacity .15s ease-in,top .2s linear;transition:opacity .15s ease-in,top .2s linear}.item-floating-label .input-label.has-input{opacity:1;top:0;-webkit-transition:opacity .15s ease-in,top .2s linear;transition:opacity .15s ease-in,top .2s linear}input[type=search],input[type=text],input[type=password],input[type=datetime],input[type=datetime-local],input[type=date],input[type=month],input[type=time],input[type=week],input[type=number],input[type=email],input[type=url],input[type=tel],input[type=color],textarea{display:block;padding-top:2px;padding-left:0;height:34px;color:#111;vertical-align:middle;font-size:14px;line-height:16px}.platform-android input[type=datetime-local],.platform-android input[type=date],.platform-android input[type=month],.platform-android input[type=time],.platform-android input[type=week],.platform-ios input[type=datetime-local],.platform-ios input[type=date],.platform-ios input[type=month],.platform-ios input[type=time],.platform-ios input[type=week]{padding-top:8px}.item-input input,.item-input textarea{width:100%}textarea{padding-left:0}textarea::-moz-placeholder{color:#aaa}textarea:-ms-input-placeholder{color:#aaa}textarea::-webkit-input-placeholder{color:#aaa;text-indent:-3px}textarea{height:auto}input[type=search],input[type=text],input[type=password],input[type=datetime],input[type=datetime-local],input[type=date],input[type=month],input[type=time],input[type=week],input[type=number],input[type=email],input[type=url],input[type=tel],input[type=color],textarea{border:0}input[type=radio],input[type=checkbox]{margin:0;line-height:normal}.item-input input[type=button],.item-input input[type=reset],.item-input input[type=submit],.item-input input[type=radio],.item-input input[type=checkbox],.item-input input[type=file],.item-input input[type=image]{width:auto}input[type=file]{line-height:34px}.cloned-text-input+input,.cloned-text-input+textarea,.previous-input-focus{position:absolute!important;left:-9999px;width:200px}input::-moz-placeholder,textarea::-moz-placeholder{color:#aaa}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#aaa}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#aaa;text-indent:0}input[disabled],input[readonly]:not(.cloned-text-input),select[disabled],select[readonly],textarea[disabled],textarea[readonly]:not(.cloned-text-input){background-color:#f8f8f8;cursor:not-allowed}input[type=radio][disabled],input[type=radio][readonly],input[type=checkbox][disabled],input[type=checkbox][readonly]{background-color:transparent}.checkbox{position:relative;display:inline-block;padding:7px 7px;cursor:pointer}.checkbox .checkbox-icon:before,.checkbox input:before{border-color:#ddd}.checkbox input:checked+.checkbox-icon:before,.checkbox input:checked:before{background:#387ef5;border-color:#387ef5}.checkbox-light .checkbox-icon:before,.checkbox-light input:before{border-color:#ddd}.checkbox-light input:checked+.checkbox-icon:before,.checkbox-light input:checked:before{background:#ddd;border-color:#ddd}.checkbox-stable .checkbox-icon:before,.checkbox-stable input:before{border-color:#b2b2b2}.checkbox-stable input:checked+.checkbox-icon:before,.checkbox-stable input:checked:before{background:#b2b2b2;border-color:#b2b2b2}.checkbox-positive .checkbox-icon:before,.checkbox-positive input:before{border-color:#387ef5}.checkbox-positive input:checked+.checkbox-icon:before,.checkbox-positive input:checked:before{background:#387ef5;border-color:#387ef5}.checkbox-calm .checkbox-icon:before,.checkbox-calm input:before{border-color:#11c1f3}.checkbox-calm input:checked+.checkbox-icon:before,.checkbox-calm input:checked:before{background:#11c1f3;border-color:#11c1f3}.checkbox-assertive .checkbox-icon:before,.checkbox-assertive input:before{border-color:#ef473a}.checkbox-assertive input:checked+.checkbox-icon:before,.checkbox-assertive input:checked:before{background:#ef473a;border-color:#ef473a}.checkbox-balanced .checkbox-icon:before,.checkbox-balanced input:before{border-color:#33cd5f}.checkbox-balanced input:checked+.checkbox-icon:before,.checkbox-balanced input:checked:before{background:#33cd5f;border-color:#33cd5f}.checkbox-energized .checkbox-icon:before,.checkbox-energized input:before{border-color:#ffc900}.checkbox-energized input:checked+.checkbox-icon:before,.checkbox-energized input:checked:before{background:#ffc900;border-color:#ffc900}.checkbox-royal .checkbox-icon:before,.checkbox-royal input:before{border-color:#886aea}.checkbox-royal input:checked+.checkbox-icon:before,.checkbox-royal input:checked:before{background:#886aea;border-color:#886aea}.checkbox-dark .checkbox-icon:before,.checkbox-dark input:before{border-color:#444}.checkbox-dark input:checked+.checkbox-icon:before,.checkbox-dark input:checked:before{background:#444;border-color:#444}.checkbox input:disabled+.checkbox-icon:before,.checkbox input:disabled:before{border-color:#ddd}.checkbox input:disabled:checked+.checkbox-icon:before,.checkbox input:disabled:checked:before{background:#ddd}.checkbox.checkbox-input-hidden input{display:none!important}.checkbox input,.checkbox-icon{position:relative;width:28px;height:28px;display:block;border:0;background:0 0;cursor:pointer;-webkit-appearance:none}.checkbox input:before,.checkbox-icon:before{display:table;width:100%;height:100%;border-width:1px;border-style:solid;border-radius:28px;background:#fff;content:' ';-webkit-transition:background-color 20ms ease-in-out;transition:background-color 20ms ease-in-out}.checkbox input:checked:before,input:checked+.checkbox-icon:before{border-width:2px}.checkbox input:after,.checkbox-icon:after{-webkit-transition:opacity .05s ease-in-out;transition:opacity .05s ease-in-out;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);position:absolute;top:33%;left:25%;display:table;width:14px;height:6px;border:1px solid #fff;border-top:0;border-right:0;content:' ';opacity:0}.checkbox-square .checkbox-icon:before,.checkbox-square input:before,.platform-android .checkbox-platform .checkbox-icon:before,.platform-android .checkbox-platform input:before{border-radius:2px;width:72%;height:72%;margin-top:14%;margin-left:14%;border-width:2px}.checkbox-square .checkbox-icon:after,.checkbox-square input:after,.platform-android .checkbox-platform .checkbox-icon:after,.platform-android .checkbox-platform input:after{border-width:2px;top:19%;left:25%;width:13px;height:7px}.platform-android .item-checkbox-right .checkbox-square .checkbox-icon::after{top:31%}.grade-c .checkbox input:after,.grade-c .checkbox-icon:after{-webkit-transform:rotate(0);transform:rotate(0);top:3px;left:4px;border:none;color:#fff;content:'\2713';font-weight:700;font-size:20px}.checkbox input:checked:after,input:checked+.checkbox-icon:after{opacity:1}.item-checkbox{padding-left:60px}.item-checkbox.active{box-shadow:none}.item-checkbox .checkbox{position:absolute;top:50%;right:8px;left:8px;z-index:3;margin-top:-21px}.item-checkbox.item-checkbox-right{padding-right:60px;padding-left:16px}.item-checkbox-right .checkbox input,.item-checkbox-right .checkbox-icon{float:right}.item-toggle{pointer-events:none}.toggle{position:relative;display:inline-block;pointer-events:auto;margin:-5px;padding:5px}.toggle input:checked+.track{border-color:#4cd964;background-color:#4cd964}.toggle.dragging .handle{background-color:#f2f2f2!important}.toggle.toggle-light input:checked+.track{border-color:#ddd;background-color:#ddd}.toggle.toggle-stable input:checked+.track{border-color:#b2b2b2;background-color:#b2b2b2}.toggle.toggle-positive input:checked+.track{border-color:#387ef5;background-color:#387ef5}.toggle.toggle-calm input:checked+.track{border-color:#11c1f3;background-color:#11c1f3}.toggle.toggle-assertive input:checked+.track{border-color:#ef473a;background-color:#ef473a}.toggle.toggle-balanced input:checked+.track{border-color:#33cd5f;background-color:#33cd5f}.toggle.toggle-energized input:checked+.track{border-color:#ffc900;background-color:#ffc900}.toggle.toggle-royal input:checked+.track{border-color:#886aea;background-color:#886aea}.toggle.toggle-dark input:checked+.track{border-color:#444;background-color:#444}.toggle input{display:none}.toggle .track{-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-property:background-color,border;transition-property:background-color,border;display:inline-block;box-sizing:border-box;width:51px;height:31px;border:solid 2px #e6e6e6;border-radius:20px;background-color:#fff;content:' ';cursor:pointer;pointer-events:none}.platform-android4_2 .toggle .track{-webkit-background-clip:padding-box}.toggle .handle{-webkit-transition:.3s cubic-bezier(0,1.1,1,1.1);transition:.3s cubic-bezier(0,1.1,1,1.1);-webkit-transition-property:background-color,transform;transition-property:background-color,transform;position:absolute;display:block;width:27px;height:27px;border-radius:27px;background-color:#fff;top:7px;left:7px;box-shadow:0 2px 7px rgba(0,0,0,.35),0 1px 1px rgba(0,0,0,.15)}.toggle .handle:before{position:absolute;top:-4px;left:-21.5px;padding:18.5px 34px;content:" "}.toggle input:checked+.track .handle{-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0);background-color:#fff}.item-toggle.active{box-shadow:none}.item-toggle,.item-toggle.item-complex .item-content{padding-right:99px}.item-toggle.item-complex{padding-right:0}.item-toggle .toggle{position:absolute;top:10px;right:16px;z-index:3}.toggle input:disabled+.track{opacity:.6}.toggle-small .track{border:0;width:34px;height:15px;background:#9e9e9e}.toggle-small input:checked+.track{background:rgba(0,150,137,.5)}.toggle-small .handle{top:2px;left:4px;width:21px;height:21px;box-shadow:0 2px 5px rgba(0,0,0,.25)}.toggle-small input:checked+.track .handle{-webkit-transform:translate3d(16px,0,0);transform:translate3d(16px,0,0);background:#009689}.toggle-small.item-toggle .toggle{top:19px}.toggle-small .toggle-light input:checked+.track{background-color:rgba(221,221,221,.5)}.toggle-small .toggle-light input:checked+.track .handle{background-color:#ddd}.toggle-small .toggle-stable input:checked+.track{background-color:rgba(178,178,178,.5)}.toggle-small .toggle-stable input:checked+.track .handle{background-color:#b2b2b2}.toggle-small .toggle-positive input:checked+.track{background-color:rgba(56,126,245,.5)}.toggle-small .toggle-positive input:checked+.track .handle{background-color:#387ef5}.toggle-small .toggle-calm input:checked+.track{background-color:rgba(17,193,243,.5)}.toggle-small .toggle-calm input:checked+.track .handle{background-color:#11c1f3}.toggle-small .toggle-assertive input:checked+.track{background-color:rgba(239,71,58,.5)}.toggle-small .toggle-assertive input:checked+.track .handle{background-color:#ef473a}.toggle-small .toggle-balanced input:checked+.track{background-color:rgba(51,205,95,.5)}.toggle-small .toggle-balanced input:checked+.track .handle{background-color:#33cd5f}.toggle-small .toggle-energized input:checked+.track{background-color:rgba(255,201,0,.5)}.toggle-small .toggle-energized input:checked+.track .handle{background-color:#ffc900}.toggle-small .toggle-royal input:checked+.track{background-color:rgba(136,106,234,.5)}.toggle-small .toggle-royal input:checked+.track .handle{background-color:#886aea}.toggle-small .toggle-dark input:checked+.track{background-color:rgba(68,68,68,.5)}.toggle-small .toggle-dark input:checked+.track .handle{background-color:#444}.item-radio{padding:0}.item-radio:hover{cursor:pointer}.item-radio .item-content{padding-right:64px}.item-radio .radio-icon{position:absolute;top:0;right:0;z-index:3;visibility:hidden;padding:14px;height:100%;font-size:24px}.item-radio input{position:absolute;left:-9999px}.item-radio input:checked+.radio-content .item-content{background:#f7f7f7}.item-radio input:checked+.radio-content .radio-icon{visibility:visible}.range input{overflow:hidden;margin-top:5px;margin-bottom:5px;padding-right:2px;padding-left:1px;width:auto;height:43px;outline:0;background:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0,#ccc),color-stop(100%,#ccc));background:linear-gradient(to right,#ccc 0,#ccc 100%);background-position:center;background-size:99% 2px;background-repeat:no-repeat;-webkit-appearance:none}.range input::-moz-focus-outer{border:0}.range input::-webkit-slider-thumb{position:relative;width:28px;height:28px;border-radius:50%;background-color:#fff;box-shadow:0 0 2px rgba(0,0,0,.3),0 3px 5px rgba(0,0,0,.2);cursor:pointer;-webkit-appearance:none;border:0}.range input::-webkit-slider-thumb:before{position:absolute;top:13px;left:-2001px;width:2000px;height:2px;background:#444;content:' '}.range input::-webkit-slider-thumb:after{position:absolute;top:-15px;left:-15px;padding:30px;content:' '}.range input::-ms-fill-lower{height:2px;background:#444}.range{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;padding:2px 11px}.range.range-light input::-webkit-slider-thumb:before{background:#ddd}.range.range-light input::-ms-fill-lower{background:#ddd}.range.range-stable input::-webkit-slider-thumb:before{background:#b2b2b2}.range.range-stable input::-ms-fill-lower{background:#b2b2b2}.range.range-positive input::-webkit-slider-thumb:before{background:#387ef5}.range.range-positive input::-ms-fill-lower{background:#387ef5}.range.range-calm input::-webkit-slider-thumb:before{background:#11c1f3}.range.range-calm input::-ms-fill-lower{background:#11c1f3}.range.range-balanced input::-webkit-slider-thumb:before{background:#33cd5f}.range.range-balanced input::-ms-fill-lower{background:#33cd5f}.range.range-assertive input::-webkit-slider-thumb:before{background:#ef473a}.range.range-assertive input::-ms-fill-lower{background:#ef473a}.range.range-energized input::-webkit-slider-thumb:before{background:#ffc900}.range.range-energized input::-ms-fill-lower{background:#ffc900}.range.range-royal input::-webkit-slider-thumb:before{background:#886aea}.range.range-royal input::-ms-fill-lower{background:#886aea}.range.range-dark input::-webkit-slider-thumb:before{background:#444}.range.range-dark input::-ms-fill-lower{background:#444}.range .icon{-webkit-box-flex:0;-webkit-flex:0;-moz-box-flex:0;-moz-flex:0;-ms-flex:0;flex:0;display:block;min-width:24px;text-align:center;font-size:24px}.range input{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;margin-right:10px;margin-left:10px}.range-label{-webkit-box-flex:0;-webkit-flex:0 0 auto;-moz-box-flex:0;-moz-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;display:block;white-space:nowrap}.range-label:first-child{padding-left:5px}.range input+.range-label{padding-right:5px;padding-left:0}.platform-windowsphone .range input{height:auto}.item-select{position:relative}.item-select select{-webkit-appearance:none;-moz-appearance:none;appearance:none;position:absolute;top:0;bottom:0;right:0;padding:0 48px 0 16px;max-width:65%;border:none;background:#fff;color:#333;text-indent:.01px;text-overflow:'';white-space:nowrap;font-size:14px;cursor:pointer;direction:rtl}.item-select select::-ms-expand{display:none}.item-select option{direction:ltr}.item-select:after{position:absolute;top:50%;right:16px;margin-top:-3px;width:0;height:0;border-top:5px solid;border-right:5px solid transparent;border-left:5px solid transparent;color:#999;content:"";pointer-events:none}.item-select.item-light select{background:#fff;color:#444}.item-select.item-stable select{background:#f8f8f8;color:#444}.item-select.item-stable .input-label,.item-select.item-stable:after{color:#666}.item-select.item-positive select{background:#387ef5;color:#fff}.item-select.item-positive .input-label,.item-select.item-positive:after{color:#fff}.item-select.item-calm select{background:#11c1f3;color:#fff}.item-select.item-calm .input-label,.item-select.item-calm:after{color:#fff}.item-select.item-assertive select{background:#ef473a;color:#fff}.item-select.item-assertive .input-label,.item-select.item-assertive:after{color:#fff}.item-select.item-balanced select{background:#33cd5f;color:#fff}.item-select.item-balanced .input-label,.item-select.item-balanced:after{color:#fff}.item-select.item-energized select{background:#ffc900;color:#fff}.item-select.item-energized .input-label,.item-select.item-energized:after{color:#fff}.item-select.item-royal select{background:#886aea;color:#fff}.item-select.item-royal .input-label,.item-select.item-royal:after{color:#fff}.item-select.item-dark select{background:#444;color:#fff}.item-select.item-dark .input-label,.item-select.item-dark:after{color:#fff}select[multiple],select[size]{height:auto}progress{display:block;margin:15px auto;width:100%}.button{border-color:transparent;background-color:#f8f8f8;color:#444;position:relative;display:inline-block;margin:0;padding:0 12px;min-width:52px;min-height:47px;border-width:1px;border-style:solid;border-radius:4px;vertical-align:top;text-align:center;text-overflow:ellipsis;font-size:16px;line-height:42px;cursor:pointer}.button:hover{color:#444;text-decoration:none}.button.activated,.button.active{border-color:#a2a2a2;background-color:#e5e5e5}.button:after{position:absolute;top:-6px;right:-6px;bottom:-6px;left:-6px;content:' '}.button .icon{vertical-align:top;pointer-events:none}.button .icon:before,.button.icon-left:before,.button.icon-right:before,.button.icon:before{display:inline-block;padding:0 0 1px 0;vertical-align:inherit;font-size:24px;line-height:41px;pointer-events:none}.button.icon-left:before{float:left;padding-right:.2em;padding-left:0}.button.icon-right:before{float:right;padding-right:0;padding-left:.2em}.button.button-block,.button.button-full{margin-top:10px;margin-bottom:10px}.button.button-light{border-color:transparent;background-color:#fff;color:#444}.button.button-light:hover{color:#444;text-decoration:none}.button.button-light.activated,.button.button-light.active{border-color:#a2a2a2;background-color:#fafafa}.button.button-light.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#ddd}.button.button-light.button-icon{border-color:transparent;background:0 0}.button.button-light.button-outline{border-color:#ddd;background:0 0;color:#ddd}.button.button-light.button-outline.activated,.button.button-light.button-outline.active{background-color:#ddd;box-shadow:none;color:#fff}.button.button-stable{border-color:transparent;background-color:#f8f8f8;color:#444}.button.button-stable:hover{color:#444;text-decoration:none}.button.button-stable.activated,.button.button-stable.active{border-color:#a2a2a2;background-color:#e5e5e5}.button.button-stable.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#b2b2b2}.button.button-stable.button-icon{border-color:transparent;background:0 0}.button.button-stable.button-outline{border-color:#b2b2b2;background:0 0;color:#b2b2b2}.button.button-stable.button-outline.activated,.button.button-stable.button-outline.active{background-color:#b2b2b2;box-shadow:none;color:#fff}.button.button-positive{border-color:transparent;background-color:#387ef5;color:#fff}.button.button-positive:hover{color:#fff;text-decoration:none}.button.button-positive.activated,.button.button-positive.active{border-color:#a2a2a2;background-color:#0c60ee}.button.button-positive.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#387ef5}.button.button-positive.button-icon{border-color:transparent;background:0 0}.button.button-positive.button-outline{border-color:#387ef5;background:0 0;color:#387ef5}.button.button-positive.button-outline.activated,.button.button-positive.button-outline.active{background-color:#387ef5;box-shadow:none;color:#fff}.button.button-calm{border-color:transparent;background-color:#11c1f3;color:#fff}.button.button-calm:hover{color:#fff;text-decoration:none}.button.button-calm.activated,.button.button-calm.active{border-color:#a2a2a2;background-color:#0a9dc7}.button.button-calm.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#11c1f3}.button.button-calm.button-icon{border-color:transparent;background:0 0}.button.button-calm.button-outline{border-color:#11c1f3;background:0 0;color:#11c1f3}.button.button-calm.button-outline.activated,.button.button-calm.button-outline.active{background-color:#11c1f3;box-shadow:none;color:#fff}.button.button-assertive{border-color:transparent;background-color:#ef473a;color:#fff}.button.button-assertive:hover{color:#fff;text-decoration:none}.button.button-assertive.activated,.button.button-assertive.active{border-color:#a2a2a2;background-color:#e42112}.button.button-assertive.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#ef473a}.button.button-assertive.button-icon{border-color:transparent;background:0 0}.button.button-assertive.button-outline{border-color:#ef473a;background:0 0;color:#ef473a}.button.button-assertive.button-outline.activated,.button.button-assertive.button-outline.active{background-color:#ef473a;box-shadow:none;color:#fff}.button.button-balanced{border-color:transparent;background-color:#33cd5f;color:#fff}.button.button-balanced:hover{color:#fff;text-decoration:none}.button.button-balanced.activated,.button.button-balanced.active{border-color:#a2a2a2;background-color:#28a54c}.button.button-balanced.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#33cd5f}.button.button-balanced.button-icon{border-color:transparent;background:0 0}.button.button-balanced.button-outline{border-color:#33cd5f;background:0 0;color:#33cd5f}.button.button-balanced.button-outline.activated,.button.button-balanced.button-outline.active{background-color:#33cd5f;box-shadow:none;color:#fff}.button.button-energized{border-color:transparent;background-color:#ffc900;color:#fff}.button.button-energized:hover{color:#fff;text-decoration:none}.button.button-energized.activated,.button.button-energized.active{border-color:#a2a2a2;background-color:#e6b500}.button.button-energized.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#ffc900}.button.button-energized.button-icon{border-color:transparent;background:0 0}.button.button-energized.button-outline{border-color:#ffc900;background:0 0;color:#ffc900}.button.button-energized.button-outline.activated,.button.button-energized.button-outline.active{background-color:#ffc900;box-shadow:none;color:#fff}.button.button-royal{border-color:transparent;background-color:#886aea;color:#fff}.button.button-royal:hover{color:#fff;text-decoration:none}.button.button-royal.activated,.button.button-royal.active{border-color:#a2a2a2;background-color:#6b46e5}.button.button-royal.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#886aea}.button.button-royal.button-icon{border-color:transparent;background:0 0}.button.button-royal.button-outline{border-color:#886aea;background:0 0;color:#886aea}.button.button-royal.button-outline.activated,.button.button-royal.button-outline.active{background-color:#886aea;box-shadow:none;color:#fff}.button.button-dark{border-color:transparent;background-color:#444;color:#fff}.button.button-dark:hover{color:#fff;text-decoration:none}.button.button-dark.activated,.button.button-dark.active{border-color:#a2a2a2;background-color:#262626}.button.button-dark.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444}.button.button-dark.button-icon{border-color:transparent;background:0 0}.button.button-dark.button-outline{border-color:#444;background:0 0;color:#444}.button.button-dark.button-outline.activated,.button.button-dark.button-outline.active{background-color:#444;box-shadow:none;color:#fff}.button-small{padding:2px 4px 1px;min-width:28px;min-height:30px;font-size:12px;line-height:26px}.button-small .icon:before,.button-small.icon-left:before,.button-small.icon-right:before,.button-small.icon:before{font-size:16px;line-height:19px;margin-top:3px}.button-large{padding:0 16px;min-width:68px;min-height:59px;font-size:20px;line-height:53px}.button-large .icon:before,.button-large.icon-left:before,.button-large.icon-right:before,.button-large.icon:before{padding-bottom:2px;font-size:32px;line-height:51px}.button-icon{-webkit-transition:opacity .1s;transition:opacity .1s;padding:0 6px;min-width:initial;border-color:transparent;background:0 0}.button-icon.button.activated,.button-icon.button.active{border-color:transparent;background:0 0;box-shadow:none;opacity:.3}.button-icon .icon:before,.button-icon.icon:before{font-size:32px}.button-clear{-webkit-transition:opacity .1s;transition:opacity .1s;padding:0 6px;max-height:42px;border-color:transparent;background:0 0;box-shadow:none}.button-clear.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:transparent}.button-clear.button-icon{border-color:transparent;background:0 0}.button-clear.activated,.button-clear.active{opacity:.3}.button-outline{-webkit-transition:opacity .1s;transition:opacity .1s;background:0 0;box-shadow:none}.button-outline.button-outline{border-color:transparent;background:0 0;color:transparent}.button-outline.button-outline.activated,.button-outline.button-outline.active{background-color:transparent;box-shadow:none;color:#fff}.padding>.button.button-block:first-child{margin-top:0}.button-block{display:block;clear:both}.button-block:after{clear:both}.button-full,.button-full>.button{display:block;margin-right:0;margin-left:0;border-right-width:0;border-left-width:0;border-radius:0}.button-full>button.button,button.button-block,button.button-full,input.button.button-block{width:100%}a.button{text-decoration:none}a.button .icon:before,a.button.icon-left:before,a.button.icon-right:before,a.button.icon:before{margin-top:2px}.button.disabled,.button[disabled]{opacity:.4;cursor:default!important;pointer-events:none}.button-bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;width:100%}.button-bar.button-bar-inline{display:block;width:auto}.button-bar.button-bar-inline:after,.button-bar.button-bar-inline:before{display:table;content:"";line-height:0}.button-bar.button-bar-inline:after{clear:both}.button-bar.button-bar-inline>.button{width:auto;display:inline-block;float:left}.button-bar.bar-light>.button{border-color:#ddd}.button-bar.bar-stable>.button{border-color:#b2b2b2}.button-bar.bar-positive>.button{border-color:#0c60ee}.button-bar.bar-calm>.button{border-color:#0a9dc7}.button-bar.bar-assertive>.button{border-color:#e42112}.button-bar.bar-balanced>.button{border-color:#28a54c}.button-bar.bar-energized>.button{border-color:#e6b500}.button-bar.bar-royal>.button{border-color:#6b46e5}.button-bar.bar-dark>.button{border-color:#111}.button-bar>.button{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;padding:0 16px;width:0;border-width:1px 0 1px 1px;border-radius:0;text-align:center;text-overflow:ellipsis;white-space:nowrap}.button-bar>.button .icon:before,.button-bar>.button:before{line-height:44px}.button-bar>.button:first-child{border-radius:4px 0 0 4px}.button-bar>.button:last-child{border-right-width:1px;border-radius:0 4px 4px 0}.button-bar>.button:only-child{border-radius:4px}.button-bar>.button-small .icon:before,.button-bar>.button-small:before{line-height:28px}.row{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:5px;width:100%}.row-wrap{-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.row-no-padding,.row-no-padding>.col{padding:0}.row+.row{margin-top:-5px;padding-top:0}.col{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;padding:5px;width:100%}.row-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;-moz-align-items:flex-start;align-items:flex-start}.row-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;-moz-align-items:flex-end;align-items:flex-end}.row-center{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}.row-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;-moz-align-items:stretch;align-items:stretch}.row-baseline{-webkit-box-align:baseline;-ms-flex-align:baseline;-webkit-align-items:baseline;-moz-align-items:baseline;align-items:baseline}.col-top{-webkit-align-self:flex-start;-moz-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.col-bottom{-webkit-align-self:flex-end;-moz-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.col-center{-webkit-align-self:center;-moz-align-self:center;-ms-flex-item-align:center;align-self:center}.col-offset-10{margin-left:10%}.col-offset-20{margin-left:20%}.col-offset-25{margin-left:25%}.col-offset-33,.col-offset-34{margin-left:33.3333%}.col-offset-50{margin-left:50%}.col-offset-66,.col-offset-67{margin-left:66.6666%}.col-offset-75{margin-left:75%}.col-offset-80{margin-left:80%}.col-offset-90{margin-left:90%}.col-10{-webkit-box-flex:0;-webkit-flex:0 0 10%;-moz-box-flex:0;-moz-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%;max-width:10%}.col-20{-webkit-box-flex:0;-webkit-flex:0 0 20%;-moz-box-flex:0;-moz-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.col-25{-webkit-box-flex:0;-webkit-flex:0 0 25%;-moz-box-flex:0;-moz-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-33,.col-34{-webkit-box-flex:0;-webkit-flex:0 0 33.3333%;-moz-box-flex:0;-moz-flex:0 0 33.3333%;-ms-flex:0 0 33.3333%;flex:0 0 33.3333%;max-width:33.3333%}.col-40{-webkit-box-flex:0;-webkit-flex:0 0 40%;-moz-box-flex:0;-moz-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%;max-width:40%}.col-50{-webkit-box-flex:0;-webkit-flex:0 0 50%;-moz-box-flex:0;-moz-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-60{-webkit-box-flex:0;-webkit-flex:0 0 60%;-moz-box-flex:0;-moz-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%;max-width:60%}.col-66,.col-67{-webkit-box-flex:0;-webkit-flex:0 0 66.6666%;-moz-box-flex:0;-moz-flex:0 0 66.6666%;-ms-flex:0 0 66.6666%;flex:0 0 66.6666%;max-width:66.6666%}.col-75{-webkit-box-flex:0;-webkit-flex:0 0 75%;-moz-box-flex:0;-moz-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-80{-webkit-box-flex:0;-webkit-flex:0 0 80%;-moz-box-flex:0;-moz-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%;max-width:80%}.col-90{-webkit-box-flex:0;-webkit-flex:0 0 90%;-moz-box-flex:0;-moz-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%;max-width:90%}@media (max-width:567px){.responsive-sm{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-sm .col,.responsive-sm .col-10,.responsive-sm .col-20,.responsive-sm .col-25,.responsive-sm .col-33,.responsive-sm .col-34,.responsive-sm .col-50,.responsive-sm .col-66,.responsive-sm .col-67,.responsive-sm .col-75,.responsive-sm .col-80,.responsive-sm .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}@media (max-width:767px){.responsive-md{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-md .col,.responsive-md .col-10,.responsive-md .col-20,.responsive-md .col-25,.responsive-md .col-33,.responsive-md .col-34,.responsive-md .col-50,.responsive-md .col-66,.responsive-md .col-67,.responsive-md .col-75,.responsive-md .col-80,.responsive-md .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}@media (max-width:1023px){.responsive-lg{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-lg .col,.responsive-lg .col-10,.responsive-lg .col-20,.responsive-lg .col-25,.responsive-lg .col-33,.responsive-lg .col-34,.responsive-lg .col-50,.responsive-lg .col-66,.responsive-lg .col-67,.responsive-lg .col-75,.responsive-lg .col-80,.responsive-lg .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}.hide{display:none}.opacity-hide{opacity:0}.grade-b .opacity-hide,.grade-c .opacity-hide{opacity:1;display:none}.show{display:block}.opacity-show{opacity:1}.invisible{visibility:hidden}.keyboard-open .hide-on-keyboard-open{display:none}.keyboard-open .bar-footer.hide-on-keyboard-open+.pane .has-footer,.keyboard-open .tabs.hide-on-keyboard-open+.pane .has-tabs{bottom:0}.inline{display:inline-block}.disable-pointer-events{pointer-events:none}.enable-pointer-events{pointer-events:auto}.disable-user-behavior{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent;-webkit-user-drag:none;-ms-touch-action:none;-ms-content-zooming:none}.click-block{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;z-index:99999;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);overflow:hidden}.click-block-hide{-webkit-transform:translate3d(-9999px,0,0);transform:translate3d(-9999px,0,0)}.no-resize{resize:none}.block{display:block;clear:both}.block:after{display:block;visibility:hidden;clear:both;height:0;content:"."}.full-image{width:100%}.clearfix:after,.clearfix:before{display:table;content:"";line-height:0}.clearfix:after{clear:both}.padding{padding:10px}.padding-top,.padding-vertical{padding-top:10px}.padding-horizontal,.padding-right{padding-right:10px}.padding-bottom,.padding-vertical{padding-bottom:10px}.padding-horizontal,.padding-left{padding-left:10px}.iframe-wrapper{position:fixed;-webkit-overflow-scrolling:touch;overflow:scroll}.iframe-wrapper iframe{height:100%;width:100%}.rounded{border-radius:4px}.light,a.light{color:#fff}.light-bg{background-color:#fff}.light-border{border-color:#ddd}.stable,a.stable{color:#f8f8f8}.stable-bg{background-color:#f8f8f8}.stable-border{border-color:#b2b2b2}.positive,a.positive{color:#387ef5}.positive-bg{background-color:#387ef5}.positive-border{border-color:#0c60ee}.calm,a.calm{color:#11c1f3}.calm-bg{background-color:#11c1f3}.calm-border{border-color:#0a9dc7}.assertive,a.assertive{color:#ef473a}.assertive-bg{background-color:#ef473a}.assertive-border{border-color:#e42112}.balanced,a.balanced{color:#33cd5f}.balanced-bg{background-color:#33cd5f}.balanced-border{border-color:#28a54c}.energized,a.energized{color:#ffc900}.energized-bg{background-color:#ffc900}.energized-border{border-color:#e6b500}.royal,a.royal{color:#886aea}.royal-bg{background-color:#886aea}.royal-border{border-color:#6b46e5}.dark,a.dark{color:#444}.dark-bg{background-color:#444}.dark-border{border-color:#111}[collection-repeat]{left:0!important;top:0!important;position:absolute!important;z-index:1}.collection-repeat-container{position:relative;z-index:1}.collection-repeat-after-container{z-index:0;display:block}.collection-repeat-after-container.horizontal{display:inline-block}.ng-cloak,.ng-hide:not(.ng-hide-animate),.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader){height:64px}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader).item-input-inset .item-input-wrapper{margin-top:19px!important}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader)>*{margin-top:20px}.platform-ios.platform-cordova:not(.fullscreen) .bar-subheader,.platform-ios.platform-cordova:not(.fullscreen) .has-header,.platform-ios.platform-cordova:not(.fullscreen) .tabs-top>.tabs,.platform-ios.platform-cordova:not(.fullscreen) .tabs.tabs-top{top:64px}.platform-ios.platform-cordova:not(.fullscreen) .has-subheader{top:108px}.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-tabs-top{top:113px}.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-subheader.has-tabs-top{top:157px}.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader){height:44px}.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader).item-input-inset .item-input-wrapper{margin-top:-1px}.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader)>*{margin-top:0}.platform-ios.platform-cordova .popover .bar-subheader,.platform-ios.platform-cordova .popover .has-header{top:44px}.platform-ios.platform-cordova .popover .has-subheader{top:88px}.platform-ios.platform-cordova.status-bar-hide{margin-bottom:20px}@media (orientation:landscape){.platform-ios.platform-browser.platform-ipad{position:fixed}}.platform-c:not(.enable-transitions) *{-webkit-transition:none!important;transition:none!important}.slide-in-up{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.slide-in-up.ng-enter,.slide-in-up>.ng-enter{-webkit-transition:all cubic-bezier(.1,.7,.1,1) 400ms;transition:all cubic-bezier(.1,.7,.1,1) 400ms}.slide-in-up.ng-enter-active,.slide-in-up>.ng-enter-active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-in-up.ng-leave,.slide-in-up>.ng-leave{-webkit-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms}@-webkit-keyframes scaleOut{from{-webkit-transform:scale(1);opacity:1}to{-webkit-transform:scale(.8);opacity:0}}@keyframes scaleOut{from{transform:scale(1);opacity:1}to{transform:scale(.8);opacity:0}}@-webkit-keyframes superScaleIn{from{-webkit-transform:scale(1.2);opacity:0}to{-webkit-transform:scale(1);opacity:1}}@keyframes superScaleIn{from{transform:scale(1.2);opacity:0}to{transform:scale(1);opacity:1}}[nav-view-transition=ios] [nav-view=entering],[nav-view-transition=ios] [nav-view=leaving]{-webkit-transition-duration:500ms;transition-duration:500ms;-webkit-transition-timing-function:cubic-bezier(.36,.66,.04,1);transition-timing-function:cubic-bezier(.36,.66,.04,1);-webkit-transition-property:opacity,-webkit-transform,box-shadow;transition-property:opacity,transform,box-shadow}[nav-view-transition=ios][nav-view-direction=forward],[nav-view-transition=ios][nav-view-direction=back]{background-color:#000}[nav-view-transition=ios] [nav-view=active],[nav-view-transition=ios][nav-view-direction=forward] [nav-view=entering],[nav-view-transition=ios][nav-view-direction=back] [nav-view=leaving]{z-index:3}[nav-view-transition=ios][nav-view-direction=forward] [nav-view=leaving],[nav-view-transition=ios][nav-view-direction=back] [nav-view=entering]{z-index:2}[nav-bar-transition=ios] .back-text,[nav-bar-transition=ios] .buttons,[nav-bar-transition=ios] .title{-webkit-transition-duration:500ms;transition-duration:500ms;-webkit-transition-timing-function:cubic-bezier(.36,.66,.04,1);transition-timing-function:cubic-bezier(.36,.66,.04,1);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,transform}[nav-bar-transition=ios] [nav-bar=entering],[nav-bar-transition=ios] [nav-bar=active]{z-index:10}[nav-bar-transition=ios] [nav-bar=entering] .bar,[nav-bar-transition=ios] [nav-bar=active] .bar{background:0 0}[nav-bar-transition=ios] [nav-bar=cached]{display:block}[nav-bar-transition=ios] [nav-bar=cached] .header-item{display:none}[nav-view-transition=android] [nav-view=entering],[nav-view-transition=android] [nav-view=leaving]{-webkit-transition-duration:200ms;transition-duration:200ms;-webkit-transition-timing-function:cubic-bezier(.4,.6,.2,1);transition-timing-function:cubic-bezier(.4,.6,.2,1);-webkit-transition-property:-webkit-transform;transition-property:transform}[nav-view-transition=android] [nav-view=active],[nav-view-transition=android][nav-view-direction=forward] [nav-view=entering],[nav-view-transition=android][nav-view-direction=back] [nav-view=leaving]{z-index:3}[nav-view-transition=android][nav-view-direction=forward] [nav-view=leaving],[nav-view-transition=android][nav-view-direction=back] [nav-view=entering]{z-index:2}[nav-bar-transition=android] .buttons,[nav-bar-transition=android] .title{-webkit-transition-duration:200ms;transition-duration:200ms;-webkit-transition-timing-function:cubic-bezier(.4,.6,.2,1);transition-timing-function:cubic-bezier(.4,.6,.2,1);-webkit-transition-property:opacity;transition-property:opacity}[nav-bar-transition=android] [nav-bar=entering],[nav-bar-transition=android] [nav-bar=active]{z-index:10}[nav-bar-transition=android] [nav-bar=entering] .bar,[nav-bar-transition=android] [nav-bar=active] .bar{background:0 0}[nav-bar-transition=android] [nav-bar=cached]{display:block}[nav-bar-transition=android] [nav-bar=cached] .header-item{display:none}[nav-swipe=fast] .back-text,[nav-swipe=fast] .buttons,[nav-swipe=fast] .title,[nav-swipe=fast] [nav-view]{-webkit-transition-duration:50ms;transition-duration:50ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}[nav-swipe=slow] .back-text,[nav-swipe=slow] .buttons,[nav-swipe=slow] .title,[nav-swipe=slow] [nav-view]{-webkit-transition-duration:160ms;transition-duration:160ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}[nav-bar=cached],[nav-view=cached]{display:none}[nav-view=stage]{opacity:0;-webkit-transition-duration:0;transition-duration:0}[nav-bar=stage] .back-text,[nav-bar=stage] .buttons,[nav-bar=stage] .title{position:absolute;opacity:0;-webkit-transition-duration:0s;transition-duration:0s}
\ No newline at end of file
diff --git a/www/lib/ionic/fonts/ionicons.eot b/www/lib/ionic/fonts/ionicons.eot
new file mode 100644
index 0000000..92a3f20
Binary files /dev/null and b/www/lib/ionic/fonts/ionicons.eot differ
diff --git a/www/lib/ionic/fonts/ionicons.svg b/www/lib/ionic/fonts/ionicons.svg
new file mode 100644
index 0000000..49fc8f3
--- /dev/null
+++ b/www/lib/ionic/fonts/ionicons.svg
@@ -0,0 +1,2230 @@
+
+
+
+
diff --git a/www/lib/ionic/fonts/ionicons.ttf b/www/lib/ionic/fonts/ionicons.ttf
new file mode 100644
index 0000000..c4e4632
Binary files /dev/null and b/www/lib/ionic/fonts/ionicons.ttf differ
diff --git a/www/lib/ionic/fonts/ionicons.woff b/www/lib/ionic/fonts/ionicons.woff
new file mode 100644
index 0000000..5f3a14e
Binary files /dev/null and b/www/lib/ionic/fonts/ionicons.woff differ
diff --git a/www/lib/ionic/js/angular-ui/angular-ui-router.js b/www/lib/ionic/js/angular-ui/angular-ui-router.js
new file mode 100644
index 0000000..d2636f8
--- /dev/null
+++ b/www/lib/ionic/js/angular-ui/angular-ui-router.js
@@ -0,0 +1,4232 @@
+/**
+ * State-based routing for AngularJS
+ * @version v0.2.13
+ * @link http://angular-ui.github.com/
+ * @license MIT License, http://www.opensource.org/licenses/MIT
+ */
+
+/* commonjs package manager support (eg componentjs) */
+if (typeof module !== "undefined" && typeof exports !== "undefined" && module.exports === exports){
+ module.exports = 'ui.router';
+}
+
+(function (window, angular, undefined) {
+/*jshint globalstrict:true*/
+/*global angular:false*/
+'use strict';
+
+var isDefined = angular.isDefined,
+ isFunction = angular.isFunction,
+ isString = angular.isString,
+ isObject = angular.isObject,
+ isArray = angular.isArray,
+ forEach = angular.forEach,
+ extend = angular.extend,
+ copy = angular.copy;
+
+function inherit(parent, extra) {
+ return extend(new (extend(function() {}, { prototype: parent }))(), extra);
+}
+
+function merge(dst) {
+ forEach(arguments, function(obj) {
+ if (obj !== dst) {
+ forEach(obj, function(value, key) {
+ if (!dst.hasOwnProperty(key)) dst[key] = value;
+ });
+ }
+ });
+ return dst;
+}
+
+/**
+ * Finds the common ancestor path between two states.
+ *
+ * @param {Object} first The first state.
+ * @param {Object} second The second state.
+ * @return {Array} Returns an array of state names in descending order, not including the root.
+ */
+function ancestors(first, second) {
+ var path = [];
+
+ for (var n in first.path) {
+ if (first.path[n] !== second.path[n]) break;
+ path.push(first.path[n]);
+ }
+ return path;
+}
+
+/**
+ * IE8-safe wrapper for `Object.keys()`.
+ *
+ * @param {Object} object A JavaScript object.
+ * @return {Array} Returns the keys of the object as an array.
+ */
+function objectKeys(object) {
+ if (Object.keys) {
+ return Object.keys(object);
+ }
+ var result = [];
+
+ angular.forEach(object, function(val, key) {
+ result.push(key);
+ });
+ return result;
+}
+
+/**
+ * IE8-safe wrapper for `Array.prototype.indexOf()`.
+ *
+ * @param {Array} array A JavaScript array.
+ * @param {*} value A value to search the array for.
+ * @return {Number} Returns the array index value of `value`, or `-1` if not present.
+ */
+function indexOf(array, value) {
+ if (Array.prototype.indexOf) {
+ return array.indexOf(value, Number(arguments[2]) || 0);
+ }
+ var len = array.length >>> 0, from = Number(arguments[2]) || 0;
+ from = (from < 0) ? Math.ceil(from) : Math.floor(from);
+
+ if (from < 0) from += len;
+
+ for (; from < len; from++) {
+ if (from in array && array[from] === value) return from;
+ }
+ return -1;
+}
+
+/**
+ * Merges a set of parameters with all parameters inherited between the common parents of the
+ * current state and a given destination state.
+ *
+ * @param {Object} currentParams The value of the current state parameters ($stateParams).
+ * @param {Object} newParams The set of parameters which will be composited with inherited params.
+ * @param {Object} $current Internal definition of object representing the current state.
+ * @param {Object} $to Internal definition of object representing state to transition to.
+ */
+function inheritParams(currentParams, newParams, $current, $to) {
+ var parents = ancestors($current, $to), parentParams, inherited = {}, inheritList = [];
+
+ for (var i in parents) {
+ if (!parents[i].params) continue;
+ parentParams = objectKeys(parents[i].params);
+ if (!parentParams.length) continue;
+
+ for (var j in parentParams) {
+ if (indexOf(inheritList, parentParams[j]) >= 0) continue;
+ inheritList.push(parentParams[j]);
+ inherited[parentParams[j]] = currentParams[parentParams[j]];
+ }
+ }
+ return extend({}, inherited, newParams);
+}
+
+/**
+ * Performs a non-strict comparison of the subset of two objects, defined by a list of keys.
+ *
+ * @param {Object} a The first object.
+ * @param {Object} b The second object.
+ * @param {Array} keys The list of keys within each object to compare. If the list is empty or not specified,
+ * it defaults to the list of keys in `a`.
+ * @return {Boolean} Returns `true` if the keys match, otherwise `false`.
+ */
+function equalForKeys(a, b, keys) {
+ if (!keys) {
+ keys = [];
+ for (var n in a) keys.push(n); // Used instead of Object.keys() for IE8 compatibility
+ }
+
+ for (var i=0; i
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+angular.module('ui.router', ['ui.router.state']);
+
+angular.module('ui.router.compat', ['ui.router']);
+
+/**
+ * @ngdoc object
+ * @name ui.router.util.$resolve
+ *
+ * @requires $q
+ * @requires $injector
+ *
+ * @description
+ * Manages resolution of (acyclic) graphs of promises.
+ */
+$Resolve.$inject = ['$q', '$injector'];
+function $Resolve( $q, $injector) {
+
+ var VISIT_IN_PROGRESS = 1,
+ VISIT_DONE = 2,
+ NOTHING = {},
+ NO_DEPENDENCIES = [],
+ NO_LOCALS = NOTHING,
+ NO_PARENT = extend($q.when(NOTHING), { $$promises: NOTHING, $$values: NOTHING });
+
+
+ /**
+ * @ngdoc function
+ * @name ui.router.util.$resolve#study
+ * @methodOf ui.router.util.$resolve
+ *
+ * @description
+ * Studies a set of invocables that are likely to be used multiple times.
+ *
+ * but the former is more efficient (in fact `resolve` just calls `study`
+ * internally).
+ *
+ * @param {object} invocables Invocable objects
+ * @return {function} a function to pass in locals, parent and self
+ */
+ this.study = function (invocables) {
+ if (!isObject(invocables)) throw new Error("'invocables' must be an object");
+ var invocableKeys = objectKeys(invocables || {});
+
+ // Perform a topological sort of invocables to build an ordered plan
+ var plan = [], cycle = [], visited = {};
+ function visit(value, key) {
+ if (visited[key] === VISIT_DONE) return;
+
+ cycle.push(key);
+ if (visited[key] === VISIT_IN_PROGRESS) {
+ cycle.splice(0, indexOf(cycle, key));
+ throw new Error("Cyclic dependency: " + cycle.join(" -> "));
+ }
+ visited[key] = VISIT_IN_PROGRESS;
+
+ if (isString(value)) {
+ plan.push(key, [ function() { return $injector.get(value); }], NO_DEPENDENCIES);
+ } else {
+ var params = $injector.annotate(value);
+ forEach(params, function (param) {
+ if (param !== key && invocables.hasOwnProperty(param)) visit(invocables[param], param);
+ });
+ plan.push(key, value, params);
+ }
+
+ cycle.pop();
+ visited[key] = VISIT_DONE;
+ }
+ forEach(invocables, visit);
+ invocables = cycle = visited = null; // plan is all that's required
+
+ function isResolve(value) {
+ return isObject(value) && value.then && value.$$promises;
+ }
+
+ return function (locals, parent, self) {
+ if (isResolve(locals) && self === undefined) {
+ self = parent; parent = locals; locals = null;
+ }
+ if (!locals) locals = NO_LOCALS;
+ else if (!isObject(locals)) {
+ throw new Error("'locals' must be an object");
+ }
+ if (!parent) parent = NO_PARENT;
+ else if (!isResolve(parent)) {
+ throw new Error("'parent' must be a promise returned by $resolve.resolve()");
+ }
+
+ // To complete the overall resolution, we have to wait for the parent
+ // promise and for the promise for each invokable in our plan.
+ var resolution = $q.defer(),
+ result = resolution.promise,
+ promises = result.$$promises = {},
+ values = extend({}, locals),
+ wait = 1 + plan.length/3,
+ merged = false;
+
+ function done() {
+ // Merge parent values we haven't got yet and publish our own $$values
+ if (!--wait) {
+ if (!merged) merge(values, parent.$$values);
+ result.$$values = values;
+ result.$$promises = result.$$promises || true; // keep for isResolve()
+ delete result.$$inheritedValues;
+ resolution.resolve(values);
+ }
+ }
+
+ function fail(reason) {
+ result.$$failure = reason;
+ resolution.reject(reason);
+ }
+
+ // Short-circuit if parent has already failed
+ if (isDefined(parent.$$failure)) {
+ fail(parent.$$failure);
+ return result;
+ }
+
+ if (parent.$$inheritedValues) {
+ merge(values, omit(parent.$$inheritedValues, invocableKeys));
+ }
+
+ // Merge parent values if the parent has already resolved, or merge
+ // parent promises and wait if the parent resolve is still in progress.
+ extend(promises, parent.$$promises);
+ if (parent.$$values) {
+ merged = merge(values, omit(parent.$$values, invocableKeys));
+ result.$$inheritedValues = omit(parent.$$values, invocableKeys);
+ done();
+ } else {
+ if (parent.$$inheritedValues) {
+ result.$$inheritedValues = omit(parent.$$inheritedValues, invocableKeys);
+ }
+ parent.then(done, fail);
+ }
+
+ // Process each invocable in the plan, but ignore any where a local of the same name exists.
+ for (var i=0, ii=plan.length; i} The template html as a string, or a promise
+ * for that string.
+ */
+ this.fromUrl = function (url, params) {
+ if (isFunction(url)) url = url(params);
+ if (url == null) return null;
+ else return $http
+ .get(url, { cache: $templateCache, headers: { Accept: 'text/html' }})
+ .then(function(response) { return response.data; });
+ };
+
+ /**
+ * @ngdoc function
+ * @name ui.router.util.$templateFactory#fromProvider
+ * @methodOf ui.router.util.$templateFactory
+ *
+ * @description
+ * Creates a template by invoking an injectable provider function.
+ *
+ * @param {Function} provider Function to invoke via `$injector.invoke`
+ * @param {Object} params Parameters for the template.
+ * @param {Object} locals Locals to pass to `invoke`. Defaults to
+ * `{ params: params }`.
+ * @return {string|Promise.} The template html as a string, or a promise
+ * for that string.
+ */
+ this.fromProvider = function (provider, params, locals) {
+ return $injector.invoke(provider, null, locals || { params: params });
+ };
+}
+
+angular.module('ui.router.util').service('$templateFactory', $TemplateFactory);
+
+var $$UMFP; // reference to $UrlMatcherFactoryProvider
+
+/**
+ * @ngdoc object
+ * @name ui.router.util.type:UrlMatcher
+ *
+ * @description
+ * Matches URLs against patterns and extracts named parameters from the path or the search
+ * part of the URL. A URL pattern consists of a path pattern, optionally followed by '?' and a list
+ * of search parameters. Multiple search parameter names are separated by '&'. Search parameters
+ * do not influence whether or not a URL is matched, but their values are passed through into
+ * the matched parameters returned by {@link ui.router.util.type:UrlMatcher#methods_exec exec}.
+ *
+ * Path parameter placeholders can be specified using simple colon/catch-all syntax or curly brace
+ * syntax, which optionally allows a regular expression for the parameter to be specified:
+ *
+ * * `':'` name - colon placeholder
+ * * `'*'` name - catch-all placeholder
+ * * `'{' name '}'` - curly placeholder
+ * * `'{' name ':' regexp|type '}'` - curly placeholder with regexp or type name. Should the
+ * regexp itself contain curly braces, they must be in matched pairs or escaped with a backslash.
+ *
+ * Parameter names may contain only word characters (latin letters, digits, and underscore) and
+ * must be unique within the pattern (across both path and search parameters). For colon
+ * placeholders or curly placeholders without an explicit regexp, a path parameter matches any
+ * number of characters other than '/'. For catch-all placeholders the path parameter matches
+ * any number of characters.
+ *
+ * Examples:
+ *
+ * * `'/hello/'` - Matches only if the path is exactly '/hello/'. There is no special treatment for
+ * trailing slashes, and patterns have to match the entire path, not just a prefix.
+ * * `'/user/:id'` - Matches '/user/bob' or '/user/1234!!!' or even '/user/' but not '/user' or
+ * '/user/bob/details'. The second path segment will be captured as the parameter 'id'.
+ * * `'/user/{id}'` - Same as the previous example, but using curly brace syntax.
+ * * `'/user/{id:[^/]*}'` - Same as the previous example.
+ * * `'/user/{id:[0-9a-fA-F]{1,8}}'` - Similar to the previous example, but only matches if the id
+ * parameter consists of 1 to 8 hex digits.
+ * * `'/files/{path:.*}'` - Matches any URL starting with '/files/' and captures the rest of the
+ * path into the parameter 'path'.
+ * * `'/files/*path'` - ditto.
+ * * `'/calendar/{start:date}'` - Matches "/calendar/2014-11-12" (because the pattern defined
+ * in the built-in `date` Type matches `2014-11-12`) and provides a Date object in $stateParams.start
+ *
+ * @param {string} pattern The pattern to compile into a matcher.
+ * @param {Object} config A configuration object hash:
+ * @param {Object=} parentMatcher Used to concatenate the pattern/config onto
+ * an existing UrlMatcher
+ *
+ * * `caseInsensitive` - `true` if URL matching should be case insensitive, otherwise `false`, the default value (for backward compatibility) is `false`.
+ * * `strict` - `false` if matching against a URL with a trailing slash should be treated as equivalent to a URL without a trailing slash, the default value is `true`.
+ *
+ * @property {string} prefix A static prefix of this pattern. The matcher guarantees that any
+ * URL matching this matcher (i.e. any string for which {@link ui.router.util.type:UrlMatcher#methods_exec exec()} returns
+ * non-null) will start with this prefix.
+ *
+ * @property {string} source The pattern that was passed into the constructor
+ *
+ * @property {string} sourcePath The path portion of the source property
+ *
+ * @property {string} sourceSearch The search portion of the source property
+ *
+ * @property {string} regex The constructed regex that will be used to match against the url when
+ * it is time to determine which url will match.
+ *
+ * @returns {Object} New `UrlMatcher` object
+ */
+function UrlMatcher(pattern, config, parentMatcher) {
+ config = extend({ params: {} }, isObject(config) ? config : {});
+
+ // Find all placeholders and create a compiled pattern, using either classic or curly syntax:
+ // '*' name
+ // ':' name
+ // '{' name '}'
+ // '{' name ':' regexp '}'
+ // The regular expression is somewhat complicated due to the need to allow curly braces
+ // inside the regular expression. The placeholder regexp breaks down as follows:
+ // ([:*])([\w\[\]]+) - classic placeholder ($1 / $2) (search version has - for snake-case)
+ // \{([\w\[\]]+)(?:\:( ... ))?\} - curly brace placeholder ($3) with optional regexp/type ... ($4) (search version has - for snake-case
+ // (?: ... | ... | ... )+ - the regexp consists of any number of atoms, an atom being either
+ // [^{}\\]+ - anything other than curly braces or backslash
+ // \\. - a backslash escape
+ // \{(?:[^{}\\]+|\\.)*\} - a matched set of curly braces containing other atoms
+ var placeholder = /([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,
+ searchPlaceholder = /([:]?)([\w\[\]-]+)|\{([\w\[\]-]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,
+ compiled = '^', last = 0, m,
+ segments = this.segments = [],
+ parentParams = parentMatcher ? parentMatcher.params : {},
+ params = this.params = parentMatcher ? parentMatcher.params.$$new() : new $$UMFP.ParamSet(),
+ paramNames = [];
+
+ function addParameter(id, type, config, location) {
+ paramNames.push(id);
+ if (parentParams[id]) return parentParams[id];
+ if (!/^\w+(-+\w+)*(?:\[\])?$/.test(id)) throw new Error("Invalid parameter name '" + id + "' in pattern '" + pattern + "'");
+ if (params[id]) throw new Error("Duplicate parameter name '" + id + "' in pattern '" + pattern + "'");
+ params[id] = new $$UMFP.Param(id, type, config, location);
+ return params[id];
+ }
+
+ function quoteRegExp(string, pattern, squash) {
+ var surroundPattern = ['',''], result = string.replace(/[\\\[\]\^$*+?.()|{}]/g, "\\$&");
+ if (!pattern) return result;
+ switch(squash) {
+ case false: surroundPattern = ['(', ')']; break;
+ case true: surroundPattern = ['?(', ')?']; break;
+ default: surroundPattern = ['(' + squash + "|", ')?']; break;
+ }
+ return result + surroundPattern[0] + pattern + surroundPattern[1];
+ }
+
+ this.source = pattern;
+
+ // Split into static segments separated by path parameter placeholders.
+ // The number of segments is always 1 more than the number of parameters.
+ function matchDetails(m, isSearch) {
+ var id, regexp, segment, type, cfg, arrayMode;
+ id = m[2] || m[3]; // IE[78] returns '' for unmatched groups instead of null
+ cfg = config.params[id];
+ segment = pattern.substring(last, m.index);
+ regexp = isSearch ? m[4] : m[4] || (m[1] == '*' ? '.*' : null);
+ type = $$UMFP.type(regexp || "string") || inherit($$UMFP.type("string"), { pattern: new RegExp(regexp) });
+ return {
+ id: id, regexp: regexp, segment: segment, type: type, cfg: cfg
+ };
+ }
+
+ var p, param, segment;
+ while ((m = placeholder.exec(pattern))) {
+ p = matchDetails(m, false);
+ if (p.segment.indexOf('?') >= 0) break; // we're into the search part
+
+ param = addParameter(p.id, p.type, p.cfg, "path");
+ compiled += quoteRegExp(p.segment, param.type.pattern.source, param.squash);
+ segments.push(p.segment);
+ last = placeholder.lastIndex;
+ }
+ segment = pattern.substring(last);
+
+ // Find any search parameter names and remove them from the last segment
+ var i = segment.indexOf('?');
+
+ if (i >= 0) {
+ var search = this.sourceSearch = segment.substring(i);
+ segment = segment.substring(0, i);
+ this.sourcePath = pattern.substring(0, last + i);
+
+ if (search.length > 0) {
+ last = 0;
+ while ((m = searchPlaceholder.exec(search))) {
+ p = matchDetails(m, true);
+ param = addParameter(p.id, p.type, p.cfg, "search");
+ last = placeholder.lastIndex;
+ // check if ?&
+ }
+ }
+ } else {
+ this.sourcePath = pattern;
+ this.sourceSearch = '';
+ }
+
+ compiled += quoteRegExp(segment) + (config.strict === false ? '\/?' : '') + '$';
+ segments.push(segment);
+
+ this.regexp = new RegExp(compiled, config.caseInsensitive ? 'i' : undefined);
+ this.prefix = segments[0];
+ this.$$paramNames = paramNames;
+}
+
+/**
+ * @ngdoc function
+ * @name ui.router.util.type:UrlMatcher#concat
+ * @methodOf ui.router.util.type:UrlMatcher
+ *
+ * @description
+ * Returns a new matcher for a pattern constructed by appending the path part and adding the
+ * search parameters of the specified pattern to this pattern. The current pattern is not
+ * modified. This can be understood as creating a pattern for URLs that are relative to (or
+ * suffixes of) the current pattern.
+ *
+ * @example
+ * The following two matchers are equivalent:
+ *
+ * new UrlMatcher('/user/{id}?q').concat('/details?date');
+ * new UrlMatcher('/user/{id}/details?q&date');
+ *
+ *
+ * @param {string} pattern The pattern to append.
+ * @param {Object} config An object hash of the configuration for the matcher.
+ * @returns {UrlMatcher} A matcher for the concatenated pattern.
+ */
+UrlMatcher.prototype.concat = function (pattern, config) {
+ // Because order of search parameters is irrelevant, we can add our own search
+ // parameters to the end of the new pattern. Parse the new pattern by itself
+ // and then join the bits together, but it's much easier to do this on a string level.
+ var defaultConfig = {
+ caseInsensitive: $$UMFP.caseInsensitive(),
+ strict: $$UMFP.strictMode(),
+ squash: $$UMFP.defaultSquashPolicy()
+ };
+ return new UrlMatcher(this.sourcePath + pattern + this.sourceSearch, extend(defaultConfig, config), this);
+};
+
+UrlMatcher.prototype.toString = function () {
+ return this.source;
+};
+
+/**
+ * @ngdoc function
+ * @name ui.router.util.type:UrlMatcher#exec
+ * @methodOf ui.router.util.type:UrlMatcher
+ *
+ * @description
+ * Tests the specified path against this matcher, and returns an object containing the captured
+ * parameter values, or null if the path does not match. The returned object contains the values
+ * of any search parameters that are mentioned in the pattern, but their value may be null if
+ * they are not present in `searchParams`. This means that search parameters are always treated
+ * as optional.
+ *
+ * @example
+ *
+ *
+ * @property {RegExp} pattern The regular expression pattern used to match values of this type when
+ * coming from a substring of a URL.
+ *
+ * @returns {Object} Returns a new `Type` object.
+ */
+function Type(config) {
+ extend(this, config);
+}
+
+/**
+ * @ngdoc function
+ * @name ui.router.util.type:Type#is
+ * @methodOf ui.router.util.type:Type
+ *
+ * @description
+ * Detects whether a value is of a particular type. Accepts a native (decoded) value
+ * and determines whether it matches the current `Type` object.
+ *
+ * @param {*} val The value to check.
+ * @param {string} key Optional. If the type check is happening in the context of a specific
+ * {@link ui.router.util.type:UrlMatcher `UrlMatcher`} object, this is the name of the
+ * parameter in which `val` is stored. Can be used for meta-programming of `Type` objects.
+ * @returns {Boolean} Returns `true` if the value matches the type, otherwise `false`.
+ */
+Type.prototype.is = function(val, key) {
+ return true;
+};
+
+/**
+ * @ngdoc function
+ * @name ui.router.util.type:Type#encode
+ * @methodOf ui.router.util.type:Type
+ *
+ * @description
+ * Encodes a custom/native type value to a string that can be embedded in a URL. Note that the
+ * return value does *not* need to be URL-safe (i.e. passed through `encodeURIComponent()`), it
+ * only needs to be a representation of `val` that has been coerced to a string.
+ *
+ * @param {*} val The value to encode.
+ * @param {string} key The name of the parameter in which `val` is stored. Can be used for
+ * meta-programming of `Type` objects.
+ * @returns {string} Returns a string representation of `val` that can be encoded in a URL.
+ */
+Type.prototype.encode = function(val, key) {
+ return val;
+};
+
+/**
+ * @ngdoc function
+ * @name ui.router.util.type:Type#decode
+ * @methodOf ui.router.util.type:Type
+ *
+ * @description
+ * Converts a parameter value (from URL string or transition param) to a custom/native value.
+ *
+ * @param {string} val The URL parameter value to decode.
+ * @param {string} key The name of the parameter in which `val` is stored. Can be used for
+ * meta-programming of `Type` objects.
+ * @returns {*} Returns a custom representation of the URL parameter value.
+ */
+Type.prototype.decode = function(val, key) {
+ return val;
+};
+
+/**
+ * @ngdoc function
+ * @name ui.router.util.type:Type#equals
+ * @methodOf ui.router.util.type:Type
+ *
+ * @description
+ * Determines whether two decoded values are equivalent.
+ *
+ * @param {*} a A value to compare against.
+ * @param {*} b A value to compare against.
+ * @returns {Boolean} Returns `true` if the values are equivalent/equal, otherwise `false`.
+ */
+Type.prototype.equals = function(a, b) {
+ return a == b;
+};
+
+Type.prototype.$subPattern = function() {
+ var sub = this.pattern.toString();
+ return sub.substr(1, sub.length - 2);
+};
+
+Type.prototype.pattern = /.*/;
+
+Type.prototype.toString = function() { return "{Type:" + this.name + "}"; };
+
+/*
+ * Wraps an existing custom Type as an array of Type, depending on 'mode'.
+ * e.g.:
+ * - urlmatcher pattern "/path?{queryParam[]:int}"
+ * - url: "/path?queryParam=1&queryParam=2
+ * - $stateParams.queryParam will be [1, 2]
+ * if `mode` is "auto", then
+ * - url: "/path?queryParam=1 will create $stateParams.queryParam: 1
+ * - url: "/path?queryParam=1&queryParam=2 will create $stateParams.queryParam: [1, 2]
+ */
+Type.prototype.$asArray = function(mode, isSearch) {
+ if (!mode) return this;
+ if (mode === "auto" && !isSearch) throw new Error("'auto' array mode is for query parameters only");
+ return new ArrayType(this, mode);
+
+ function ArrayType(type, mode) {
+ function bindTo(type, callbackName) {
+ return function() {
+ return type[callbackName].apply(type, arguments);
+ };
+ }
+
+ // Wrap non-array value as array
+ function arrayWrap(val) { return isArray(val) ? val : (isDefined(val) ? [ val ] : []); }
+ // Unwrap array value for "auto" mode. Return undefined for empty array.
+ function arrayUnwrap(val) {
+ switch(val.length) {
+ case 0: return undefined;
+ case 1: return mode === "auto" ? val[0] : val;
+ default: return val;
+ }
+ }
+ function falsey(val) { return !val; }
+
+ // Wraps type (.is/.encode/.decode) functions to operate on each value of an array
+ function arrayHandler(callback, allTruthyMode) {
+ return function handleArray(val) {
+ val = arrayWrap(val);
+ var result = map(val, callback);
+ if (allTruthyMode === true)
+ return filter(result, falsey).length === 0;
+ return arrayUnwrap(result);
+ };
+ }
+
+ // Wraps type (.equals) functions to operate on each value of an array
+ function arrayEqualsHandler(callback) {
+ return function handleArray(val1, val2) {
+ var left = arrayWrap(val1), right = arrayWrap(val2);
+ if (left.length !== right.length) return false;
+ for (var i = 0; i < left.length; i++) {
+ if (!callback(left[i], right[i])) return false;
+ }
+ return true;
+ };
+ }
+
+ this.encode = arrayHandler(bindTo(type, 'encode'));
+ this.decode = arrayHandler(bindTo(type, 'decode'));
+ this.is = arrayHandler(bindTo(type, 'is'), true);
+ this.equals = arrayEqualsHandler(bindTo(type, 'equals'));
+ this.pattern = type.pattern;
+ this.$arrayMode = mode;
+ }
+};
+
+
+
+/**
+ * @ngdoc object
+ * @name ui.router.util.$urlMatcherFactory
+ *
+ * @description
+ * Factory for {@link ui.router.util.type:UrlMatcher `UrlMatcher`} instances. The factory
+ * is also available to providers under the name `$urlMatcherFactoryProvider`.
+ */
+function $UrlMatcherFactory() {
+ $$UMFP = this;
+
+ var isCaseInsensitive = false, isStrictMode = true, defaultSquashPolicy = false;
+
+ function valToString(val) { return val != null ? val.toString().replace(/\//g, "%2F") : val; }
+ function valFromString(val) { return val != null ? val.toString().replace(/%2F/g, "/") : val; }
+// TODO: in 1.0, make string .is() return false if value is undefined by default.
+// function regexpMatches(val) { /*jshint validthis:true */ return isDefined(val) && this.pattern.test(val); }
+ function regexpMatches(val) { /*jshint validthis:true */ return this.pattern.test(val); }
+
+ var $types = {}, enqueue = true, typeQueue = [], injector, defaultTypes = {
+ string: {
+ encode: valToString,
+ decode: valFromString,
+ is: regexpMatches,
+ pattern: /[^/]*/
+ },
+ int: {
+ encode: valToString,
+ decode: function(val) { return parseInt(val, 10); },
+ is: function(val) { return isDefined(val) && this.decode(val.toString()) === val; },
+ pattern: /\d+/
+ },
+ bool: {
+ encode: function(val) { return val ? 1 : 0; },
+ decode: function(val) { return parseInt(val, 10) !== 0; },
+ is: function(val) { return val === true || val === false; },
+ pattern: /0|1/
+ },
+ date: {
+ encode: function (val) {
+ if (!this.is(val))
+ return undefined;
+ return [ val.getFullYear(),
+ ('0' + (val.getMonth() + 1)).slice(-2),
+ ('0' + val.getDate()).slice(-2)
+ ].join("-");
+ },
+ decode: function (val) {
+ if (this.is(val)) return val;
+ var match = this.capture.exec(val);
+ return match ? new Date(match[1], match[2] - 1, match[3]) : undefined;
+ },
+ is: function(val) { return val instanceof Date && !isNaN(val.valueOf()); },
+ equals: function (a, b) { return this.is(a) && this.is(b) && a.toISOString() === b.toISOString(); },
+ pattern: /[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/,
+ capture: /([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/
+ },
+ json: {
+ encode: angular.toJson,
+ decode: angular.fromJson,
+ is: angular.isObject,
+ equals: angular.equals,
+ pattern: /[^/]*/
+ },
+ any: { // does not encode/decode
+ encode: angular.identity,
+ decode: angular.identity,
+ is: angular.identity,
+ equals: angular.equals,
+ pattern: /.*/
+ }
+ };
+
+ function getDefaultConfig() {
+ return {
+ strict: isStrictMode,
+ caseInsensitive: isCaseInsensitive
+ };
+ }
+
+ function isInjectable(value) {
+ return (isFunction(value) || (isArray(value) && isFunction(value[value.length - 1])));
+ }
+
+ /**
+ * [Internal] Get the default value of a parameter, which may be an injectable function.
+ */
+ $UrlMatcherFactory.$$getDefaultValue = function(config) {
+ if (!isInjectable(config.value)) return config.value;
+ if (!injector) throw new Error("Injectable functions cannot be called at configuration time");
+ return injector.invoke(config.value);
+ };
+
+ /**
+ * @ngdoc function
+ * @name ui.router.util.$urlMatcherFactory#caseInsensitive
+ * @methodOf ui.router.util.$urlMatcherFactory
+ *
+ * @description
+ * Defines whether URL matching should be case sensitive (the default behavior), or not.
+ *
+ * @param {boolean} value `false` to match URL in a case sensitive manner; otherwise `true`;
+ * @returns {boolean} the current value of caseInsensitive
+ */
+ this.caseInsensitive = function(value) {
+ if (isDefined(value))
+ isCaseInsensitive = value;
+ return isCaseInsensitive;
+ };
+
+ /**
+ * @ngdoc function
+ * @name ui.router.util.$urlMatcherFactory#strictMode
+ * @methodOf ui.router.util.$urlMatcherFactory
+ *
+ * @description
+ * Defines whether URLs should match trailing slashes, or not (the default behavior).
+ *
+ * @param {boolean=} value `false` to match trailing slashes in URLs, otherwise `true`.
+ * @returns {boolean} the current value of strictMode
+ */
+ this.strictMode = function(value) {
+ if (isDefined(value))
+ isStrictMode = value;
+ return isStrictMode;
+ };
+
+ /**
+ * @ngdoc function
+ * @name ui.router.util.$urlMatcherFactory#defaultSquashPolicy
+ * @methodOf ui.router.util.$urlMatcherFactory
+ *
+ * @description
+ * Sets the default behavior when generating or matching URLs with default parameter values.
+ *
+ * @param {string} value A string that defines the default parameter URL squashing behavior.
+ * `nosquash`: When generating an href with a default parameter value, do not squash the parameter value from the URL
+ * `slash`: When generating an href with a default parameter value, squash (remove) the parameter value, and, if the
+ * parameter is surrounded by slashes, squash (remove) one slash from the URL
+ * any other string, e.g. "~": When generating an href with a default parameter value, squash (remove)
+ * the parameter value from the URL and replace it with this string.
+ */
+ this.defaultSquashPolicy = function(value) {
+ if (!isDefined(value)) return defaultSquashPolicy;
+ if (value !== true && value !== false && !isString(value))
+ throw new Error("Invalid squash policy: " + value + ". Valid policies: false, true, arbitrary-string");
+ defaultSquashPolicy = value;
+ return value;
+ };
+
+ /**
+ * @ngdoc function
+ * @name ui.router.util.$urlMatcherFactory#compile
+ * @methodOf ui.router.util.$urlMatcherFactory
+ *
+ * @description
+ * Creates a {@link ui.router.util.type:UrlMatcher `UrlMatcher`} for the specified pattern.
+ *
+ * @param {string} pattern The URL pattern.
+ * @param {Object} config The config object hash.
+ * @returns {UrlMatcher} The UrlMatcher.
+ */
+ this.compile = function (pattern, config) {
+ return new UrlMatcher(pattern, extend(getDefaultConfig(), config));
+ };
+
+ /**
+ * @ngdoc function
+ * @name ui.router.util.$urlMatcherFactory#isMatcher
+ * @methodOf ui.router.util.$urlMatcherFactory
+ *
+ * @description
+ * Returns true if the specified object is a `UrlMatcher`, or false otherwise.
+ *
+ * @param {Object} object The object to perform the type check against.
+ * @returns {Boolean} Returns `true` if the object matches the `UrlMatcher` interface, by
+ * implementing all the same methods.
+ */
+ this.isMatcher = function (o) {
+ if (!isObject(o)) return false;
+ var result = true;
+
+ forEach(UrlMatcher.prototype, function(val, name) {
+ if (isFunction(val)) {
+ result = result && (isDefined(o[name]) && isFunction(o[name]));
+ }
+ });
+ return result;
+ };
+
+ /**
+ * @ngdoc function
+ * @name ui.router.util.$urlMatcherFactory#type
+ * @methodOf ui.router.util.$urlMatcherFactory
+ *
+ * @description
+ * Registers a custom {@link ui.router.util.type:Type `Type`} object that can be used to
+ * generate URLs with typed parameters.
+ *
+ * @param {string} name The type name.
+ * @param {Object|Function} definition The type definition. See
+ * {@link ui.router.util.type:Type `Type`} for information on the values accepted.
+ * @param {Object|Function} definitionFn (optional) A function that is injected before the app
+ * runtime starts. The result of this function is merged into the existing `definition`.
+ * See {@link ui.router.util.type:Type `Type`} for information on the values accepted.
+ *
+ * @returns {Object} Returns `$urlMatcherFactoryProvider`.
+ *
+ * @example
+ * This is a simple example of a custom type that encodes and decodes items from an
+ * array, using the array index as the URL-encoded value:
+ *
+ *
+ * var list = ['John', 'Paul', 'George', 'Ringo'];
+ *
+ * $urlMatcherFactoryProvider.type('listItem', {
+ * encode: function(item) {
+ * // Represent the list item in the URL using its corresponding index
+ * return list.indexOf(item);
+ * },
+ * decode: function(item) {
+ * // Look up the list item by index
+ * return list[parseInt(item, 10)];
+ * },
+ * is: function(item) {
+ * // Ensure the item is valid by checking to see that it appears
+ * // in the list
+ * return list.indexOf(item) > -1;
+ * }
+ * });
+ *
+ * $stateProvider.state('list', {
+ * url: "/list/{item:listItem}",
+ * controller: function($scope, $stateParams) {
+ * console.log($stateParams.item);
+ * }
+ * });
+ *
+ * // ...
+ *
+ * // Changes URL to '/list/3', logs "Ringo" to the console
+ * $state.go('list', { item: "Ringo" });
+ *
+ *
+ * This is a more complex example of a type that relies on dependency injection to
+ * interact with services, and uses the parameter name from the URL to infer how to
+ * handle encoding and decoding parameter values:
+ *
+ *
+ * // Defines a custom type that gets a value from a service,
+ * // where each service gets different types of values from
+ * // a backend API:
+ * $urlMatcherFactoryProvider.type('dbObject', {}, function(Users, Posts) {
+ *
+ * // Matches up services to URL parameter names
+ * var services = {
+ * user: Users,
+ * post: Posts
+ * };
+ *
+ * return {
+ * encode: function(object) {
+ * // Represent the object in the URL using its unique ID
+ * return object.id;
+ * },
+ * decode: function(value, key) {
+ * // Look up the object by ID, using the parameter
+ * // name (key) to call the correct service
+ * return services[key].findById(value);
+ * },
+ * is: function(object, key) {
+ * // Check that object is a valid dbObject
+ * return angular.isObject(object) && object.id && services[key];
+ * }
+ * equals: function(a, b) {
+ * // Check the equality of decoded objects by comparing
+ * // their unique IDs
+ * return a.id === b.id;
+ * }
+ * };
+ * });
+ *
+ * // In a config() block, you can then attach URLs with
+ * // type-annotated parameters:
+ * $stateProvider.state('users', {
+ * url: "/users",
+ * // ...
+ * }).state('users.item', {
+ * url: "/{user:dbObject}",
+ * controller: function($scope, $stateParams) {
+ * // $stateParams.user will now be an object returned from
+ * // the Users service
+ * },
+ * // ...
+ * });
+ *
+ */
+ this.type = function (name, definition, definitionFn) {
+ if (!isDefined(definition)) return $types[name];
+ if ($types.hasOwnProperty(name)) throw new Error("A type named '" + name + "' has already been defined.");
+
+ $types[name] = new Type(extend({ name: name }, definition));
+ if (definitionFn) {
+ typeQueue.push({ name: name, def: definitionFn });
+ if (!enqueue) flushTypeQueue();
+ }
+ return this;
+ };
+
+ // `flushTypeQueue()` waits until `$urlMatcherFactory` is injected before invoking the queued `definitionFn`s
+ function flushTypeQueue() {
+ while(typeQueue.length) {
+ var type = typeQueue.shift();
+ if (type.pattern) throw new Error("You cannot override a type's .pattern at runtime.");
+ angular.extend($types[type.name], injector.invoke(type.def));
+ }
+ }
+
+ // Register default types. Store them in the prototype of $types.
+ forEach(defaultTypes, function(type, name) { $types[name] = new Type(extend({name: name}, type)); });
+ $types = inherit($types, {});
+
+ /* No need to document $get, since it returns this */
+ this.$get = ['$injector', function ($injector) {
+ injector = $injector;
+ enqueue = false;
+ flushTypeQueue();
+
+ forEach(defaultTypes, function(type, name) {
+ if (!$types[name]) $types[name] = new Type(type);
+ });
+ return this;
+ }];
+
+ this.Param = function Param(id, type, config, location) {
+ var self = this;
+ config = unwrapShorthand(config);
+ type = getType(config, type, location);
+ var arrayMode = getArrayMode();
+ type = arrayMode ? type.$asArray(arrayMode, location === "search") : type;
+ if (type.name === "string" && !arrayMode && location === "path" && config.value === undefined)
+ config.value = ""; // for 0.2.x; in 0.3.0+ do not automatically default to ""
+ var isOptional = config.value !== undefined;
+ var squash = getSquashPolicy(config, isOptional);
+ var replace = getReplace(config, arrayMode, isOptional, squash);
+
+ function unwrapShorthand(config) {
+ var keys = isObject(config) ? objectKeys(config) : [];
+ var isShorthand = indexOf(keys, "value") === -1 && indexOf(keys, "type") === -1 &&
+ indexOf(keys, "squash") === -1 && indexOf(keys, "array") === -1;
+ if (isShorthand) config = { value: config };
+ config.$$fn = isInjectable(config.value) ? config.value : function () { return config.value; };
+ return config;
+ }
+
+ function getType(config, urlType, location) {
+ if (config.type && urlType) throw new Error("Param '"+id+"' has two type configurations.");
+ if (urlType) return urlType;
+ if (!config.type) return (location === "config" ? $types.any : $types.string);
+ return config.type instanceof Type ? config.type : new Type(config.type);
+ }
+
+ // array config: param name (param[]) overrides default settings. explicit config overrides param name.
+ function getArrayMode() {
+ var arrayDefaults = { array: (location === "search" ? "auto" : false) };
+ var arrayParamNomenclature = id.match(/\[\]$/) ? { array: true } : {};
+ return extend(arrayDefaults, arrayParamNomenclature, config).array;
+ }
+
+ /**
+ * returns false, true, or the squash value to indicate the "default parameter url squash policy".
+ */
+ function getSquashPolicy(config, isOptional) {
+ var squash = config.squash;
+ if (!isOptional || squash === false) return false;
+ if (!isDefined(squash) || squash == null) return defaultSquashPolicy;
+ if (squash === true || isString(squash)) return squash;
+ throw new Error("Invalid squash policy: '" + squash + "'. Valid policies: false, true, or arbitrary string");
+ }
+
+ function getReplace(config, arrayMode, isOptional, squash) {
+ var replace, configuredKeys, defaultPolicy = [
+ { from: "", to: (isOptional || arrayMode ? undefined : "") },
+ { from: null, to: (isOptional || arrayMode ? undefined : "") }
+ ];
+ replace = isArray(config.replace) ? config.replace : [];
+ if (isString(squash))
+ replace.push({ from: squash, to: undefined });
+ configuredKeys = map(replace, function(item) { return item.from; } );
+ return filter(defaultPolicy, function(item) { return indexOf(configuredKeys, item.from) === -1; }).concat(replace);
+ }
+
+ /**
+ * [Internal] Get the default value of a parameter, which may be an injectable function.
+ */
+ function $$getDefaultValue() {
+ if (!injector) throw new Error("Injectable functions cannot be called at configuration time");
+ return injector.invoke(config.$$fn);
+ }
+
+ /**
+ * [Internal] Gets the decoded representation of a value if the value is defined, otherwise, returns the
+ * default value, which may be the result of an injectable function.
+ */
+ function $value(value) {
+ function hasReplaceVal(val) { return function(obj) { return obj.from === val; }; }
+ function $replace(value) {
+ var replacement = map(filter(self.replace, hasReplaceVal(value)), function(obj) { return obj.to; });
+ return replacement.length ? replacement[0] : value;
+ }
+ value = $replace(value);
+ return isDefined(value) ? self.type.decode(value) : $$getDefaultValue();
+ }
+
+ function toString() { return "{Param:" + id + " " + type + " squash: '" + squash + "' optional: " + isOptional + "}"; }
+
+ extend(this, {
+ id: id,
+ type: type,
+ location: location,
+ array: arrayMode,
+ squash: squash,
+ replace: replace,
+ isOptional: isOptional,
+ value: $value,
+ dynamic: undefined,
+ config: config,
+ toString: toString
+ });
+ };
+
+ function ParamSet(params) {
+ extend(this, params || {});
+ }
+
+ ParamSet.prototype = {
+ $$new: function() {
+ return inherit(this, extend(new ParamSet(), { $$parent: this}));
+ },
+ $$keys: function () {
+ var keys = [], chain = [], parent = this,
+ ignore = objectKeys(ParamSet.prototype);
+ while (parent) { chain.push(parent); parent = parent.$$parent; }
+ chain.reverse();
+ forEach(chain, function(paramset) {
+ forEach(objectKeys(paramset), function(key) {
+ if (indexOf(keys, key) === -1 && indexOf(ignore, key) === -1) keys.push(key);
+ });
+ });
+ return keys;
+ },
+ $$values: function(paramValues) {
+ var values = {}, self = this;
+ forEach(self.$$keys(), function(key) {
+ values[key] = self[key].value(paramValues && paramValues[key]);
+ });
+ return values;
+ },
+ $$equals: function(paramValues1, paramValues2) {
+ var equal = true, self = this;
+ forEach(self.$$keys(), function(key) {
+ var left = paramValues1 && paramValues1[key], right = paramValues2 && paramValues2[key];
+ if (!self[key].type.equals(left, right)) equal = false;
+ });
+ return equal;
+ },
+ $$validates: function $$validate(paramValues) {
+ var result = true, isOptional, val, param, self = this;
+
+ forEach(this.$$keys(), function(key) {
+ param = self[key];
+ val = paramValues[key];
+ isOptional = !val && param.isOptional;
+ result = result && (isOptional || !!param.type.is(val));
+ });
+ return result;
+ },
+ $$parent: undefined
+ };
+
+ this.ParamSet = ParamSet;
+}
+
+// Register as a provider so it's available to other providers
+angular.module('ui.router.util').provider('$urlMatcherFactory', $UrlMatcherFactory);
+angular.module('ui.router.util').run(['$urlMatcherFactory', function($urlMatcherFactory) { }]);
+
+/**
+ * @ngdoc object
+ * @name ui.router.router.$urlRouterProvider
+ *
+ * @requires ui.router.util.$urlMatcherFactoryProvider
+ * @requires $locationProvider
+ *
+ * @description
+ * `$urlRouterProvider` has the responsibility of watching `$location`.
+ * When `$location` changes it runs through a list of rules one by one until a
+ * match is found. `$urlRouterProvider` is used behind the scenes anytime you specify
+ * a url in a state configuration. All urls are compiled into a UrlMatcher object.
+ *
+ * There are several methods on `$urlRouterProvider` that make it useful to use directly
+ * in your module config.
+ */
+$UrlRouterProvider.$inject = ['$locationProvider', '$urlMatcherFactoryProvider'];
+function $UrlRouterProvider( $locationProvider, $urlMatcherFactory) {
+ var rules = [], otherwise = null, interceptDeferred = false, listener;
+
+ // Returns a string that is a prefix of all strings matching the RegExp
+ function regExpPrefix(re) {
+ var prefix = /^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(re.source);
+ return (prefix != null) ? prefix[1].replace(/\\(.)/g, "$1") : '';
+ }
+
+ // Interpolates matched values into a String.replace()-style pattern
+ function interpolate(pattern, match) {
+ return pattern.replace(/\$(\$|\d{1,2})/, function (m, what) {
+ return match[what === '$' ? 0 : Number(what)];
+ });
+ }
+
+ /**
+ * @ngdoc function
+ * @name ui.router.router.$urlRouterProvider#rule
+ * @methodOf ui.router.router.$urlRouterProvider
+ *
+ * @description
+ * Defines rules that are used by `$urlRouterProvider` to find matches for
+ * specific URLs.
+ *
+ * @example
+ *
+ * var app = angular.module('app', ['ui.router.router']);
+ *
+ * app.config(function ($urlRouterProvider) {
+ * // Here's an example of how you might allow case insensitive urls
+ * $urlRouterProvider.rule(function ($injector, $location) {
+ * var path = $location.path(),
+ * normalized = path.toLowerCase();
+ *
+ * if (path !== normalized) {
+ * return normalized;
+ * }
+ * });
+ * });
+ *
+ *
+ * @param {object} rule Handler function that takes `$injector` and `$location`
+ * services as arguments. You can use them to return a valid path as a string.
+ *
+ * @return {object} `$urlRouterProvider` - `$urlRouterProvider` instance
+ */
+ this.rule = function (rule) {
+ if (!isFunction(rule)) throw new Error("'rule' must be a function");
+ rules.push(rule);
+ return this;
+ };
+
+ /**
+ * @ngdoc object
+ * @name ui.router.router.$urlRouterProvider#otherwise
+ * @methodOf ui.router.router.$urlRouterProvider
+ *
+ * @description
+ * Defines a path that is used when an invalid route is requested.
+ *
+ * @example
+ *
+ * var app = angular.module('app', ['ui.router.router']);
+ *
+ * app.config(function ($urlRouterProvider) {
+ * // if the path doesn't match any of the urls you configured
+ * // otherwise will take care of routing the user to the
+ * // specified url
+ * $urlRouterProvider.otherwise('/index');
+ *
+ * // Example of using function rule as param
+ * $urlRouterProvider.otherwise(function ($injector, $location) {
+ * return '/a/valid/url';
+ * });
+ * });
+ *
+ *
+ * @param {string|object} rule The url path you want to redirect to or a function
+ * rule that returns the url path. The function version is passed two params:
+ * `$injector` and `$location` services, and must return a url string.
+ *
+ * @return {object} `$urlRouterProvider` - `$urlRouterProvider` instance
+ */
+ this.otherwise = function (rule) {
+ if (isString(rule)) {
+ var redirect = rule;
+ rule = function () { return redirect; };
+ }
+ else if (!isFunction(rule)) throw new Error("'rule' must be a function");
+ otherwise = rule;
+ return this;
+ };
+
+
+ function handleIfMatch($injector, handler, match) {
+ if (!match) return false;
+ var result = $injector.invoke(handler, handler, { $match: match });
+ return isDefined(result) ? result : true;
+ }
+
+ /**
+ * @ngdoc function
+ * @name ui.router.router.$urlRouterProvider#when
+ * @methodOf ui.router.router.$urlRouterProvider
+ *
+ * @description
+ * Registers a handler for a given url matching. if handle is a string, it is
+ * treated as a redirect, and is interpolated according to the syntax of match
+ * (i.e. like `String.replace()` for `RegExp`, or like a `UrlMatcher` pattern otherwise).
+ *
+ * If the handler is a function, it is injectable. It gets invoked if `$location`
+ * matches. You have the option of inject the match object as `$match`.
+ *
+ * The handler can return
+ *
+ * - **falsy** to indicate that the rule didn't match after all, then `$urlRouter`
+ * will continue trying to find another one that matches.
+ * - **string** which is treated as a redirect and passed to `$location.url()`
+ * - **void** or any **truthy** value tells `$urlRouter` that the url was handled.
+ *
+ * @example
+ *
+ *
+ * @param {string|object} what The incoming path that you want to redirect.
+ * @param {string|object} handler The path you want to redirect your user to.
+ */
+ this.when = function (what, handler) {
+ var redirect, handlerIsString = isString(handler);
+ if (isString(what)) what = $urlMatcherFactory.compile(what);
+
+ if (!handlerIsString && !isFunction(handler) && !isArray(handler))
+ throw new Error("invalid 'handler' in when()");
+
+ var strategies = {
+ matcher: function (what, handler) {
+ if (handlerIsString) {
+ redirect = $urlMatcherFactory.compile(handler);
+ handler = ['$match', function ($match) { return redirect.format($match); }];
+ }
+ return extend(function ($injector, $location) {
+ return handleIfMatch($injector, handler, what.exec($location.path(), $location.search()));
+ }, {
+ prefix: isString(what.prefix) ? what.prefix : ''
+ });
+ },
+ regex: function (what, handler) {
+ if (what.global || what.sticky) throw new Error("when() RegExp must not be global or sticky");
+
+ if (handlerIsString) {
+ redirect = handler;
+ handler = ['$match', function ($match) { return interpolate(redirect, $match); }];
+ }
+ return extend(function ($injector, $location) {
+ return handleIfMatch($injector, handler, what.exec($location.path()));
+ }, {
+ prefix: regExpPrefix(what)
+ });
+ }
+ };
+
+ var check = { matcher: $urlMatcherFactory.isMatcher(what), regex: what instanceof RegExp };
+
+ for (var n in check) {
+ if (check[n]) return this.rule(strategies[n](what, handler));
+ }
+
+ throw new Error("invalid 'what' in when()");
+ };
+
+ /**
+ * @ngdoc function
+ * @name ui.router.router.$urlRouterProvider#deferIntercept
+ * @methodOf ui.router.router.$urlRouterProvider
+ *
+ * @description
+ * Disables (or enables) deferring location change interception.
+ *
+ * If you wish to customize the behavior of syncing the URL (for example, if you wish to
+ * defer a transition but maintain the current URL), call this method at configuration time.
+ * Then, at run time, call `$urlRouter.listen()` after you have configured your own
+ * `$locationChangeSuccess` event handler.
+ *
+ * @example
+ *
+ * var app = angular.module('app', ['ui.router.router']);
+ *
+ * app.config(function ($urlRouterProvider) {
+ *
+ * // Prevent $urlRouter from automatically intercepting URL changes;
+ * // this allows you to configure custom behavior in between
+ * // location changes and route synchronization:
+ * $urlRouterProvider.deferIntercept();
+ *
+ * }).run(function ($rootScope, $urlRouter, UserService) {
+ *
+ * $rootScope.$on('$locationChangeSuccess', function(e) {
+ * // UserService is an example service for managing user state
+ * if (UserService.isLoggedIn()) return;
+ *
+ * // Prevent $urlRouter's default handler from firing
+ * e.preventDefault();
+ *
+ * UserService.handleLogin().then(function() {
+ * // Once the user has logged in, sync the current URL
+ * // to the router:
+ * $urlRouter.sync();
+ * });
+ * });
+ *
+ * // Configures $urlRouter's listener *after* your custom listener
+ * $urlRouter.listen();
+ * });
+ *
+ *
+ * @param {boolean} defer Indicates whether to defer location change interception. Passing
+ no parameter is equivalent to `true`.
+ */
+ this.deferIntercept = function (defer) {
+ if (defer === undefined) defer = true;
+ interceptDeferred = defer;
+ };
+
+ /**
+ * @ngdoc object
+ * @name ui.router.router.$urlRouter
+ *
+ * @requires $location
+ * @requires $rootScope
+ * @requires $injector
+ * @requires $browser
+ *
+ * @description
+ *
+ */
+ this.$get = $get;
+ $get.$inject = ['$location', '$rootScope', '$injector', '$browser'];
+ function $get( $location, $rootScope, $injector, $browser) {
+
+ var baseHref = $browser.baseHref(), location = $location.url(), lastPushedUrl;
+
+ function appendBasePath(url, isHtml5, absolute) {
+ if (baseHref === '/') return url;
+ if (isHtml5) return baseHref.slice(0, -1) + url;
+ if (absolute) return baseHref.slice(1) + url;
+ return url;
+ }
+
+ // TODO: Optimize groups of rules with non-empty prefix into some sort of decision tree
+ function update(evt) {
+ if (evt && evt.defaultPrevented) return;
+ var ignoreUpdate = lastPushedUrl && $location.url() === lastPushedUrl;
+ lastPushedUrl = undefined;
+ if (ignoreUpdate) return true;
+
+ function check(rule) {
+ var handled = rule($injector, $location);
+
+ if (!handled) return false;
+ if (isString(handled)) $location.replace().url(handled);
+ return true;
+ }
+ var n = rules.length, i;
+
+ for (i = 0; i < n; i++) {
+ if (check(rules[i])) return;
+ }
+ // always check otherwise last to allow dynamic updates to the set of rules
+ if (otherwise) check(otherwise);
+ }
+
+ function listen() {
+ listener = listener || $rootScope.$on('$locationChangeSuccess', update);
+ return listener;
+ }
+
+ if (!interceptDeferred) listen();
+
+ return {
+ /**
+ * @ngdoc function
+ * @name ui.router.router.$urlRouter#sync
+ * @methodOf ui.router.router.$urlRouter
+ *
+ * @description
+ * Triggers an update; the same update that happens when the address bar url changes, aka `$locationChangeSuccess`.
+ * This method is useful when you need to use `preventDefault()` on the `$locationChangeSuccess` event,
+ * perform some custom logic (route protection, auth, config, redirection, etc) and then finally proceed
+ * with the transition by calling `$urlRouter.sync()`.
+ *
+ * @example
+ *
+ * angular.module('app', ['ui.router'])
+ * .run(function($rootScope, $urlRouter) {
+ * $rootScope.$on('$locationChangeSuccess', function(evt) {
+ * // Halt state change from even starting
+ * evt.preventDefault();
+ * // Perform custom logic
+ * var meetsRequirement = ...
+ * // Continue with the update and state transition if logic allows
+ * if (meetsRequirement) $urlRouter.sync();
+ * });
+ * });
+ *
+ *
+ * @param {UrlMatcher} urlMatcher The `UrlMatcher` object which is used as the template of the URL to generate.
+ * @param {object=} params An object of parameter values to fill the matcher's required parameters.
+ * @param {object=} options Options object. The options are:
+ *
+ * - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl".
+ *
+ * @returns {string} Returns the fully compiled URL, or `null` if `params` fail validation against `urlMatcher`
+ */
+ href: function(urlMatcher, params, options) {
+ if (!urlMatcher.validates(params)) return null;
+
+ var isHtml5 = $locationProvider.html5Mode();
+ if (angular.isObject(isHtml5)) {
+ isHtml5 = isHtml5.enabled;
+ }
+
+ var url = urlMatcher.format(params);
+ options = options || {};
+
+ if (!isHtml5 && url !== null) {
+ url = "#" + $locationProvider.hashPrefix() + url;
+ }
+ url = appendBasePath(url, isHtml5, options.absolute);
+
+ if (!options.absolute || !url) {
+ return url;
+ }
+
+ var slash = (!isHtml5 && url ? '/' : ''), port = $location.port();
+ port = (port === 80 || port === 443 ? '' : ':' + port);
+
+ return [$location.protocol(), '://', $location.host(), port, slash, url].join('');
+ }
+ };
+ }
+}
+
+angular.module('ui.router.router').provider('$urlRouter', $UrlRouterProvider);
+
+/**
+ * @ngdoc object
+ * @name ui.router.state.$stateProvider
+ *
+ * @requires ui.router.router.$urlRouterProvider
+ * @requires ui.router.util.$urlMatcherFactoryProvider
+ *
+ * @description
+ * The new `$stateProvider` works similar to Angular's v1 router, but it focuses purely
+ * on state.
+ *
+ * A state corresponds to a "place" in the application in terms of the overall UI and
+ * navigation. A state describes (via the controller / template / view properties) what
+ * the UI looks like and does at that place.
+ *
+ * States often have things in common, and the primary way of factoring out these
+ * commonalities in this model is via the state hierarchy, i.e. parent/child states aka
+ * nested states.
+ *
+ * The `$stateProvider` provides interfaces to declare these states for your app.
+ */
+$StateProvider.$inject = ['$urlRouterProvider', '$urlMatcherFactoryProvider'];
+function $StateProvider( $urlRouterProvider, $urlMatcherFactory) {
+
+ var root, states = {}, $state, queue = {}, abstractKey = 'abstract';
+
+ // Builds state properties from definition passed to registerState()
+ var stateBuilder = {
+
+ // Derive parent state from a hierarchical name only if 'parent' is not explicitly defined.
+ // state.children = [];
+ // if (parent) parent.children.push(state);
+ parent: function(state) {
+ if (isDefined(state.parent) && state.parent) return findState(state.parent);
+ // regex matches any valid composite state name
+ // would match "contact.list" but not "contacts"
+ var compositeName = /^(.+)\.[^.]+$/.exec(state.name);
+ return compositeName ? findState(compositeName[1]) : root;
+ },
+
+ // inherit 'data' from parent and override by own values (if any)
+ data: function(state) {
+ if (state.parent && state.parent.data) {
+ state.data = state.self.data = extend({}, state.parent.data, state.data);
+ }
+ return state.data;
+ },
+
+ // Build a URLMatcher if necessary, either via a relative or absolute URL
+ url: function(state) {
+ var url = state.url, config = { params: state.params || {} };
+
+ if (isString(url)) {
+ if (url.charAt(0) == '^') return $urlMatcherFactory.compile(url.substring(1), config);
+ return (state.parent.navigable || root).url.concat(url, config);
+ }
+
+ if (!url || $urlMatcherFactory.isMatcher(url)) return url;
+ throw new Error("Invalid url '" + url + "' in state '" + state + "'");
+ },
+
+ // Keep track of the closest ancestor state that has a URL (i.e. is navigable)
+ navigable: function(state) {
+ return state.url ? state : (state.parent ? state.parent.navigable : null);
+ },
+
+ // Own parameters for this state. state.url.params is already built at this point. Create and add non-url params
+ ownParams: function(state) {
+ var params = state.url && state.url.params || new $$UMFP.ParamSet();
+ forEach(state.params || {}, function(config, id) {
+ if (!params[id]) params[id] = new $$UMFP.Param(id, null, config, "config");
+ });
+ return params;
+ },
+
+ // Derive parameters for this state and ensure they're a super-set of parent's parameters
+ params: function(state) {
+ return state.parent && state.parent.params ? extend(state.parent.params.$$new(), state.ownParams) : new $$UMFP.ParamSet();
+ },
+
+ // If there is no explicit multi-view configuration, make one up so we don't have
+ // to handle both cases in the view directive later. Note that having an explicit
+ // 'views' property will mean the default unnamed view properties are ignored. This
+ // is also a good time to resolve view names to absolute names, so everything is a
+ // straight lookup at link time.
+ views: function(state) {
+ var views = {};
+
+ forEach(isDefined(state.views) ? state.views : { '': state }, function (view, name) {
+ if (name.indexOf('@') < 0) name += '@' + state.parent.name;
+ views[name] = view;
+ });
+ return views;
+ },
+
+ // Keep a full path from the root down to this state as this is needed for state activation.
+ path: function(state) {
+ return state.parent ? state.parent.path.concat(state) : []; // exclude root from path
+ },
+
+ // Speed up $state.contains() as it's used a lot
+ includes: function(state) {
+ var includes = state.parent ? extend({}, state.parent.includes) : {};
+ includes[state.name] = true;
+ return includes;
+ },
+
+ $delegates: {}
+ };
+
+ function isRelative(stateName) {
+ return stateName.indexOf(".") === 0 || stateName.indexOf("^") === 0;
+ }
+
+ function findState(stateOrName, base) {
+ if (!stateOrName) return undefined;
+
+ var isStr = isString(stateOrName),
+ name = isStr ? stateOrName : stateOrName.name,
+ path = isRelative(name);
+
+ if (path) {
+ if (!base) throw new Error("No reference point given for path '" + name + "'");
+ base = findState(base);
+
+ var rel = name.split("."), i = 0, pathLength = rel.length, current = base;
+
+ for (; i < pathLength; i++) {
+ if (rel[i] === "" && i === 0) {
+ current = base;
+ continue;
+ }
+ if (rel[i] === "^") {
+ if (!current.parent) throw new Error("Path '" + name + "' not valid for state '" + base.name + "'");
+ current = current.parent;
+ continue;
+ }
+ break;
+ }
+ rel = rel.slice(i).join(".");
+ name = current.name + (current.name && rel ? "." : "") + rel;
+ }
+ var state = states[name];
+
+ if (state && (isStr || (!isStr && (state === stateOrName || state.self === stateOrName)))) {
+ return state;
+ }
+ return undefined;
+ }
+
+ function queueState(parentName, state) {
+ if (!queue[parentName]) {
+ queue[parentName] = [];
+ }
+ queue[parentName].push(state);
+ }
+
+ function flushQueuedChildren(parentName) {
+ var queued = queue[parentName] || [];
+ while(queued.length) {
+ registerState(queued.shift());
+ }
+ }
+
+ function registerState(state) {
+ // Wrap a new object around the state so we can store our private details easily.
+ state = inherit(state, {
+ self: state,
+ resolve: state.resolve || {},
+ toString: function() { return this.name; }
+ });
+
+ var name = state.name;
+ if (!isString(name) || name.indexOf('@') >= 0) throw new Error("State must have a valid name");
+ if (states.hasOwnProperty(name)) throw new Error("State '" + name + "'' is already defined");
+
+ // Get parent name
+ var parentName = (name.indexOf('.') !== -1) ? name.substring(0, name.lastIndexOf('.'))
+ : (isString(state.parent)) ? state.parent
+ : (isObject(state.parent) && isString(state.parent.name)) ? state.parent.name
+ : '';
+
+ // If parent is not registered yet, add state to queue and register later
+ if (parentName && !states[parentName]) {
+ return queueState(parentName, state.self);
+ }
+
+ for (var key in stateBuilder) {
+ if (isFunction(stateBuilder[key])) state[key] = stateBuilder[key](state, stateBuilder.$delegates[key]);
+ }
+ states[name] = state;
+
+ // Register the state in the global state list and with $urlRouter if necessary.
+ if (!state[abstractKey] && state.url) {
+ $urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) {
+ if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) {
+ $state.transitionTo(state, $match, { inherit: true, location: false });
+ }
+ }]);
+ }
+
+ // Register any queued children
+ flushQueuedChildren(name);
+
+ return state;
+ }
+
+ // Checks text to see if it looks like a glob.
+ function isGlob (text) {
+ return text.indexOf('*') > -1;
+ }
+
+ // Returns true if glob matches current $state name.
+ function doesStateMatchGlob (glob) {
+ var globSegments = glob.split('.'),
+ segments = $state.$current.name.split('.');
+
+ //match greedy starts
+ if (globSegments[0] === '**') {
+ segments = segments.slice(indexOf(segments, globSegments[1]));
+ segments.unshift('**');
+ }
+ //match greedy ends
+ if (globSegments[globSegments.length - 1] === '**') {
+ segments.splice(indexOf(segments, globSegments[globSegments.length - 2]) + 1, Number.MAX_VALUE);
+ segments.push('**');
+ }
+
+ if (globSegments.length != segments.length) {
+ return false;
+ }
+
+ //match single stars
+ for (var i = 0, l = globSegments.length; i < l; i++) {
+ if (globSegments[i] === '*') {
+ segments[i] = '*';
+ }
+ }
+
+ return segments.join('') === globSegments.join('');
+ }
+
+
+ // Implicit root state that is always active
+ root = registerState({
+ name: '',
+ url: '^',
+ views: null,
+ 'abstract': true
+ });
+ root.navigable = null;
+
+
+ /**
+ * @ngdoc function
+ * @name ui.router.state.$stateProvider#decorator
+ * @methodOf ui.router.state.$stateProvider
+ *
+ * @description
+ * Allows you to extend (carefully) or override (at your own peril) the
+ * `stateBuilder` object used internally by `$stateProvider`. This can be used
+ * to add custom functionality to ui-router, for example inferring templateUrl
+ * based on the state name.
+ *
+ * When passing only a name, it returns the current (original or decorated) builder
+ * function that matches `name`.
+ *
+ * The builder functions that can be decorated are listed below. Though not all
+ * necessarily have a good use case for decoration, that is up to you to decide.
+ *
+ * In addition, users can attach custom decorators, which will generate new
+ * properties within the state's internal definition. There is currently no clear
+ * use-case for this beyond accessing internal states (i.e. $state.$current),
+ * however, expect this to become increasingly relevant as we introduce additional
+ * meta-programming features.
+ *
+ * **Warning**: Decorators should not be interdependent because the order of
+ * execution of the builder functions in non-deterministic. Builder functions
+ * should only be dependent on the state definition object and super function.
+ *
+ *
+ * Existing builder functions and current return values:
+ *
+ * - **parent** `{object}` - returns the parent state object.
+ * - **data** `{object}` - returns state data, including any inherited data that is not
+ * overridden by own values (if any).
+ * - **url** `{object}` - returns a {@link ui.router.util.type:UrlMatcher UrlMatcher}
+ * or `null`.
+ * - **navigable** `{object}` - returns closest ancestor state that has a URL (aka is
+ * navigable).
+ * - **params** `{object}` - returns an array of state params that are ensured to
+ * be a super-set of parent's params.
+ * - **views** `{object}` - returns a views object where each key is an absolute view
+ * name (i.e. "viewName@stateName") and each value is the config object
+ * (template, controller) for the view. Even when you don't use the views object
+ * explicitly on a state config, one is still created for you internally.
+ * So by decorating this builder function you have access to decorating template
+ * and controller properties.
+ * - **ownParams** `{object}` - returns an array of params that belong to the state,
+ * not including any params defined by ancestor states.
+ * - **path** `{string}` - returns the full path from the root down to this state.
+ * Needed for state activation.
+ * - **includes** `{object}` - returns an object that includes every state that
+ * would pass a `$state.includes()` test.
+ *
+ * @example
+ *
+ * // Override the internal 'views' builder with a function that takes the state
+ * // definition, and a reference to the internal function being overridden:
+ * $stateProvider.decorator('views', function (state, parent) {
+ * var result = {},
+ * views = parent(state);
+ *
+ * angular.forEach(views, function (config, name) {
+ * var autoName = (state.name + '.' + name).replace('.', '/');
+ * config.templateUrl = config.templateUrl || '/partials/' + autoName + '.html';
+ * result[name] = config;
+ * });
+ * return result;
+ * });
+ *
+ * $stateProvider.state('home', {
+ * views: {
+ * 'contact.list': { controller: 'ListController' },
+ * 'contact.item': { controller: 'ItemController' }
+ * }
+ * });
+ *
+ * // ...
+ *
+ * $state.go('home');
+ * // Auto-populates list and item views with /partials/home/contact/list.html,
+ * // and /partials/home/contact/item.html, respectively.
+ *
+ *
+ * @param {string} name The name of the builder function to decorate.
+ * @param {object} func A function that is responsible for decorating the original
+ * builder function. The function receives two parameters:
+ *
+ * - `{object}` - state - The state config object.
+ * - `{object}` - super - The original builder function.
+ *
+ * @return {object} $stateProvider - $stateProvider instance
+ */
+ this.decorator = decorator;
+ function decorator(name, func) {
+ /*jshint validthis: true */
+ if (isString(name) && !isDefined(func)) {
+ return stateBuilder[name];
+ }
+ if (!isFunction(func) || !isString(name)) {
+ return this;
+ }
+ if (stateBuilder[name] && !stateBuilder.$delegates[name]) {
+ stateBuilder.$delegates[name] = stateBuilder[name];
+ }
+ stateBuilder[name] = func;
+ return this;
+ }
+
+ /**
+ * @ngdoc function
+ * @name ui.router.state.$stateProvider#state
+ * @methodOf ui.router.state.$stateProvider
+ *
+ * @description
+ * Registers a state configuration under a given state name. The stateConfig object
+ * has the following acceptable properties.
+ *
+ * @param {string} name A unique state name, e.g. "home", "about", "contacts".
+ * To create a parent/child state use a dot, e.g. "about.sales", "home.newest".
+ * @param {object} stateConfig State configuration object.
+ * @param {string|function=} stateConfig.template
+ *
+ * html template as a string or a function that returns
+ * an html template as a string which should be used by the uiView directives. This property
+ * takes precedence over templateUrl.
+ *
+ * If `template` is a function, it will be called with the following parameters:
+ *
+ * - {array.<object>} - state parameters extracted from the current $location.path() by
+ * applying the current state
+ *
+ *
template:
+ * "
inline template definition
" +
+ * ""
+ *
template: function(params) {
+ * return "
generated template
"; }
+ *
+ *
+ * @param {string|function=} stateConfig.templateUrl
+ *
+ *
+ * path or function that returns a path to an html
+ * template that should be used by uiView.
+ *
+ * If `templateUrl` is a function, it will be called with the following parameters:
+ *
+ * - {array.<object>} - state parameters extracted from the current $location.path() by
+ * applying the current state
+ *
+ *
+ *
+ * @param {string|function=} stateConfig.controller
+ *
+ *
+ * Controller fn that should be associated with newly
+ * related scope or the name of a registered controller if passed as a string.
+ * Optionally, the ControllerAs may be declared here.
+ *
controller: "MyRegisteredController"
+ *
controller:
+ * "MyRegisteredController as fooCtrl"}
+ *
+ * @param {string=} stateConfig.controllerAs
+ *
+ *
+ * A controller alias name. If present the controller will be
+ * published to scope under the controllerAs name.
+ *
controllerAs: "myCtrl"
+ *
+ * @param {object=} stateConfig.resolve
+ *
+ *
+ * An optional map<string, function> of dependencies which
+ * should be injected into the controller. If any of these dependencies are promises,
+ * the router will wait for them all to be resolved before the controller is instantiated.
+ * If all the promises are resolved successfully, the $stateChangeSuccess event is fired
+ * and the values of the resolved promises are injected into any controllers that reference them.
+ * If any of the promises are rejected the $stateChangeError event is fired.
+ *
+ * The map object is:
+ *
+ * - key - {string}: name of dependency to be injected into controller
+ * - factory - {string|function}: If string then it is alias for service. Otherwise if function,
+ * it is injected and return value it treated as dependency. If result is a promise, it is
+ * resolved before its value is injected into controller.
+ *
+ *
+ *
+ * @param {string=} stateConfig.url
+ *
+ *
+ * A url fragment with optional parameters. When a state is navigated or
+ * transitioned to, the `$stateParams` service will be populated with any
+ * parameters that were passed.
+ *
+ * examples:
+ *
+ *
+ * @param {boolean=} [stateConfig.abstract=false]
+ *
+ * An abstract state will never be directly activated,
+ * but can provide inherited properties to its common children states.
+ *
abstract: true
+ *
+ * @param {function=} stateConfig.onEnter
+ *
+ *
+ * Callback function for when a state is entered. Good way
+ * to trigger an action or dispatch an event, such as opening a dialog.
+ * If minifying your scripts, make sure to explictly annotate this function,
+ * because it won't be automatically annotated by your build tools.
+ *
+ *
+ *
+ * @param {function=} stateConfig.onExit
+ *
+ *
+ * Callback function for when a state is exited. Good way to
+ * trigger an action or dispatch an event, such as opening a dialog.
+ * If minifying your scripts, make sure to explictly annotate this function,
+ * because it won't be automatically annotated by your build tools.
+ *
+ *
+ *
+ * @param {boolean=} [stateConfig.reloadOnSearch=true]
+ *
+ *
+ * If `false`, will not retrigger the same state
+ * just because a search/query parameter has changed (via $location.search() or $location.hash()).
+ * Useful for when you'd like to modify $location.search() without triggering a reload.
+ *
reloadOnSearch: false
+ *
+ * @param {object=} stateConfig.data
+ *
+ *
+ * Arbitrary data object, useful for custom configuration. The parent state's `data` is
+ * prototypally inherited. In other words, adding a data property to a state adds it to
+ * the entire subtree via prototypal inheritance.
+ *
+ *
data: {
+ * requiredRole: 'foo'
+ * }
+ *
+ * @param {object=} stateConfig.params
+ *
+ *
+ * A map which optionally configures parameters declared in the `url`, or
+ * defines additional non-url parameters. For each parameter being
+ * configured, add a configuration object keyed to the name of the parameter.
+ *
+ * Each parameter configuration object may contain the following properties:
+ *
+ * - ** value ** - {object|function=}: specifies the default value for this
+ * parameter. This implicitly sets this parameter as optional.
+ *
+ * When UI-Router routes to a state and no value is
+ * specified for this parameter in the URL or transition, the
+ * default value will be used instead. If `value` is a function,
+ * it will be injected and invoked, and the return value used.
+ *
+ * *Note*: `undefined` is treated as "no default value" while `null`
+ * is treated as "the default value is `null`".
+ *
+ * *Shorthand*: If you only need to configure the default value of the
+ * parameter, you may use a shorthand syntax. In the **`params`**
+ * map, instead mapping the param name to a full parameter configuration
+ * object, simply set map it to the default parameter value, e.g.:
+ *
+ *
+ *
+ * - ** array ** - {boolean=}: *(default: false)* If true, the param value will be
+ * treated as an array of values. If you specified a Type, the value will be
+ * treated as an array of the specified Type. Note: query parameter values
+ * default to a special `"auto"` mode.
+ *
+ * For query parameters in `"auto"` mode, if multiple values for a single parameter
+ * are present in the URL (e.g.: `/foo?bar=1&bar=2&bar=3`) then the values
+ * are mapped to an array (e.g.: `{ foo: [ '1', '2', '3' ] }`). However, if
+ * only one value is present (e.g.: `/foo?bar=1`) then the value is treated as single
+ * value (e.g.: `{ foo: '1' }`).
+ *
+ *
params: {
+ * param1: { array: true }
+ * }
+ *
+ * - ** squash ** - {bool|string=}: `squash` configures how a default parameter value is represented in the URL when
+ * the current parameter value is the same as the default value. If `squash` is not set, it uses the
+ * configured default squash policy.
+ * (See {@link ui.router.util.$urlMatcherFactory#methods_defaultSquashPolicy `defaultSquashPolicy()`})
+ *
+ * There are three squash settings:
+ *
+ * - false: The parameter's default value is not squashed. It is encoded and included in the URL
+ * - true: The parameter's default value is omitted from the URL. If the parameter is preceeded and followed
+ * by slashes in the state's `url` declaration, then one of those slashes are omitted.
+ * This can allow for cleaner looking URLs.
+ * - `""`: The parameter's default value is replaced with an arbitrary placeholder of your choice.
+ *
+ *
+ * // Some state name examples
+ *
+ * // stateName can be a single top-level name (must be unique).
+ * $stateProvider.state("home", {});
+ *
+ * // Or it can be a nested state name. This state is a child of the
+ * // above "home" state.
+ * $stateProvider.state("home.newest", {});
+ *
+ * // Nest states as deeply as needed.
+ * $stateProvider.state("home.newest.abc.xyz.inception", {});
+ *
+ * // state() returns $stateProvider, so you can chain state declarations.
+ * $stateProvider
+ * .state("home", {})
+ * .state("about", {})
+ * .state("contacts", {});
+ *
+ *
+ */
+ this.state = state;
+ function state(name, definition) {
+ /*jshint validthis: true */
+ if (isObject(name)) definition = name;
+ else definition.name = name;
+ registerState(definition);
+ return this;
+ }
+
+ /**
+ * @ngdoc object
+ * @name ui.router.state.$state
+ *
+ * @requires $rootScope
+ * @requires $q
+ * @requires ui.router.state.$view
+ * @requires $injector
+ * @requires ui.router.util.$resolve
+ * @requires ui.router.state.$stateParams
+ * @requires ui.router.router.$urlRouter
+ *
+ * @property {object} params A param object, e.g. {sectionId: section.id)}, that
+ * you'd like to test against the current active state.
+ * @property {object} current A reference to the state's config object. However
+ * you passed it in. Useful for accessing custom data.
+ * @property {object} transition Currently pending transition. A promise that'll
+ * resolve or reject.
+ *
+ * @description
+ * `$state` service is responsible for representing states as well as transitioning
+ * between them. It also provides interfaces to ask for current state or even states
+ * you're coming from.
+ */
+ this.$get = $get;
+ $get.$inject = ['$rootScope', '$q', '$view', '$injector', '$resolve', '$stateParams', '$urlRouter', '$location', '$urlMatcherFactory'];
+ function $get( $rootScope, $q, $view, $injector, $resolve, $stateParams, $urlRouter, $location, $urlMatcherFactory) {
+
+ var TransitionSuperseded = $q.reject(new Error('transition superseded'));
+ var TransitionPrevented = $q.reject(new Error('transition prevented'));
+ var TransitionAborted = $q.reject(new Error('transition aborted'));
+ var TransitionFailed = $q.reject(new Error('transition failed'));
+
+ // Handles the case where a state which is the target of a transition is not found, and the user
+ // can optionally retry or defer the transition
+ function handleRedirect(redirect, state, params, options) {
+ /**
+ * @ngdoc event
+ * @name ui.router.state.$state#$stateNotFound
+ * @eventOf ui.router.state.$state
+ * @eventType broadcast on root scope
+ * @description
+ * Fired when a requested state **cannot be found** using the provided state name during transition.
+ * The event is broadcast allowing any handlers a single chance to deal with the error (usually by
+ * lazy-loading the unfound state). A special `unfoundState` object is passed to the listener handler,
+ * you can see its three properties in the example. You can use `event.preventDefault()` to abort the
+ * transition and the promise returned from `go` will be rejected with a `'transition aborted'` value.
+ *
+ * @param {Object} event Event object.
+ * @param {Object} unfoundState Unfound State information. Contains: `to, toParams, options` properties.
+ * @param {State} fromState Current state object.
+ * @param {Object} fromParams Current state params.
+ *
+ * @example
+ *
+ *
+ *
+ * @returns {promise} A promise representing the state of the new transition. See
+ * {@link ui.router.state.$state#methods_go $state.go}.
+ */
+ $state.reload = function reload() {
+ return $state.transitionTo($state.current, $stateParams, { reload: true, inherit: false, notify: true });
+ };
+
+ /**
+ * @ngdoc function
+ * @name ui.router.state.$state#go
+ * @methodOf ui.router.state.$state
+ *
+ * @description
+ * Convenience method for transitioning to a new state. `$state.go` calls
+ * `$state.transitionTo` internally but automatically sets options to
+ * `{ location: true, inherit: true, relative: $state.$current, notify: true }`.
+ * This allows you to easily use an absolute or relative to path and specify
+ * only the parameters you'd like to update (while letting unspecified parameters
+ * inherit from the currently active ancestor states).
+ *
+ * @example
+ *
+ *
+ *
+ * @param {string} to Absolute state name or relative state path. Some examples:
+ *
+ * - `$state.go('contact.detail')` - will go to the `contact.detail` state
+ * - `$state.go('^')` - will go to a parent state
+ * - `$state.go('^.sibling')` - will go to a sibling state
+ * - `$state.go('.child.grandchild')` - will go to grandchild state
+ *
+ * @param {object=} params A map of the parameters that will be sent to the state,
+ * will populate $stateParams. Any parameters that are not specified will be inherited from currently
+ * defined parameters. This allows, for example, going to a sibling state that shares parameters
+ * specified in a parent state. Parameter inheritance only works between common ancestor states, I.e.
+ * transitioning to a sibling will get you the parameters for all parents, transitioning to a child
+ * will get you all current parameters, etc.
+ * @param {object=} options Options object. The options are:
+ *
+ * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false`
+ * will not. If string, must be `"replace"`, which will update url and also replace last history record.
+ * - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url.
+ * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'),
+ * defines which state to be relative from.
+ * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events.
+ * - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params
+ * have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd
+ * use this when you want to force a reload when *everything* is the same, including search params.
+ *
+ * @returns {promise} A promise representing the state of the new transition.
+ *
+ * Possible success values:
+ *
+ * - $state.current
+ *
+ * Possible rejection values:
+ *
+ * - 'transition superseded' - when a newer transition has been started after this one
+ * - 'transition prevented' - when `event.preventDefault()` has been called in a `$stateChangeStart` listener
+ * - 'transition aborted' - when `event.preventDefault()` has been called in a `$stateNotFound` listener or
+ * when a `$stateNotFound` `event.retry` promise errors.
+ * - 'transition failed' - when a state has been unsuccessfully found after 2 tries.
+ * - *resolve error* - when an error has occurred with a `resolve`
+ *
+ */
+ $state.go = function go(to, params, options) {
+ return $state.transitionTo(to, params, extend({ inherit: true, relative: $state.$current }, options));
+ };
+
+ /**
+ * @ngdoc function
+ * @name ui.router.state.$state#transitionTo
+ * @methodOf ui.router.state.$state
+ *
+ * @description
+ * Low-level method for transitioning to a new state. {@link ui.router.state.$state#methods_go $state.go}
+ * uses `transitionTo` internally. `$state.go` is recommended in most situations.
+ *
+ * @example
+ *
+ *
+ * @param {string} to State name.
+ * @param {object=} toParams A map of the parameters that will be sent to the state,
+ * will populate $stateParams.
+ * @param {object=} options Options object. The options are:
+ *
+ * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false`
+ * will not. If string, must be `"replace"`, which will update url and also replace last history record.
+ * - **`inherit`** - {boolean=false}, If `true` will inherit url parameters from current url.
+ * - **`relative`** - {object=}, When transitioning with relative path (e.g '^'),
+ * defines which state to be relative from.
+ * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events.
+ * - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params
+ * have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd
+ * use this when you want to force a reload when *everything* is the same, including search params.
+ *
+ * @returns {promise} A promise representing the state of the new transition. See
+ * {@link ui.router.state.$state#methods_go $state.go}.
+ */
+ $state.transitionTo = function transitionTo(to, toParams, options) {
+ toParams = toParams || {};
+ options = extend({
+ location: true, inherit: false, relative: null, notify: true, reload: false, $retry: false
+ }, options || {});
+
+ var from = $state.$current, fromParams = $state.params, fromPath = from.path;
+ var evt, toState = findState(to, options.relative);
+
+ if (!isDefined(toState)) {
+ var redirect = { to: to, toParams: toParams, options: options };
+ var redirectResult = handleRedirect(redirect, from.self, fromParams, options);
+
+ if (redirectResult) {
+ return redirectResult;
+ }
+
+ // Always retry once if the $stateNotFound was not prevented
+ // (handles either redirect changed or state lazy-definition)
+ to = redirect.to;
+ toParams = redirect.toParams;
+ options = redirect.options;
+ toState = findState(to, options.relative);
+
+ if (!isDefined(toState)) {
+ if (!options.relative) throw new Error("No such state '" + to + "'");
+ throw new Error("Could not resolve '" + to + "' from state '" + options.relative + "'");
+ }
+ }
+ if (toState[abstractKey]) throw new Error("Cannot transition to abstract state '" + to + "'");
+ if (options.inherit) toParams = inheritParams($stateParams, toParams || {}, $state.$current, toState);
+ if (!toState.params.$$validates(toParams)) return TransitionFailed;
+
+ toParams = toState.params.$$values(toParams);
+ to = toState;
+
+ var toPath = to.path;
+
+ // Starting from the root of the path, keep all levels that haven't changed
+ var keep = 0, state = toPath[keep], locals = root.locals, toLocals = [];
+
+ if (!options.reload) {
+ while (state && state === fromPath[keep] && state.ownParams.$$equals(toParams, fromParams)) {
+ locals = toLocals[keep] = state.locals;
+ keep++;
+ state = toPath[keep];
+ }
+ }
+
+ // If we're going to the same state and all locals are kept, we've got nothing to do.
+ // But clear 'transition', as we still want to cancel any other pending transitions.
+ // TODO: We may not want to bump 'transition' if we're called from a location change
+ // that we've initiated ourselves, because we might accidentally abort a legitimate
+ // transition initiated from code?
+ if (shouldTriggerReload(to, from, locals, options)) {
+ if (to.self.reloadOnSearch !== false) $urlRouter.update();
+ $state.transition = null;
+ return $q.when($state.current);
+ }
+
+ // Filter parameters before we pass them to event handlers etc.
+ toParams = filterByKeys(to.params.$$keys(), toParams || {});
+
+ // Broadcast start event and cancel the transition if requested
+ if (options.notify) {
+ /**
+ * @ngdoc event
+ * @name ui.router.state.$state#$stateChangeStart
+ * @eventOf ui.router.state.$state
+ * @eventType broadcast on root scope
+ * @description
+ * Fired when the state transition **begins**. You can use `event.preventDefault()`
+ * to prevent the transition from happening and then the transition promise will be
+ * rejected with a `'transition prevented'` value.
+ *
+ * @param {Object} event Event object.
+ * @param {State} toState The state being transitioned to.
+ * @param {Object} toParams The params supplied to the `toState`.
+ * @param {State} fromState The current state, pre-transition.
+ * @param {Object} fromParams The params supplied to the `fromState`.
+ *
+ * @example
+ *
+ *
+ * $rootScope.$on('$stateChangeStart',
+ * function(event, toState, toParams, fromState, fromParams){
+ * event.preventDefault();
+ * // transitionTo() promise will be rejected with
+ * // a 'transition prevented' error
+ * })
+ *
+ */
+ if ($rootScope.$broadcast('$stateChangeStart', to.self, toParams, from.self, fromParams).defaultPrevented) {
+ $urlRouter.update();
+ return TransitionPrevented;
+ }
+ }
+
+ // Resolve locals for the remaining states, but don't update any global state just
+ // yet -- if anything fails to resolve the current state needs to remain untouched.
+ // We also set up an inheritance chain for the locals here. This allows the view directive
+ // to quickly look up the correct definition for each view in the current state. Even
+ // though we create the locals object itself outside resolveState(), it is initially
+ // empty and gets filled asynchronously. We need to keep track of the promise for the
+ // (fully resolved) current locals, and pass this down the chain.
+ var resolved = $q.when(locals);
+
+ for (var l = keep; l < toPath.length; l++, state = toPath[l]) {
+ locals = toLocals[l] = inherit(locals);
+ resolved = resolveState(state, toParams, state === to, resolved, locals, options);
+ }
+
+ // Once everything is resolved, we are ready to perform the actual transition
+ // and return a promise for the new state. We also keep track of what the
+ // current promise is, so that we can detect overlapping transitions and
+ // keep only the outcome of the last transition.
+ var transition = $state.transition = resolved.then(function () {
+ var l, entering, exiting;
+
+ if ($state.transition !== transition) return TransitionSuperseded;
+
+ // Exit 'from' states not kept
+ for (l = fromPath.length - 1; l >= keep; l--) {
+ exiting = fromPath[l];
+ if (exiting.self.onExit) {
+ $injector.invoke(exiting.self.onExit, exiting.self, exiting.locals.globals);
+ }
+ exiting.locals = null;
+ }
+
+ // Enter 'to' states not kept
+ for (l = keep; l < toPath.length; l++) {
+ entering = toPath[l];
+ entering.locals = toLocals[l];
+ if (entering.self.onEnter) {
+ $injector.invoke(entering.self.onEnter, entering.self, entering.locals.globals);
+ }
+ }
+
+ // Run it again, to catch any transitions in callbacks
+ if ($state.transition !== transition) return TransitionSuperseded;
+
+ // Update globals in $state
+ $state.$current = to;
+ $state.current = to.self;
+ $state.params = toParams;
+ copy($state.params, $stateParams);
+ $state.transition = null;
+
+ if (options.location && to.navigable) {
+ $urlRouter.push(to.navigable.url, to.navigable.locals.globals.$stateParams, {
+ $$avoidResync: true, replace: options.location === 'replace'
+ });
+ }
+
+ if (options.notify) {
+ /**
+ * @ngdoc event
+ * @name ui.router.state.$state#$stateChangeSuccess
+ * @eventOf ui.router.state.$state
+ * @eventType broadcast on root scope
+ * @description
+ * Fired once the state transition is **complete**.
+ *
+ * @param {Object} event Event object.
+ * @param {State} toState The state being transitioned to.
+ * @param {Object} toParams The params supplied to the `toState`.
+ * @param {State} fromState The current state, pre-transition.
+ * @param {Object} fromParams The params supplied to the `fromState`.
+ */
+ $rootScope.$broadcast('$stateChangeSuccess', to.self, toParams, from.self, fromParams);
+ }
+ $urlRouter.update(true);
+
+ return $state.current;
+ }, function (error) {
+ if ($state.transition !== transition) return TransitionSuperseded;
+
+ $state.transition = null;
+ /**
+ * @ngdoc event
+ * @name ui.router.state.$state#$stateChangeError
+ * @eventOf ui.router.state.$state
+ * @eventType broadcast on root scope
+ * @description
+ * Fired when an **error occurs** during transition. It's important to note that if you
+ * have any errors in your resolve functions (javascript errors, non-existent services, etc)
+ * they will not throw traditionally. You must listen for this $stateChangeError event to
+ * catch **ALL** errors.
+ *
+ * @param {Object} event Event object.
+ * @param {State} toState The state being transitioned to.
+ * @param {Object} toParams The params supplied to the `toState`.
+ * @param {State} fromState The current state, pre-transition.
+ * @param {Object} fromParams The params supplied to the `fromState`.
+ * @param {Error} error The resolve error object.
+ */
+ evt = $rootScope.$broadcast('$stateChangeError', to.self, toParams, from.self, fromParams, error);
+
+ if (!evt.defaultPrevented) {
+ $urlRouter.update();
+ }
+
+ return $q.reject(error);
+ });
+
+ return transition;
+ };
+
+ /**
+ * @ngdoc function
+ * @name ui.router.state.$state#is
+ * @methodOf ui.router.state.$state
+ *
+ * @description
+ * Similar to {@link ui.router.state.$state#methods_includes $state.includes},
+ * but only checks for the full state name. If params is supplied then it will be
+ * tested for strict equality against the current active params object, so all params
+ * must match with none missing and no extras.
+ *
+ * @example
+ *
+ * $state.$current.name = 'contacts.details.item';
+ *
+ * // absolute name
+ * $state.is('contact.details.item'); // returns true
+ * $state.is(contactDetailItemStateObject); // returns true
+ *
+ * // relative name (. and ^), typically from a template
+ * // E.g. from the 'contacts.details' template
+ *
Item
+ *
+ *
+ * @param {string|object} stateOrName The state name (absolute or relative) or state object you'd like to check.
+ * @param {object=} params A param object, e.g. `{sectionId: section.id}`, that you'd like
+ * to test against the current active state.
+ * @param {object=} options An options object. The options are:
+ *
+ * - **`relative`** - {string|object} - If `stateOrName` is a relative state name and `options.relative` is set, .is will
+ * test relative to `options.relative` state (or name).
+ *
+ * @returns {boolean} Returns true if it is the state.
+ */
+ $state.is = function is(stateOrName, params, options) {
+ options = extend({ relative: $state.$current }, options || {});
+ var state = findState(stateOrName, options.relative);
+
+ if (!isDefined(state)) { return undefined; }
+ if ($state.$current !== state) { return false; }
+ return params ? equalForKeys(state.params.$$values(params), $stateParams) : true;
+ };
+
+ /**
+ * @ngdoc function
+ * @name ui.router.state.$state#includes
+ * @methodOf ui.router.state.$state
+ *
+ * @description
+ * A method to determine if the current active state is equal to or is the child of the
+ * state stateName. If any params are passed then they will be tested for a match as well.
+ * Not all the parameters need to be passed, just the ones you'd like to test for equality.
+ *
+ * @example
+ * Partial and relative names
+ *
+ * $state.$current.name = 'contacts.details.item';
+ *
+ * // Using partial names
+ * $state.includes("contacts"); // returns true
+ * $state.includes("contacts.details"); // returns true
+ * $state.includes("contacts.details.item"); // returns true
+ * $state.includes("contacts.list"); // returns false
+ * $state.includes("about"); // returns false
+ *
+ * // Using relative names (. and ^), typically from a template
+ * // E.g. from the 'contacts.details' template
+ *
+ *
+ * @param {string} stateOrName A partial name, relative name, or glob pattern
+ * to be searched for within the current state name.
+ * @param {object=} params A param object, e.g. `{sectionId: section.id}`,
+ * that you'd like to test against the current active state.
+ * @param {object=} options An options object. The options are:
+ *
+ * - **`relative`** - {string|object=} - If `stateOrName` is a relative state reference and `options.relative` is set,
+ * .includes will test relative to `options.relative` state (or name).
+ *
+ * @returns {boolean} Returns true if it does include the state
+ */
+ $state.includes = function includes(stateOrName, params, options) {
+ options = extend({ relative: $state.$current }, options || {});
+ if (isString(stateOrName) && isGlob(stateOrName)) {
+ if (!doesStateMatchGlob(stateOrName)) {
+ return false;
+ }
+ stateOrName = $state.$current.name;
+ }
+
+ var state = findState(stateOrName, options.relative);
+ if (!isDefined(state)) { return undefined; }
+ if (!isDefined($state.$current.includes[state.name])) { return false; }
+ return params ? equalForKeys(state.params.$$values(params), $stateParams, objectKeys(params)) : true;
+ };
+
+
+ /**
+ * @ngdoc function
+ * @name ui.router.state.$state#href
+ * @methodOf ui.router.state.$state
+ *
+ * @description
+ * A url generation method that returns the compiled url for the given state populated with the given params.
+ *
+ * @example
+ *
+ *
+ * @param {string|object} stateOrName The state name or state object you'd like to generate a url from.
+ * @param {object=} params An object of parameter values to fill the state's required parameters.
+ * @param {object=} options Options object. The options are:
+ *
+ * - **`lossy`** - {boolean=true} - If true, and if there is no url associated with the state provided in the
+ * first parameter, then the constructed href url will be built from the first navigable ancestor (aka
+ * ancestor with a valid url).
+ * - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url.
+ * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'),
+ * defines which state to be relative from.
+ * - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl".
+ *
+ * @returns {string} compiled state url
+ */
+ $state.href = function href(stateOrName, params, options) {
+ options = extend({
+ lossy: true,
+ inherit: true,
+ absolute: false,
+ relative: $state.$current
+ }, options || {});
+
+ var state = findState(stateOrName, options.relative);
+
+ if (!isDefined(state)) return null;
+ if (options.inherit) params = inheritParams($stateParams, params || {}, $state.$current, state);
+
+ var nav = (state && options.lossy) ? state.navigable : state;
+
+ if (!nav || nav.url === undefined || nav.url === null) {
+ return null;
+ }
+ return $urlRouter.href(nav.url, filterByKeys(state.params.$$keys(), params || {}), {
+ absolute: options.absolute
+ });
+ };
+
+ /**
+ * @ngdoc function
+ * @name ui.router.state.$state#get
+ * @methodOf ui.router.state.$state
+ *
+ * @description
+ * Returns the state configuration object for any specific state or all states.
+ *
+ * @param {string|object=} stateOrName (absolute or relative) If provided, will only get the config for
+ * the requested state. If not provided, returns an array of ALL state configs.
+ * @param {string|object=} context When stateOrName is a relative state reference, the state will be retrieved relative to context.
+ * @returns {Object|Array} State configuration object or array of all objects.
+ */
+ $state.get = function (stateOrName, context) {
+ if (arguments.length === 0) return map(objectKeys(states), function(name) { return states[name].self; });
+ var state = findState(stateOrName, context || $state.$current);
+ return (state && state.self) ? state.self : null;
+ };
+
+ function resolveState(state, params, paramsAreFiltered, inherited, dst, options) {
+ // Make a restricted $stateParams with only the parameters that apply to this state if
+ // necessary. In addition to being available to the controller and onEnter/onExit callbacks,
+ // we also need $stateParams to be available for any $injector calls we make during the
+ // dependency resolution process.
+ var $stateParams = (paramsAreFiltered) ? params : filterByKeys(state.params.$$keys(), params);
+ var locals = { $stateParams: $stateParams };
+
+ // Resolve 'global' dependencies for the state, i.e. those not specific to a view.
+ // We're also including $stateParams in this; that way the parameters are restricted
+ // to the set that should be visible to the state, and are independent of when we update
+ // the global $state and $stateParams values.
+ dst.resolve = $resolve.resolve(state.resolve, locals, dst.resolve, state);
+ var promises = [dst.resolve.then(function (globals) {
+ dst.globals = globals;
+ })];
+ if (inherited) promises.push(inherited);
+
+ // Resolve template and dependencies for all views.
+ forEach(state.views, function (view, name) {
+ var injectables = (view.resolve && view.resolve !== state.resolve ? view.resolve : {});
+ injectables.$template = [ function () {
+ return $view.load(name, { view: view, locals: locals, params: $stateParams, notify: options.notify }) || '';
+ }];
+
+ promises.push($resolve.resolve(injectables, locals, dst.resolve, state).then(function (result) {
+ // References to the controller (only instantiated at link time)
+ if (isFunction(view.controllerProvider) || isArray(view.controllerProvider)) {
+ var injectLocals = angular.extend({}, injectables, locals);
+ result.$$controller = $injector.invoke(view.controllerProvider, null, injectLocals);
+ } else {
+ result.$$controller = view.controller;
+ }
+ // Provide access to the state itself for internal use
+ result.$$state = state;
+ result.$$controllerAs = view.controllerAs;
+ dst[name] = result;
+ }));
+ });
+
+ // Wait for all the promises and then return the activation object
+ return $q.all(promises).then(function (values) {
+ return dst;
+ });
+ }
+
+ return $state;
+ }
+
+ function shouldTriggerReload(to, from, locals, options) {
+ if (to === from && ((locals === from.locals && !options.reload) || (to.self.reloadOnSearch === false))) {
+ return true;
+ }
+ }
+}
+
+angular.module('ui.router.state')
+ .value('$stateParams', {})
+ .provider('$state', $StateProvider);
+
+
+$ViewProvider.$inject = [];
+function $ViewProvider() {
+
+ this.$get = $get;
+ /**
+ * @ngdoc object
+ * @name ui.router.state.$view
+ *
+ * @requires ui.router.util.$templateFactory
+ * @requires $rootScope
+ *
+ * @description
+ *
+ */
+ $get.$inject = ['$rootScope', '$templateFactory'];
+ function $get( $rootScope, $templateFactory) {
+ return {
+ // $view.load('full.viewName', { template: ..., controller: ..., resolve: ..., async: false, params: ... })
+ /**
+ * @ngdoc function
+ * @name ui.router.state.$view#load
+ * @methodOf ui.router.state.$view
+ *
+ * @description
+ *
+ * @param {string} name name
+ * @param {object} options option object.
+ */
+ load: function load(name, options) {
+ var result, defaults = {
+ template: null, controller: null, view: null, locals: null, notify: true, async: true, params: {}
+ };
+ options = extend(defaults, options);
+
+ if (options.view) {
+ result = $templateFactory.fromConfig(options.view, options.params, options.locals);
+ }
+ if (result && options.notify) {
+ /**
+ * @ngdoc event
+ * @name ui.router.state.$state#$viewContentLoading
+ * @eventOf ui.router.state.$view
+ * @eventType broadcast on root scope
+ * @description
+ *
+ * Fired once the view **begins loading**, *before* the DOM is rendered.
+ *
+ * @param {Object} event Event object.
+ * @param {Object} viewConfig The view config properties (template, controller, etc).
+ *
+ * @example
+ *
+ *
+ * $scope.$on('$viewContentLoading',
+ * function(event, viewConfig){
+ * // Access to all the view config properties.
+ * // and one special property 'targetView'
+ * // viewConfig.targetView
+ * });
+ *
+ */
+ $rootScope.$broadcast('$viewContentLoading', options);
+ }
+ return result;
+ }
+ };
+ }
+}
+
+angular.module('ui.router.state').provider('$view', $ViewProvider);
+
+/**
+ * @ngdoc object
+ * @name ui.router.state.$uiViewScrollProvider
+ *
+ * @description
+ * Provider that returns the {@link ui.router.state.$uiViewScroll} service function.
+ */
+function $ViewScrollProvider() {
+
+ var useAnchorScroll = false;
+
+ /**
+ * @ngdoc function
+ * @name ui.router.state.$uiViewScrollProvider#useAnchorScroll
+ * @methodOf ui.router.state.$uiViewScrollProvider
+ *
+ * @description
+ * Reverts back to using the core [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) service for
+ * scrolling based on the url anchor.
+ */
+ this.useAnchorScroll = function () {
+ useAnchorScroll = true;
+ };
+
+ /**
+ * @ngdoc object
+ * @name ui.router.state.$uiViewScroll
+ *
+ * @requires $anchorScroll
+ * @requires $timeout
+ *
+ * @description
+ * When called with a jqLite element, it scrolls the element into view (after a
+ * `$timeout` so the DOM has time to refresh).
+ *
+ * If you prefer to rely on `$anchorScroll` to scroll the view to the anchor,
+ * this can be enabled by calling {@link ui.router.state.$uiViewScrollProvider#methods_useAnchorScroll `$uiViewScrollProvider.useAnchorScroll()`}.
+ */
+ this.$get = ['$anchorScroll', '$timeout', function ($anchorScroll, $timeout) {
+ if (useAnchorScroll) {
+ return $anchorScroll;
+ }
+
+ return function ($element) {
+ $timeout(function () {
+ $element[0].scrollIntoView();
+ }, 0, false);
+ };
+ }];
+}
+
+angular.module('ui.router.state').provider('$uiViewScroll', $ViewScrollProvider);
+
+/**
+ * @ngdoc directive
+ * @name ui.router.state.directive:ui-view
+ *
+ * @requires ui.router.state.$state
+ * @requires $compile
+ * @requires $controller
+ * @requires $injector
+ * @requires ui.router.state.$uiViewScroll
+ * @requires $document
+ *
+ * @restrict ECA
+ *
+ * @description
+ * The ui-view directive tells $state where to place your templates.
+ *
+ * @param {string=} name A view name. The name should be unique amongst the other views in the
+ * same state. You can have views of the same name that live in different states.
+ *
+ * @param {string=} autoscroll It allows you to set the scroll behavior of the browser window
+ * when a view is populated. By default, $anchorScroll is overridden by ui-router's custom scroll
+ * service, {@link ui.router.state.$uiViewScroll}. This custom service let's you
+ * scroll ui-view elements into view when they are populated during a state activation.
+ *
+ * *Note: To revert back to old [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll)
+ * functionality, call `$uiViewScrollProvider.useAnchorScroll()`.*
+ *
+ * @param {string=} onload Expression to evaluate whenever the view updates.
+ *
+ * @example
+ * A view can be unnamed or named.
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * You can only have one unnamed view within any template (or root html). If you are only using a
+ * single view and it is unnamed then you can populate it like so:
+ *
+ *
+ * The above is a convenient shortcut equivalent to specifying your view explicitly with the {@link ui.router.state.$stateProvider#views `views`}
+ * config property, by name, in this case an empty name:
+ *
+ *
+ * But typically you'll only use the views property if you name your view or have more than one view
+ * in the same template. There's not really a compelling reason to name a view if its the only one,
+ * but you could if you wanted, like so:
+ *
+ *
+ *
+ *
+ * When the app state is "app.user" (or any children states), and contains the state parameter "user" with value "bilbobaggins",
+ * the resulting HTML will appear as (note the 'active' class):
+ *
+ *
+ *
+ * The class name is interpolated **once** during the directives link time (any further changes to the
+ * interpolated value are ignored).
+ *
+ * Multiple classes may be specified in a space-separated format:
+ *
+ *
+ */
+
+/**
+ * @ngdoc directive
+ * @name ui.router.state.directive:ui-sref-active-eq
+ *
+ * @requires ui.router.state.$state
+ * @requires ui.router.state.$stateParams
+ * @requires $interpolate
+ *
+ * @restrict A
+ *
+ * @description
+ * The same as {@link ui.router.state.directive:ui-sref-active ui-sref-active} but will only activate
+ * when the exact target state used in the `ui-sref` is active; no child states.
+ *
+ */
+$StateRefActiveDirective.$inject = ['$state', '$stateParams', '$interpolate'];
+function $StateRefActiveDirective($state, $stateParams, $interpolate) {
+ return {
+ restrict: "A",
+ controller: ['$scope', '$element', '$attrs', function ($scope, $element, $attrs) {
+ var state, params, activeClass;
+
+ // There probably isn't much point in $observing this
+ // uiSrefActive and uiSrefActiveEq share the same directive object with some
+ // slight difference in logic routing
+ activeClass = $interpolate($attrs.uiSrefActiveEq || $attrs.uiSrefActive || '', false)($scope);
+
+ // Allow uiSref to communicate with uiSrefActive[Equals]
+ this.$$setStateInfo = function (newState, newParams) {
+ state = $state.get(newState, stateContext($element));
+ params = newParams;
+ update();
+ };
+
+ $scope.$on('$stateChangeSuccess', update);
+
+ // Update route state
+ function update() {
+ if (isMatch()) {
+ $element.addClass(activeClass);
+ } else {
+ $element.removeClass(activeClass);
+ }
+ }
+
+ function isMatch() {
+ if (typeof $attrs.uiSrefActiveEq !== 'undefined') {
+ return state && $state.is(state.name, params);
+ } else {
+ return state && $state.includes(state.name, params);
+ }
+ }
+ }]
+ };
+}
+
+angular.module('ui.router.state')
+ .directive('uiSref', $StateRefDirective)
+ .directive('uiSrefActive', $StateRefActiveDirective)
+ .directive('uiSrefActiveEq', $StateRefActiveDirective);
+
+/**
+ * @ngdoc filter
+ * @name ui.router.state.filter:isState
+ *
+ * @requires ui.router.state.$state
+ *
+ * @description
+ * Translates to {@link ui.router.state.$state#methods_is $state.is("stateName")}.
+ */
+$IsStateFilter.$inject = ['$state'];
+function $IsStateFilter($state) {
+ var isFilter = function (state) {
+ return $state.is(state);
+ };
+ isFilter.$stateful = true;
+ return isFilter;
+}
+
+/**
+ * @ngdoc filter
+ * @name ui.router.state.filter:includedByState
+ *
+ * @requires ui.router.state.$state
+ *
+ * @description
+ * Translates to {@link ui.router.state.$state#methods_includes $state.includes('fullOrPartialStateName')}.
+ */
+$IncludedByStateFilter.$inject = ['$state'];
+function $IncludedByStateFilter($state) {
+ var includesFilter = function (state) {
+ return $state.includes(state);
+ };
+ includesFilter.$stateful = true;
+ return includesFilter;
+}
+
+angular.module('ui.router.state')
+ .filter('isState', $IsStateFilter)
+ .filter('includedByState', $IncludedByStateFilter);
+})(window, window.angular);
\ No newline at end of file
diff --git a/www/lib/ionic/js/angular-ui/angular-ui-router.min.js b/www/lib/ionic/js/angular-ui/angular-ui-router.min.js
new file mode 100644
index 0000000..be06fb5
--- /dev/null
+++ b/www/lib/ionic/js/angular-ui/angular-ui-router.min.js
@@ -0,0 +1,7 @@
+/**
+ * State-based routing for AngularJS
+ * @version v0.2.13
+ * @link http://angular-ui.github.com/
+ * @license MIT License, http://www.opensource.org/licenses/MIT
+ */
+"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ui.router"),function(a,b,c){"use strict";function d(a,b){return M(new(M(function(){},{prototype:a})),b)}function e(a){return L(arguments,function(b){b!==a&&L(b,function(b,c){a.hasOwnProperty(c)||(a[c]=b)})}),a}function f(a,b){var c=[];for(var d in a.path){if(a.path[d]!==b.path[d])break;c.push(a.path[d])}return c}function g(a){if(Object.keys)return Object.keys(a);var c=[];return b.forEach(a,function(a,b){c.push(b)}),c}function h(a,b){if(Array.prototype.indexOf)return a.indexOf(b,Number(arguments[2])||0);var c=a.length>>>0,d=Number(arguments[2])||0;for(d=0>d?Math.ceil(d):Math.floor(d),0>d&&(d+=c);c>d;d++)if(d in a&&a[d]===b)return d;return-1}function i(a,b,c,d){var e,i=f(c,d),j={},k=[];for(var l in i)if(i[l].params&&(e=g(i[l].params),e.length))for(var m in e)h(k,e[m])>=0||(k.push(e[m]),j[e[m]]=a[e[m]]);return M({},j,b)}function j(a,b,c){if(!c){c=[];for(var d in a)c.push(d)}for(var e=0;e "));if(s[c]=d,I(a))q.push(c,[function(){return b.get(a)}],j);else{var e=b.annotate(a);L(e,function(a){a!==c&&i.hasOwnProperty(a)&&n(i[a],a)}),q.push(c,a,e)}r.pop(),s[c]=f}}function o(a){return J(a)&&a.then&&a.$$promises}if(!J(i))throw new Error("'invocables' must be an object");var p=g(i||{}),q=[],r=[],s={};return L(i,n),i=r=s=null,function(d,f,g){function h(){--u||(v||e(t,f.$$values),r.$$values=t,r.$$promises=r.$$promises||!0,delete r.$$inheritedValues,n.resolve(t))}function i(a){r.$$failure=a,n.reject(a)}function j(c,e,f){function j(a){l.reject(a),i(a)}function k(){if(!G(r.$$failure))try{l.resolve(b.invoke(e,g,t)),l.promise.then(function(a){t[c]=a,h()},j)}catch(a){j(a)}}var l=a.defer(),m=0;L(f,function(a){s.hasOwnProperty(a)&&!d.hasOwnProperty(a)&&(m++,s[a].then(function(b){t[a]=b,--m||k()},j))}),m||k(),s[c]=l.promise}if(o(d)&&g===c&&(g=f,f=d,d=null),d){if(!J(d))throw new Error("'locals' must be an object")}else d=k;if(f){if(!o(f))throw new Error("'parent' must be a promise returned by $resolve.resolve()")}else f=m;var n=a.defer(),r=n.promise,s=r.$$promises={},t=M({},d),u=1+q.length/3,v=!1;if(G(f.$$failure))return i(f.$$failure),r;f.$$inheritedValues&&e(t,l(f.$$inheritedValues,p)),M(s,f.$$promises),f.$$values?(v=e(t,l(f.$$values,p)),r.$$inheritedValues=l(f.$$values,p),h()):(f.$$inheritedValues&&(r.$$inheritedValues=l(f.$$inheritedValues,p)),f.then(h,i));for(var w=0,x=q.length;x>w;w+=3)d.hasOwnProperty(q[w])?h():j(q[w],q[w+1],q[w+2]);return r}},this.resolve=function(a,b,c,d){return this.study(a)(b,c,d)}}function p(a,b,c){this.fromConfig=function(a,b,c){return G(a.template)?this.fromString(a.template,b):G(a.templateUrl)?this.fromUrl(a.templateUrl,b):G(a.templateProvider)?this.fromProvider(a.templateProvider,b,c):null},this.fromString=function(a,b){return H(a)?a(b):a},this.fromUrl=function(c,d){return H(c)&&(c=c(d)),null==c?null:a.get(c,{cache:b,headers:{Accept:"text/html"}}).then(function(a){return a.data})},this.fromProvider=function(a,b,d){return c.invoke(a,null,d||{params:b})}}function q(a,b,e){function f(b,c,d,e){if(q.push(b),o[b])return o[b];if(!/^\w+(-+\w+)*(?:\[\])?$/.test(b))throw new Error("Invalid parameter name '"+b+"' in pattern '"+a+"'");if(p[b])throw new Error("Duplicate parameter name '"+b+"' in pattern '"+a+"'");return p[b]=new O.Param(b,c,d,e),p[b]}function g(a,b,c){var d=["",""],e=a.replace(/[\\\[\]\^$*+?.()|{}]/g,"\\$&");if(!b)return e;switch(c){case!1:d=["(",")"];break;case!0:d=["?(",")?"];break;default:d=["("+c+"|",")?"]}return e+d[0]+b+d[1]}function h(c,e){var f,g,h,i,j;return f=c[2]||c[3],j=b.params[f],h=a.substring(m,c.index),g=e?c[4]:c[4]||("*"==c[1]?".*":null),i=O.type(g||"string")||d(O.type("string"),{pattern:new RegExp(g)}),{id:f,regexp:g,segment:h,type:i,cfg:j}}b=M({params:{}},J(b)?b:{});var i,j=/([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,k=/([:]?)([\w\[\]-]+)|\{([\w\[\]-]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,l="^",m=0,n=this.segments=[],o=e?e.params:{},p=this.params=e?e.params.$$new():new O.ParamSet,q=[];this.source=a;for(var r,s,t;(i=j.exec(a))&&(r=h(i,!1),!(r.segment.indexOf("?")>=0));)s=f(r.id,r.type,r.cfg,"path"),l+=g(r.segment,s.type.pattern.source,s.squash),n.push(r.segment),m=j.lastIndex;t=a.substring(m);var u=t.indexOf("?");if(u>=0){var v=this.sourceSearch=t.substring(u);if(t=t.substring(0,u),this.sourcePath=a.substring(0,m+u),v.length>0)for(m=0;i=k.exec(v);)r=h(i,!0),s=f(r.id,r.type,r.cfg,"search"),m=j.lastIndex}else this.sourcePath=a,this.sourceSearch="";l+=g(t)+(b.strict===!1?"/?":"")+"$",n.push(t),this.regexp=new RegExp(l,b.caseInsensitive?"i":c),this.prefix=n[0],this.$$paramNames=q}function r(a){M(this,a)}function s(){function a(a){return null!=a?a.toString().replace(/\//g,"%2F"):a}function e(a){return null!=a?a.toString().replace(/%2F/g,"/"):a}function f(a){return this.pattern.test(a)}function i(){return{strict:t,caseInsensitive:p}}function j(a){return H(a)||K(a)&&H(a[a.length-1])}function k(){for(;x.length;){var a=x.shift();if(a.pattern)throw new Error("You cannot override a type's .pattern at runtime.");b.extend(v[a.name],o.invoke(a.def))}}function l(a){M(this,a||{})}O=this;var o,p=!1,t=!0,u=!1,v={},w=!0,x=[],y={string:{encode:a,decode:e,is:f,pattern:/[^/]*/},"int":{encode:a,decode:function(a){return parseInt(a,10)},is:function(a){return G(a)&&this.decode(a.toString())===a},pattern:/\d+/},bool:{encode:function(a){return a?1:0},decode:function(a){return 0!==parseInt(a,10)},is:function(a){return a===!0||a===!1},pattern:/0|1/},date:{encode:function(a){return this.is(a)?[a.getFullYear(),("0"+(a.getMonth()+1)).slice(-2),("0"+a.getDate()).slice(-2)].join("-"):c},decode:function(a){if(this.is(a))return a;var b=this.capture.exec(a);return b?new Date(b[1],b[2]-1,b[3]):c},is:function(a){return a instanceof Date&&!isNaN(a.valueOf())},equals:function(a,b){return this.is(a)&&this.is(b)&&a.toISOString()===b.toISOString()},pattern:/[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/,capture:/([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/},json:{encode:b.toJson,decode:b.fromJson,is:b.isObject,equals:b.equals,pattern:/[^/]*/},any:{encode:b.identity,decode:b.identity,is:b.identity,equals:b.equals,pattern:/.*/}};s.$$getDefaultValue=function(a){if(!j(a.value))return a.value;if(!o)throw new Error("Injectable functions cannot be called at configuration time");return o.invoke(a.value)},this.caseInsensitive=function(a){return G(a)&&(p=a),p},this.strictMode=function(a){return G(a)&&(t=a),t},this.defaultSquashPolicy=function(a){if(!G(a))return u;if(a!==!0&&a!==!1&&!I(a))throw new Error("Invalid squash policy: "+a+". Valid policies: false, true, arbitrary-string");return u=a,a},this.compile=function(a,b){return new q(a,M(i(),b))},this.isMatcher=function(a){if(!J(a))return!1;var b=!0;return L(q.prototype,function(c,d){H(c)&&(b=b&&G(a[d])&&H(a[d]))}),b},this.type=function(a,b,c){if(!G(b))return v[a];if(v.hasOwnProperty(a))throw new Error("A type named '"+a+"' has already been defined.");return v[a]=new r(M({name:a},b)),c&&(x.push({name:a,def:c}),w||k()),this},L(y,function(a,b){v[b]=new r(M({name:b},a))}),v=d(v,{}),this.$get=["$injector",function(a){return o=a,w=!1,k(),L(y,function(a,b){v[b]||(v[b]=new r(a))}),this}],this.Param=function(a,b,d,e){function f(a){var b=J(a)?g(a):[],c=-1===h(b,"value")&&-1===h(b,"type")&&-1===h(b,"squash")&&-1===h(b,"array");return c&&(a={value:a}),a.$$fn=j(a.value)?a.value:function(){return a.value},a}function i(b,c,d){if(b.type&&c)throw new Error("Param '"+a+"' has two type configurations.");return c?c:b.type?b.type instanceof r?b.type:new r(b.type):"config"===d?v.any:v.string}function k(){var b={array:"search"===e?"auto":!1},c=a.match(/\[\]$/)?{array:!0}:{};return M(b,c,d).array}function l(a,b){var c=a.squash;if(!b||c===!1)return!1;if(!G(c)||null==c)return u;if(c===!0||I(c))return c;throw new Error("Invalid squash policy: '"+c+"'. Valid policies: false, true, or arbitrary string")}function p(a,b,d,e){var f,g,i=[{from:"",to:d||b?c:""},{from:null,to:d||b?c:""}];return f=K(a.replace)?a.replace:[],I(e)&&f.push({from:e,to:c}),g=n(f,function(a){return a.from}),m(i,function(a){return-1===h(g,a.from)}).concat(f)}function q(){if(!o)throw new Error("Injectable functions cannot be called at configuration time");return o.invoke(d.$$fn)}function s(a){function b(a){return function(b){return b.from===a}}function c(a){var c=n(m(w.replace,b(a)),function(a){return a.to});return c.length?c[0]:a}return a=c(a),G(a)?w.type.decode(a):q()}function t(){return"{Param:"+a+" "+b+" squash: '"+z+"' optional: "+y+"}"}var w=this;d=f(d),b=i(d,b,e);var x=k();b=x?b.$asArray(x,"search"===e):b,"string"!==b.name||x||"path"!==e||d.value!==c||(d.value="");var y=d.value!==c,z=l(d,y),A=p(d,x,y,z);M(this,{id:a,type:b,location:e,array:x,squash:z,replace:A,isOptional:y,value:s,dynamic:c,config:d,toString:t})},l.prototype={$$new:function(){return d(this,M(new l,{$$parent:this}))},$$keys:function(){for(var a=[],b=[],c=this,d=g(l.prototype);c;)b.push(c),c=c.$$parent;return b.reverse(),L(b,function(b){L(g(b),function(b){-1===h(a,b)&&-1===h(d,b)&&a.push(b)})}),a},$$values:function(a){var b={},c=this;return L(c.$$keys(),function(d){b[d]=c[d].value(a&&a[d])}),b},$$equals:function(a,b){var c=!0,d=this;return L(d.$$keys(),function(e){var f=a&&a[e],g=b&&b[e];d[e].type.equals(f,g)||(c=!1)}),c},$$validates:function(a){var b,c,d,e=!0,f=this;return L(this.$$keys(),function(g){d=f[g],c=a[g],b=!c&&d.isOptional,e=e&&(b||!!d.type.is(c))}),e},$$parent:c},this.ParamSet=l}function t(a,d){function e(a){var b=/^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(a.source);return null!=b?b[1].replace(/\\(.)/g,"$1"):""}function f(a,b){return a.replace(/\$(\$|\d{1,2})/,function(a,c){return b["$"===c?0:Number(c)]})}function g(a,b,c){if(!c)return!1;var d=a.invoke(b,b,{$match:c});return G(d)?d:!0}function h(d,e,f,g){function h(a,b,c){return"/"===p?a:b?p.slice(0,-1)+a:c?p.slice(1)+a:a}function m(a){function b(a){var b=a(f,d);return b?(I(b)&&d.replace().url(b),!0):!1}if(!a||!a.defaultPrevented){var e=o&&d.url()===o;if(o=c,e)return!0;var g,h=j.length;for(g=0;h>g;g++)if(b(j[g]))return;k&&b(k)}}function n(){return i=i||e.$on("$locationChangeSuccess",m)}var o,p=g.baseHref(),q=d.url();return l||n(),{sync:function(){m()},listen:function(){return n()},update:function(a){return a?void(q=d.url()):void(d.url()!==q&&(d.url(q),d.replace()))},push:function(a,b,e){d.url(a.format(b||{})),o=e&&e.$$avoidResync?d.url():c,e&&e.replace&&d.replace()},href:function(c,e,f){if(!c.validates(e))return null;var g=a.html5Mode();b.isObject(g)&&(g=g.enabled);var i=c.format(e);if(f=f||{},g||null===i||(i="#"+a.hashPrefix()+i),i=h(i,g,f.absolute),!f.absolute||!i)return i;var j=!g&&i?"/":"",k=d.port();return k=80===k||443===k?"":":"+k,[d.protocol(),"://",d.host(),k,j,i].join("")}}}var i,j=[],k=null,l=!1;this.rule=function(a){if(!H(a))throw new Error("'rule' must be a function");return j.push(a),this},this.otherwise=function(a){if(I(a)){var b=a;a=function(){return b}}else if(!H(a))throw new Error("'rule' must be a function");return k=a,this},this.when=function(a,b){var c,h=I(b);if(I(a)&&(a=d.compile(a)),!h&&!H(b)&&!K(b))throw new Error("invalid 'handler' in when()");var i={matcher:function(a,b){return h&&(c=d.compile(b),b=["$match",function(a){return c.format(a)}]),M(function(c,d){return g(c,b,a.exec(d.path(),d.search()))},{prefix:I(a.prefix)?a.prefix:""})},regex:function(a,b){if(a.global||a.sticky)throw new Error("when() RegExp must not be global or sticky");return h&&(c=b,b=["$match",function(a){return f(c,a)}]),M(function(c,d){return g(c,b,a.exec(d.path()))},{prefix:e(a)})}},j={matcher:d.isMatcher(a),regex:a instanceof RegExp};for(var k in j)if(j[k])return this.rule(i[k](a,b));throw new Error("invalid 'what' in when()")},this.deferIntercept=function(a){a===c&&(a=!0),l=a},this.$get=h,h.$inject=["$location","$rootScope","$injector","$browser"]}function u(a,e){function f(a){return 0===a.indexOf(".")||0===a.indexOf("^")}function l(a,b){if(!a)return c;var d=I(a),e=d?a:a.name,g=f(e);if(g){if(!b)throw new Error("No reference point given for path '"+e+"'");b=l(b);for(var h=e.split("."),i=0,j=h.length,k=b;j>i;i++)if(""!==h[i]||0!==i){if("^"!==h[i])break;if(!k.parent)throw new Error("Path '"+e+"' not valid for state '"+b.name+"'");k=k.parent}else k=b;h=h.slice(i).join("."),e=k.name+(k.name&&h?".":"")+h}var m=y[e];return!m||!d&&(d||m!==a&&m.self!==a)?c:m}function m(a,b){z[a]||(z[a]=[]),z[a].push(b)}function o(a){for(var b=z[a]||[];b.length;)p(b.shift())}function p(b){b=d(b,{self:b,resolve:b.resolve||{},toString:function(){return this.name}});var c=b.name;if(!I(c)||c.indexOf("@")>=0)throw new Error("State must have a valid name");if(y.hasOwnProperty(c))throw new Error("State '"+c+"'' is already defined");var e=-1!==c.indexOf(".")?c.substring(0,c.lastIndexOf(".")):I(b.parent)?b.parent:J(b.parent)&&I(b.parent.name)?b.parent.name:"";if(e&&!y[e])return m(e,b.self);for(var f in B)H(B[f])&&(b[f]=B[f](b,B.$delegates[f]));return y[c]=b,!b[A]&&b.url&&a.when(b.url,["$match","$stateParams",function(a,c){x.$current.navigable==b&&j(a,c)||x.transitionTo(b,a,{inherit:!0,location:!1})}]),o(c),b}function q(a){return a.indexOf("*")>-1}function r(a){var b=a.split("."),c=x.$current.name.split(".");if("**"===b[0]&&(c=c.slice(h(c,b[1])),c.unshift("**")),"**"===b[b.length-1]&&(c.splice(h(c,b[b.length-2])+1,Number.MAX_VALUE),c.push("**")),b.length!=c.length)return!1;for(var d=0,e=b.length;e>d;d++)"*"===b[d]&&(c[d]="*");return c.join("")===b.join("")}function s(a,b){return I(a)&&!G(b)?B[a]:H(b)&&I(a)?(B[a]&&!B.$delegates[a]&&(B.$delegates[a]=B[a]),B[a]=b,this):this}function t(a,b){return J(a)?b=a:b.name=a,p(b),this}function u(a,e,f,h,m,o,p){function s(b,c,d,f){var g=a.$broadcast("$stateNotFound",b,c,d);if(g.defaultPrevented)return p.update(),B;if(!g.retry)return null;if(f.$retry)return p.update(),C;var h=x.transition=e.when(g.retry);return h.then(function(){return h!==x.transition?u:(b.options.$retry=!0,x.transitionTo(b.to,b.toParams,b.options))},function(){return B}),p.update(),h}function t(a,c,d,g,i,j){var l=d?c:k(a.params.$$keys(),c),n={$stateParams:l};i.resolve=m.resolve(a.resolve,n,i.resolve,a);var o=[i.resolve.then(function(a){i.globals=a})];return g&&o.push(g),L(a.views,function(c,d){var e=c.resolve&&c.resolve!==a.resolve?c.resolve:{};e.$template=[function(){return f.load(d,{view:c,locals:n,params:l,notify:j.notify})||""}],o.push(m.resolve(e,n,i.resolve,a).then(function(f){if(H(c.controllerProvider)||K(c.controllerProvider)){var g=b.extend({},e,n);f.$$controller=h.invoke(c.controllerProvider,null,g)}else f.$$controller=c.controller;f.$$state=a,f.$$controllerAs=c.controllerAs,i[d]=f}))}),e.all(o).then(function(){return i})}var u=e.reject(new Error("transition superseded")),z=e.reject(new Error("transition prevented")),B=e.reject(new Error("transition aborted")),C=e.reject(new Error("transition failed"));return w.locals={resolve:null,globals:{$stateParams:{}}},x={params:{},current:w.self,$current:w,transition:null},x.reload=function(){return x.transitionTo(x.current,o,{reload:!0,inherit:!1,notify:!0})},x.go=function(a,b,c){return x.transitionTo(a,b,M({inherit:!0,relative:x.$current},c))},x.transitionTo=function(b,c,f){c=c||{},f=M({location:!0,inherit:!1,relative:null,notify:!0,reload:!1,$retry:!1},f||{});var g,j=x.$current,m=x.params,n=j.path,q=l(b,f.relative);if(!G(q)){var r={to:b,toParams:c,options:f},y=s(r,j.self,m,f);if(y)return y;if(b=r.to,c=r.toParams,f=r.options,q=l(b,f.relative),!G(q)){if(!f.relative)throw new Error("No such state '"+b+"'");throw new Error("Could not resolve '"+b+"' from state '"+f.relative+"'")}}if(q[A])throw new Error("Cannot transition to abstract state '"+b+"'");if(f.inherit&&(c=i(o,c||{},x.$current,q)),!q.params.$$validates(c))return C;c=q.params.$$values(c),b=q;var B=b.path,D=0,E=B[D],F=w.locals,H=[];if(!f.reload)for(;E&&E===n[D]&&E.ownParams.$$equals(c,m);)F=H[D]=E.locals,D++,E=B[D];if(v(b,j,F,f))return b.self.reloadOnSearch!==!1&&p.update(),x.transition=null,e.when(x.current);if(c=k(b.params.$$keys(),c||{}),f.notify&&a.$broadcast("$stateChangeStart",b.self,c,j.self,m).defaultPrevented)return p.update(),z;for(var I=e.when(F),J=D;J=D;d--)g=n[d],g.self.onExit&&h.invoke(g.self.onExit,g.self,g.locals.globals),g.locals=null;for(d=D;d=0?e:e+"@"+(f?f.state.name:"")}function A(a,b){var c,d=a.match(/^\s*({[^}]*})\s*$/);if(d&&(a=b+"("+d[1]+")"),c=a.replace(/\n/g," ").match(/^([^(]+?)\s*(\((.*)\))?$/),!c||4!==c.length)throw new Error("Invalid state ref '"+a+"'");return{state:c[1],paramExpr:c[3]||null}}function B(a){var b=a.parent().inheritedData("$uiView");return b&&b.state&&b.state.name?b.state:void 0}function C(a,c){var d=["location","inherit","reload"];return{restrict:"A",require:["?^uiSrefActive","?^uiSrefActiveEq"],link:function(e,f,g,h){var i=A(g.uiSref,a.current.name),j=null,k=B(f)||a.$current,l=null,m="A"===f.prop("tagName"),n="FORM"===f[0].nodeName,o=n?"action":"href",p=!0,q={relative:k,inherit:!0},r=e.$eval(g.uiSrefOpts)||{};b.forEach(d,function(a){a in r&&(q[a]=r[a])});var s=function(c){if(c&&(j=b.copy(c)),p){l=a.href(i.state,j,q);var d=h[1]||h[0];return d&&d.$$setStateInfo(i.state,j),null===l?(p=!1,!1):void g.$set(o,l)}};i.paramExpr&&(e.$watch(i.paramExpr,function(a){a!==j&&s(a)},!0),j=b.copy(e.$eval(i.paramExpr))),s(),n||f.bind("click",function(b){var d=b.which||b.button;if(!(d>1||b.ctrlKey||b.metaKey||b.shiftKey||f.attr("target"))){var e=c(function(){a.go(i.state,j,q)});b.preventDefault();var g=m&&!l?1:0;b.preventDefault=function(){g--<=0&&c.cancel(e)}}})}}}function D(a,b,c){return{restrict:"A",controller:["$scope","$element","$attrs",function(b,d,e){function f(){g()?d.addClass(j):d.removeClass(j)}function g(){return"undefined"!=typeof e.uiSrefActiveEq?h&&a.is(h.name,i):h&&a.includes(h.name,i)}var h,i,j;j=c(e.uiSrefActiveEq||e.uiSrefActive||"",!1)(b),this.$$setStateInfo=function(b,c){h=a.get(b,B(d)),i=c,f()},b.$on("$stateChangeSuccess",f)}]}}function E(a){var b=function(b){return a.is(b)};return b.$stateful=!0,b}function F(a){var b=function(b){return a.includes(b)};return b.$stateful=!0,b}var G=b.isDefined,H=b.isFunction,I=b.isString,J=b.isObject,K=b.isArray,L=b.forEach,M=b.extend,N=b.copy;b.module("ui.router.util",["ng"]),b.module("ui.router.router",["ui.router.util"]),b.module("ui.router.state",["ui.router.router","ui.router.util"]),b.module("ui.router",["ui.router.state"]),b.module("ui.router.compat",["ui.router"]),o.$inject=["$q","$injector"],b.module("ui.router.util").service("$resolve",o),p.$inject=["$http","$templateCache","$injector"],b.module("ui.router.util").service("$templateFactory",p);var O;q.prototype.concat=function(a,b){var c={caseInsensitive:O.caseInsensitive(),strict:O.strictMode(),squash:O.defaultSquashPolicy()};return new q(this.sourcePath+a+this.sourceSearch,M(c,b),this)},q.prototype.toString=function(){return this.source},q.prototype.exec=function(a,b){function c(a){function b(a){return a.split("").reverse().join("")}function c(a){return a.replace(/\\-/,"-")}var d=b(a).split(/-(?!\\)/),e=n(d,b);return n(e,c).reverse()}var d=this.regexp.exec(a);if(!d)return null;b=b||{};var e,f,g,h=this.parameters(),i=h.length,j=this.segments.length-1,k={};if(j!==d.length-1)throw new Error("Unbalanced capture group in route '"+this.source+"'");for(e=0;j>e;e++){g=h[e];var l=this.params[g],m=d[e+1];for(f=0;fe;e++)g=h[e],k[g]=this.params[g].value(b[g]);return k},q.prototype.parameters=function(a){return G(a)?this.params[a]||null:this.$$paramNames},q.prototype.validates=function(a){return this.params.$$validates(a)},q.prototype.format=function(a){function b(a){return encodeURIComponent(a).replace(/-/g,function(a){return"%5C%"+a.charCodeAt(0).toString(16).toUpperCase()})}a=a||{};var c=this.segments,d=this.parameters(),e=this.params;if(!this.validates(a))return null;var f,g=!1,h=c.length-1,i=d.length,j=c[0];for(f=0;i>f;f++){var k=h>f,l=d[f],m=e[l],o=m.value(a[l]),p=m.isOptional&&m.type.equals(m.value(),o),q=p?m.squash:!1,r=m.type.encode(o);if(k){var s=c[f+1];if(q===!1)null!=r&&(j+=K(r)?n(r,b).join("-"):encodeURIComponent(r)),j+=s;else if(q===!0){var t=j.match(/\/$/)?/\/?(.*)/:/(.*)/;j+=s.match(t)[1]}else I(q)&&(j+=q+s)}else{if(null==r||p&&q!==!1)continue;K(r)||(r=[r]),r=n(r,encodeURIComponent).join("&"+l+"="),j+=(g?"&":"?")+(l+"="+r),g=!0}}return j},r.prototype.is=function(){return!0},r.prototype.encode=function(a){return a},r.prototype.decode=function(a){return a},r.prototype.equals=function(a,b){return a==b},r.prototype.$subPattern=function(){var a=this.pattern.toString();return a.substr(1,a.length-2)},r.prototype.pattern=/.*/,r.prototype.toString=function(){return"{Type:"+this.name+"}"},r.prototype.$asArray=function(a,b){function d(a,b){function d(a,b){return function(){return a[b].apply(a,arguments)}}function e(a){return K(a)?a:G(a)?[a]:[]}function f(a){switch(a.length){case 0:return c;case 1:return"auto"===b?a[0]:a;default:return a}}function g(a){return!a}function h(a,b){return function(c){c=e(c);var d=n(c,a);return b===!0?0===m(d,g).length:f(d)}}function i(a){return function(b,c){var d=e(b),f=e(c);if(d.length!==f.length)return!1;for(var g=0;g 0) {
+ className += (i > 0) ? ' ' : '';
+ className += isPrefix ? fix + klass
+ : klass + fix;
+ }
+ });
+ return className;
+}
+
+function removeFromArray(arr, val) {
+ var index = arr.indexOf(val);
+ if (val >= 0) {
+ arr.splice(index, 1);
+ }
+}
+
+function stripCommentsFromElement(element) {
+ if (element instanceof jqLite) {
+ switch (element.length) {
+ case 0:
+ return [];
+ break;
+
+ case 1:
+ // there is no point of stripping anything if the element
+ // is the only element within the jqLite wrapper.
+ // (it's important that we retain the element instance.)
+ if (element[0].nodeType === ELEMENT_NODE) {
+ return element;
+ }
+ break;
+
+ default:
+ return jqLite(extractElementNode(element));
+ break;
+ }
+ }
+
+ if (element.nodeType === ELEMENT_NODE) {
+ return jqLite(element);
+ }
+}
+
+function extractElementNode(element) {
+ if (!element[0]) return element;
+ for (var i = 0; i < element.length; i++) {
+ var elm = element[i];
+ if (elm.nodeType == ELEMENT_NODE) {
+ return elm;
+ }
+ }
+}
+
+function $$addClass($$jqLite, element, className) {
+ forEach(element, function(elm) {
+ $$jqLite.addClass(elm, className);
+ });
+}
+
+function $$removeClass($$jqLite, element, className) {
+ forEach(element, function(elm) {
+ $$jqLite.removeClass(elm, className);
+ });
+}
+
+function applyAnimationClassesFactory($$jqLite) {
+ return function(element, options) {
+ if (options.addClass) {
+ $$addClass($$jqLite, element, options.addClass);
+ options.addClass = null;
+ }
+ if (options.removeClass) {
+ $$removeClass($$jqLite, element, options.removeClass);
+ options.removeClass = null;
+ }
+ }
+}
+
+function prepareAnimationOptions(options) {
+ options = options || {};
+ if (!options.$$prepared) {
+ var domOperation = options.domOperation || noop;
+ options.domOperation = function() {
+ options.$$domOperationFired = true;
+ domOperation();
+ domOperation = noop;
+ };
+ options.$$prepared = true;
+ }
+ return options;
+}
+
+function applyAnimationStyles(element, options) {
+ applyAnimationFromStyles(element, options);
+ applyAnimationToStyles(element, options);
+}
+
+function applyAnimationFromStyles(element, options) {
+ if (options.from) {
+ element.css(options.from);
+ options.from = null;
+ }
+}
+
+function applyAnimationToStyles(element, options) {
+ if (options.to) {
+ element.css(options.to);
+ options.to = null;
+ }
+}
+
+function mergeAnimationDetails(element, oldAnimation, newAnimation) {
+ var target = oldAnimation.options || {};
+ var newOptions = newAnimation.options || {};
+
+ var toAdd = (target.addClass || '') + ' ' + (newOptions.addClass || '');
+ var toRemove = (target.removeClass || '') + ' ' + (newOptions.removeClass || '');
+ var classes = resolveElementClasses(element.attr('class'), toAdd, toRemove);
+
+ if (newOptions.preparationClasses) {
+ target.preparationClasses = concatWithSpace(newOptions.preparationClasses, target.preparationClasses);
+ delete newOptions.preparationClasses;
+ }
+
+ // noop is basically when there is no callback; otherwise something has been set
+ var realDomOperation = target.domOperation !== noop ? target.domOperation : null;
+
+ extend(target, newOptions);
+
+ // TODO(matsko or sreeramu): proper fix is to maintain all animation callback in array and call at last,but now only leave has the callback so no issue with this.
+ if (realDomOperation) {
+ target.domOperation = realDomOperation;
+ }
+
+ if (classes.addClass) {
+ target.addClass = classes.addClass;
+ } else {
+ target.addClass = null;
+ }
+
+ if (classes.removeClass) {
+ target.removeClass = classes.removeClass;
+ } else {
+ target.removeClass = null;
+ }
+
+ oldAnimation.addClass = target.addClass;
+ oldAnimation.removeClass = target.removeClass;
+
+ return target;
+}
+
+function resolveElementClasses(existing, toAdd, toRemove) {
+ var ADD_CLASS = 1;
+ var REMOVE_CLASS = -1;
+
+ var flags = {};
+ existing = splitClassesToLookup(existing);
+
+ toAdd = splitClassesToLookup(toAdd);
+ forEach(toAdd, function(value, key) {
+ flags[key] = ADD_CLASS;
+ });
+
+ toRemove = splitClassesToLookup(toRemove);
+ forEach(toRemove, function(value, key) {
+ flags[key] = flags[key] === ADD_CLASS ? null : REMOVE_CLASS;
+ });
+
+ var classes = {
+ addClass: '',
+ removeClass: ''
+ };
+
+ forEach(flags, function(val, klass) {
+ var prop, allow;
+ if (val === ADD_CLASS) {
+ prop = 'addClass';
+ allow = !existing[klass];
+ } else if (val === REMOVE_CLASS) {
+ prop = 'removeClass';
+ allow = existing[klass];
+ }
+ if (allow) {
+ if (classes[prop].length) {
+ classes[prop] += ' ';
+ }
+ classes[prop] += klass;
+ }
+ });
+
+ function splitClassesToLookup(classes) {
+ if (isString(classes)) {
+ classes = classes.split(' ');
+ }
+
+ var obj = {};
+ forEach(classes, function(klass) {
+ // sometimes the split leaves empty string values
+ // incase extra spaces were applied to the options
+ if (klass.length) {
+ obj[klass] = true;
+ }
+ });
+ return obj;
+ }
+
+ return classes;
+}
+
+function getDomNode(element) {
+ return (element instanceof angular.element) ? element[0] : element;
+}
+
+function applyGeneratedPreparationClasses(element, event, options) {
+ var classes = '';
+ if (event) {
+ classes = pendClasses(event, EVENT_CLASS_PREFIX, true);
+ }
+ if (options.addClass) {
+ classes = concatWithSpace(classes, pendClasses(options.addClass, ADD_CLASS_SUFFIX));
+ }
+ if (options.removeClass) {
+ classes = concatWithSpace(classes, pendClasses(options.removeClass, REMOVE_CLASS_SUFFIX));
+ }
+ if (classes.length) {
+ options.preparationClasses = classes;
+ element.addClass(classes);
+ }
+}
+
+function clearGeneratedClasses(element, options) {
+ if (options.preparationClasses) {
+ element.removeClass(options.preparationClasses);
+ options.preparationClasses = null;
+ }
+ if (options.activeClasses) {
+ element.removeClass(options.activeClasses);
+ options.activeClasses = null;
+ }
+}
+
+function blockTransitions(node, duration) {
+ // we use a negative delay value since it performs blocking
+ // yet it doesn't kill any existing transitions running on the
+ // same element which makes this safe for class-based animations
+ var value = duration ? '-' + duration + 's' : '';
+ applyInlineStyle(node, [TRANSITION_DELAY_PROP, value]);
+ return [TRANSITION_DELAY_PROP, value];
+}
+
+function blockKeyframeAnimations(node, applyBlock) {
+ var value = applyBlock ? 'paused' : '';
+ var key = ANIMATION_PROP + ANIMATION_PLAYSTATE_KEY;
+ applyInlineStyle(node, [key, value]);
+ return [key, value];
+}
+
+function applyInlineStyle(node, styleTuple) {
+ var prop = styleTuple[0];
+ var value = styleTuple[1];
+ node.style[prop] = value;
+}
+
+function concatWithSpace(a,b) {
+ if (!a) return b;
+ if (!b) return a;
+ return a + ' ' + b;
+}
+
+var $$rAFSchedulerFactory = ['$$rAF', function($$rAF) {
+ var queue, cancelFn;
+
+ function scheduler(tasks) {
+ // we make a copy since RAFScheduler mutates the state
+ // of the passed in array variable and this would be difficult
+ // to track down on the outside code
+ queue = queue.concat(tasks);
+ nextTick();
+ }
+
+ queue = scheduler.queue = [];
+
+ /* waitUntilQuiet does two things:
+ * 1. It will run the FINAL `fn` value only when an uncanceled RAF has passed through
+ * 2. It will delay the next wave of tasks from running until the quiet `fn` has run.
+ *
+ * The motivation here is that animation code can request more time from the scheduler
+ * before the next wave runs. This allows for certain DOM properties such as classes to
+ * be resolved in time for the next animation to run.
+ */
+ scheduler.waitUntilQuiet = function(fn) {
+ if (cancelFn) cancelFn();
+
+ cancelFn = $$rAF(function() {
+ cancelFn = null;
+ fn();
+ nextTick();
+ });
+ };
+
+ return scheduler;
+
+ function nextTick() {
+ if (!queue.length) return;
+
+ var items = queue.shift();
+ for (var i = 0; i < items.length; i++) {
+ items[i]();
+ }
+
+ if (!cancelFn) {
+ $$rAF(function() {
+ if (!cancelFn) nextTick();
+ });
+ }
+ }
+}];
+
+/**
+ * @ngdoc directive
+ * @name ngAnimateChildren
+ * @restrict AE
+ * @element ANY
+ *
+ * @description
+ *
+ * ngAnimateChildren allows you to specify that children of this element should animate even if any
+ * of the children's parents are currently animating. By default, when an element has an active `enter`, `leave`, or `move`
+ * (structural) animation, child elements that also have an active structural animation are not animated.
+ *
+ * Note that even if `ngAnimteChildren` is set, no child animations will run when the parent element is removed from the DOM (`leave` animation).
+ *
+ *
+ * @param {string} ngAnimateChildren If the value is empty, `true` or `on`,
+ * then child animations are allowed. If the value is `false`, child animations are not allowed.
+ *
+ * @example
+ *
+
+
+
+
+
+
+
+ List of items:
+
Item {{item}}
+
+
+
+
+
+
+ .container.ng-enter,
+ .container.ng-leave {
+ transition: all ease 1.5s;
+ }
+
+ .container.ng-enter,
+ .container.ng-leave-active {
+ opacity: 0;
+ }
+
+ .container.ng-leave,
+ .container.ng-enter-active {
+ opacity: 1;
+ }
+
+ .item {
+ background: firebrick;
+ color: #FFF;
+ margin-bottom: 10px;
+ }
+
+ .item.ng-enter,
+ .item.ng-leave {
+ transition: transform 1.5s ease;
+ }
+
+ .item.ng-enter {
+ transform: translateX(50px);
+ }
+
+ .item.ng-enter-active {
+ transform: translateX(0);
+ }
+
+
+ angular.module('ngAnimateChildren', ['ngAnimate'])
+ .controller('mainController', function() {
+ this.animateChildren = false;
+ this.enterElement = false;
+ });
+
+
+ */
+var $$AnimateChildrenDirective = ['$interpolate', function($interpolate) {
+ return {
+ link: function(scope, element, attrs) {
+ var val = attrs.ngAnimateChildren;
+ if (angular.isString(val) && val.length === 0) { //empty attribute
+ element.data(NG_ANIMATE_CHILDREN_DATA, true);
+ } else {
+ // Interpolate and set the value, so that it is available to
+ // animations that run right after compilation
+ setData($interpolate(val)(scope));
+ attrs.$observe('ngAnimateChildren', setData);
+ }
+
+ function setData(value) {
+ value = value === 'on' || value === 'true';
+ element.data(NG_ANIMATE_CHILDREN_DATA, value);
+ }
+ }
+ };
+}];
+
+var ANIMATE_TIMER_KEY = '$$animateCss';
+
+/**
+ * @ngdoc service
+ * @name $animateCss
+ * @kind object
+ *
+ * @description
+ * The `$animateCss` service is a useful utility to trigger customized CSS-based transitions/keyframes
+ * from a JavaScript-based animation or directly from a directive. The purpose of `$animateCss` is NOT
+ * to side-step how `$animate` and ngAnimate work, but the goal is to allow pre-existing animations or
+ * directives to create more complex animations that can be purely driven using CSS code.
+ *
+ * Note that only browsers that support CSS transitions and/or keyframe animations are capable of
+ * rendering animations triggered via `$animateCss` (bad news for IE9 and lower).
+ *
+ * ## Usage
+ * Once again, `$animateCss` is designed to be used inside of a registered JavaScript animation that
+ * is powered by ngAnimate. It is possible to use `$animateCss` directly inside of a directive, however,
+ * any automatic control over cancelling animations and/or preventing animations from being run on
+ * child elements will not be handled by Angular. For this to work as expected, please use `$animate` to
+ * trigger the animation and then setup a JavaScript animation that injects `$animateCss` to trigger
+ * the CSS animation.
+ *
+ * The example below shows how we can create a folding animation on an element using `ng-if`:
+ *
+ * ```html
+ *
+ *
+ * This element will go BOOM
+ *
+ *
+ * ```
+ *
+ * Now we create the **JavaScript animation** that will trigger the CSS transition:
+ *
+ * ```js
+ * ngModule.animation('.fold-animation', ['$animateCss', function($animateCss) {
+ * return {
+ * enter: function(element, doneFn) {
+ * var height = element[0].offsetHeight;
+ * return $animateCss(element, {
+ * from: { height:'0px' },
+ * to: { height:height + 'px' },
+ * duration: 1 // one second
+ * });
+ * }
+ * }
+ * }]);
+ * ```
+ *
+ * ## More Advanced Uses
+ *
+ * `$animateCss` is the underlying code that ngAnimate uses to power **CSS-based animations** behind the scenes. Therefore CSS hooks
+ * like `.ng-EVENT`, `.ng-EVENT-active`, `.ng-EVENT-stagger` are all features that can be triggered using `$animateCss` via JavaScript code.
+ *
+ * This also means that just about any combination of adding classes, removing classes, setting styles, dynamically setting a keyframe animation,
+ * applying a hardcoded duration or delay value, changing the animation easing or applying a stagger animation are all options that work with
+ * `$animateCss`. The service itself is smart enough to figure out the combination of options and examine the element styling properties in order
+ * to provide a working animation that will run in CSS.
+ *
+ * The example below showcases a more advanced version of the `.fold-animation` from the example above:
+ *
+ * ```js
+ * ngModule.animation('.fold-animation', ['$animateCss', function($animateCss) {
+ * return {
+ * enter: function(element, doneFn) {
+ * var height = element[0].offsetHeight;
+ * return $animateCss(element, {
+ * addClass: 'red large-text pulse-twice',
+ * easing: 'ease-out',
+ * from: { height:'0px' },
+ * to: { height:height + 'px' },
+ * duration: 1 // one second
+ * });
+ * }
+ * }
+ * }]);
+ * ```
+ *
+ * Since we're adding/removing CSS classes then the CSS transition will also pick those up:
+ *
+ * ```css
+ * /* since a hardcoded duration value of 1 was provided in the JavaScript animation code,
+ * the CSS classes below will be transitioned despite them being defined as regular CSS classes */
+ * .red { background:red; }
+ * .large-text { font-size:20px; }
+ *
+ * /* we can also use a keyframe animation and $animateCss will make it work alongside the transition */
+ * .pulse-twice {
+ * animation: 0.5s pulse linear 2;
+ * -webkit-animation: 0.5s pulse linear 2;
+ * }
+ *
+ * @keyframes pulse {
+ * from { transform: scale(0.5); }
+ * to { transform: scale(1.5); }
+ * }
+ *
+ * @-webkit-keyframes pulse {
+ * from { -webkit-transform: scale(0.5); }
+ * to { -webkit-transform: scale(1.5); }
+ * }
+ * ```
+ *
+ * Given this complex combination of CSS classes, styles and options, `$animateCss` will figure everything out and make the animation happen.
+ *
+ * ## How the Options are handled
+ *
+ * `$animateCss` is very versatile and intelligent when it comes to figuring out what configurations to apply to the element to ensure the animation
+ * works with the options provided. Say for example we were adding a class that contained a keyframe value and we wanted to also animate some inline
+ * styles using the `from` and `to` properties.
+ *
+ * ```js
+ * var animator = $animateCss(element, {
+ * from: { background:'red' },
+ * to: { background:'blue' }
+ * });
+ * animator.start();
+ * ```
+ *
+ * ```css
+ * .rotating-animation {
+ * animation:0.5s rotate linear;
+ * -webkit-animation:0.5s rotate linear;
+ * }
+ *
+ * @keyframes rotate {
+ * from { transform: rotate(0deg); }
+ * to { transform: rotate(360deg); }
+ * }
+ *
+ * @-webkit-keyframes rotate {
+ * from { -webkit-transform: rotate(0deg); }
+ * to { -webkit-transform: rotate(360deg); }
+ * }
+ * ```
+ *
+ * The missing pieces here are that we do not have a transition set (within the CSS code nor within the `$animateCss` options) and the duration of the animation is
+ * going to be detected from what the keyframe styles on the CSS class are. In this event, `$animateCss` will automatically create an inline transition
+ * style matching the duration detected from the keyframe style (which is present in the CSS class that is being added) and then prepare both the transition
+ * and keyframe animations to run in parallel on the element. Then when the animation is underway the provided `from` and `to` CSS styles will be applied
+ * and spread across the transition and keyframe animation.
+ *
+ * ## What is returned
+ *
+ * `$animateCss` works in two stages: a preparation phase and an animation phase. Therefore when `$animateCss` is first called it will NOT actually
+ * start the animation. All that is going on here is that the element is being prepared for the animation (which means that the generated CSS classes are
+ * added and removed on the element). Once `$animateCss` is called it will return an object with the following properties:
+ *
+ * ```js
+ * var animator = $animateCss(element, { ... });
+ * ```
+ *
+ * Now what do the contents of our `animator` variable look like:
+ *
+ * ```js
+ * {
+ * // starts the animation
+ * start: Function,
+ *
+ * // ends (aborts) the animation
+ * end: Function
+ * }
+ * ```
+ *
+ * To actually start the animation we need to run `animation.start()` which will then return a promise that we can hook into to detect when the animation ends.
+ * If we choose not to run the animation then we MUST run `animation.end()` to perform a cleanup on the element (since some CSS classes and styles may have been
+ * applied to the element during the preparation phase). Note that all other properties such as duration, delay, transitions and keyframes are just properties
+ * and that changing them will not reconfigure the parameters of the animation.
+ *
+ * ### runner.done() vs runner.then()
+ * It is documented that `animation.start()` will return a promise object and this is true, however, there is also an additional method available on the
+ * runner called `.done(callbackFn)`. The done method works the same as `.finally(callbackFn)`, however, it does **not trigger a digest to occur**.
+ * Therefore, for performance reasons, it's always best to use `runner.done(callback)` instead of `runner.then()`, `runner.catch()` or `runner.finally()`
+ * unless you really need a digest to kick off afterwards.
+ *
+ * Keep in mind that, to make this easier, ngAnimate has tweaked the JS animations API to recognize when a runner instance is returned from $animateCss
+ * (so there is no need to call `runner.done(doneFn)` inside of your JavaScript animation code).
+ * Check the {@link ngAnimate.$animateCss#usage animation code above} to see how this works.
+ *
+ * @param {DOMElement} element the element that will be animated
+ * @param {object} options the animation-related options that will be applied during the animation
+ *
+ * * `event` - The DOM event (e.g. enter, leave, move). When used, a generated CSS class of `ng-EVENT` and `ng-EVENT-active` will be applied
+ * to the element during the animation. Multiple events can be provided when spaces are used as a separator. (Note that this will not perform any DOM operation.)
+ * * `structural` - Indicates that the `ng-` prefix will be added to the event class. Setting to `false` or omitting will turn `ng-EVENT` and
+ * `ng-EVENT-active` in `EVENT` and `EVENT-active`. Unused if `event` is omitted.
+ * * `easing` - The CSS easing value that will be applied to the transition or keyframe animation (or both).
+ * * `transitionStyle` - The raw CSS transition style that will be used (e.g. `1s linear all`).
+ * * `keyframeStyle` - The raw CSS keyframe animation style that will be used (e.g. `1s my_animation linear`).
+ * * `from` - The starting CSS styles (a key/value object) that will be applied at the start of the animation.
+ * * `to` - The ending CSS styles (a key/value object) that will be applied across the animation via a CSS transition.
+ * * `addClass` - A space separated list of CSS classes that will be added to the element and spread across the animation.
+ * * `removeClass` - A space separated list of CSS classes that will be removed from the element and spread across the animation.
+ * * `duration` - A number value representing the total duration of the transition and/or keyframe (note that a value of 1 is 1000ms). If a value of `0`
+ * is provided then the animation will be skipped entirely.
+ * * `delay` - A number value representing the total delay of the transition and/or keyframe (note that a value of 1 is 1000ms). If a value of `true` is
+ * used then whatever delay value is detected from the CSS classes will be mirrored on the elements styles (e.g. by setting delay true then the style value
+ * of the element will be `transition-delay: DETECTED_VALUE`). Using `true` is useful when you want the CSS classes and inline styles to all share the same
+ * CSS delay value.
+ * * `stagger` - A numeric time value representing the delay between successively animated elements
+ * ({@link ngAnimate#css-staggering-animations Click here to learn how CSS-based staggering works in ngAnimate.})
+ * * `staggerIndex` - The numeric index representing the stagger item (e.g. a value of 5 is equal to the sixth item in the stagger; therefore when a
+ * `stagger` option value of `0.1` is used then there will be a stagger delay of `600ms`)
+ * * `applyClassesEarly` - Whether or not the classes being added or removed will be used when detecting the animation. This is set by `$animate` when enter/leave/move animations are fired to ensure that the CSS classes are resolved in time. (Note that this will prevent any transitions from occurring on the classes being added and removed.)
+ * * `cleanupStyles` - Whether or not the provided `from` and `to` styles will be removed once
+ * the animation is closed. This is useful for when the styles are used purely for the sake of
+ * the animation and do not have a lasting visual effect on the element (e.g. a collapse and open animation).
+ * By default this value is set to `false`.
+ *
+ * @return {object} an object with start and end methods and details about the animation.
+ *
+ * * `start` - The method to start the animation. This will return a `Promise` when called.
+ * * `end` - This method will cancel the animation and remove all applied CSS classes and styles.
+ */
+var ONE_SECOND = 1000;
+var BASE_TEN = 10;
+
+var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3;
+var CLOSING_TIME_BUFFER = 1.5;
+
+var DETECT_CSS_PROPERTIES = {
+ transitionDuration: TRANSITION_DURATION_PROP,
+ transitionDelay: TRANSITION_DELAY_PROP,
+ transitionProperty: TRANSITION_PROP + PROPERTY_KEY,
+ animationDuration: ANIMATION_DURATION_PROP,
+ animationDelay: ANIMATION_DELAY_PROP,
+ animationIterationCount: ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY
+};
+
+var DETECT_STAGGER_CSS_PROPERTIES = {
+ transitionDuration: TRANSITION_DURATION_PROP,
+ transitionDelay: TRANSITION_DELAY_PROP,
+ animationDuration: ANIMATION_DURATION_PROP,
+ animationDelay: ANIMATION_DELAY_PROP
+};
+
+function getCssKeyframeDurationStyle(duration) {
+ return [ANIMATION_DURATION_PROP, duration + 's'];
+}
+
+function getCssDelayStyle(delay, isKeyframeAnimation) {
+ var prop = isKeyframeAnimation ? ANIMATION_DELAY_PROP : TRANSITION_DELAY_PROP;
+ return [prop, delay + 's'];
+}
+
+function computeCssStyles($window, element, properties) {
+ var styles = Object.create(null);
+ var detectedStyles = $window.getComputedStyle(element) || {};
+ forEach(properties, function(formalStyleName, actualStyleName) {
+ var val = detectedStyles[formalStyleName];
+ if (val) {
+ var c = val.charAt(0);
+
+ // only numerical-based values have a negative sign or digit as the first value
+ if (c === '-' || c === '+' || c >= 0) {
+ val = parseMaxTime(val);
+ }
+
+ // by setting this to null in the event that the delay is not set or is set directly as 0
+ // then we can still allow for negative values to be used later on and not mistake this
+ // value for being greater than any other negative value.
+ if (val === 0) {
+ val = null;
+ }
+ styles[actualStyleName] = val;
+ }
+ });
+
+ return styles;
+}
+
+function parseMaxTime(str) {
+ var maxValue = 0;
+ var values = str.split(/\s*,\s*/);
+ forEach(values, function(value) {
+ // it's always safe to consider only second values and omit `ms` values since
+ // getComputedStyle will always handle the conversion for us
+ if (value.charAt(value.length - 1) == 's') {
+ value = value.substring(0, value.length - 1);
+ }
+ value = parseFloat(value) || 0;
+ maxValue = maxValue ? Math.max(value, maxValue) : value;
+ });
+ return maxValue;
+}
+
+function truthyTimingValue(val) {
+ return val === 0 || val != null;
+}
+
+function getCssTransitionDurationStyle(duration, applyOnlyDuration) {
+ var style = TRANSITION_PROP;
+ var value = duration + 's';
+ if (applyOnlyDuration) {
+ style += DURATION_KEY;
+ } else {
+ value += ' linear all';
+ }
+ return [style, value];
+}
+
+function createLocalCacheLookup() {
+ var cache = Object.create(null);
+ return {
+ flush: function() {
+ cache = Object.create(null);
+ },
+
+ count: function(key) {
+ var entry = cache[key];
+ return entry ? entry.total : 0;
+ },
+
+ get: function(key) {
+ var entry = cache[key];
+ return entry && entry.value;
+ },
+
+ put: function(key, value) {
+ if (!cache[key]) {
+ cache[key] = { total: 1, value: value };
+ } else {
+ cache[key].total++;
+ }
+ }
+ };
+}
+
+// we do not reassign an already present style value since
+// if we detect the style property value again we may be
+// detecting styles that were added via the `from` styles.
+// We make use of `isDefined` here since an empty string
+// or null value (which is what getPropertyValue will return
+// for a non-existing style) will still be marked as a valid
+// value for the style (a falsy value implies that the style
+// is to be removed at the end of the animation). If we had a simple
+// "OR" statement then it would not be enough to catch that.
+function registerRestorableStyles(backup, node, properties) {
+ forEach(properties, function(prop) {
+ backup[prop] = isDefined(backup[prop])
+ ? backup[prop]
+ : node.style.getPropertyValue(prop);
+ });
+}
+
+var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
+ var gcsLookup = createLocalCacheLookup();
+ var gcsStaggerLookup = createLocalCacheLookup();
+
+ this.$get = ['$window', '$$jqLite', '$$AnimateRunner', '$timeout',
+ '$$forceReflow', '$sniffer', '$$rAFScheduler', '$$animateQueue',
+ function($window, $$jqLite, $$AnimateRunner, $timeout,
+ $$forceReflow, $sniffer, $$rAFScheduler, $$animateQueue) {
+
+ var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);
+
+ var parentCounter = 0;
+ function gcsHashFn(node, extraClasses) {
+ var KEY = "$$ngAnimateParentKey";
+ var parentNode = node.parentNode;
+ var parentID = parentNode[KEY] || (parentNode[KEY] = ++parentCounter);
+ return parentID + '-' + node.getAttribute('class') + '-' + extraClasses;
+ }
+
+ function computeCachedCssStyles(node, className, cacheKey, properties) {
+ var timings = gcsLookup.get(cacheKey);
+
+ if (!timings) {
+ timings = computeCssStyles($window, node, properties);
+ if (timings.animationIterationCount === 'infinite') {
+ timings.animationIterationCount = 1;
+ }
+ }
+
+ // we keep putting this in multiple times even though the value and the cacheKey are the same
+ // because we're keeping an internal tally of how many duplicate animations are detected.
+ gcsLookup.put(cacheKey, timings);
+ return timings;
+ }
+
+ function computeCachedCssStaggerStyles(node, className, cacheKey, properties) {
+ var stagger;
+
+ // if we have one or more existing matches of matching elements
+ // containing the same parent + CSS styles (which is how cacheKey works)
+ // then staggering is possible
+ if (gcsLookup.count(cacheKey) > 0) {
+ stagger = gcsStaggerLookup.get(cacheKey);
+
+ if (!stagger) {
+ var staggerClassName = pendClasses(className, '-stagger');
+
+ $$jqLite.addClass(node, staggerClassName);
+
+ stagger = computeCssStyles($window, node, properties);
+
+ // force the conversion of a null value to zero incase not set
+ stagger.animationDuration = Math.max(stagger.animationDuration, 0);
+ stagger.transitionDuration = Math.max(stagger.transitionDuration, 0);
+
+ $$jqLite.removeClass(node, staggerClassName);
+
+ gcsStaggerLookup.put(cacheKey, stagger);
+ }
+ }
+
+ return stagger || {};
+ }
+
+ var cancelLastRAFRequest;
+ var rafWaitQueue = [];
+ function waitUntilQuiet(callback) {
+ rafWaitQueue.push(callback);
+ $$rAFScheduler.waitUntilQuiet(function() {
+ gcsLookup.flush();
+ gcsStaggerLookup.flush();
+
+ // DO NOT REMOVE THIS LINE OR REFACTOR OUT THE `pageWidth` variable.
+ // PLEASE EXAMINE THE `$$forceReflow` service to understand why.
+ var pageWidth = $$forceReflow();
+
+ // we use a for loop to ensure that if the queue is changed
+ // during this looping then it will consider new requests
+ for (var i = 0; i < rafWaitQueue.length; i++) {
+ rafWaitQueue[i](pageWidth);
+ }
+ rafWaitQueue.length = 0;
+ });
+ }
+
+ function computeTimings(node, className, cacheKey) {
+ var timings = computeCachedCssStyles(node, className, cacheKey, DETECT_CSS_PROPERTIES);
+ var aD = timings.animationDelay;
+ var tD = timings.transitionDelay;
+ timings.maxDelay = aD && tD
+ ? Math.max(aD, tD)
+ : (aD || tD);
+ timings.maxDuration = Math.max(
+ timings.animationDuration * timings.animationIterationCount,
+ timings.transitionDuration);
+
+ return timings;
+ }
+
+ return function init(element, initialOptions) {
+ // all of the animation functions should create
+ // a copy of the options data, however, if a
+ // parent service has already created a copy then
+ // we should stick to using that
+ var options = initialOptions || {};
+ if (!options.$$prepared) {
+ options = prepareAnimationOptions(copy(options));
+ }
+
+ var restoreStyles = {};
+ var node = getDomNode(element);
+ if (!node
+ || !node.parentNode
+ || !$$animateQueue.enabled()) {
+ return closeAndReturnNoopAnimator();
+ }
+
+ var temporaryStyles = [];
+ var classes = element.attr('class');
+ var styles = packageStyles(options);
+ var animationClosed;
+ var animationPaused;
+ var animationCompleted;
+ var runner;
+ var runnerHost;
+ var maxDelay;
+ var maxDelayTime;
+ var maxDuration;
+ var maxDurationTime;
+ var startTime;
+ var events = [];
+
+ if (options.duration === 0 || (!$sniffer.animations && !$sniffer.transitions)) {
+ return closeAndReturnNoopAnimator();
+ }
+
+ var method = options.event && isArray(options.event)
+ ? options.event.join(' ')
+ : options.event;
+
+ var isStructural = method && options.structural;
+ var structuralClassName = '';
+ var addRemoveClassName = '';
+
+ if (isStructural) {
+ structuralClassName = pendClasses(method, EVENT_CLASS_PREFIX, true);
+ } else if (method) {
+ structuralClassName = method;
+ }
+
+ if (options.addClass) {
+ addRemoveClassName += pendClasses(options.addClass, ADD_CLASS_SUFFIX);
+ }
+
+ if (options.removeClass) {
+ if (addRemoveClassName.length) {
+ addRemoveClassName += ' ';
+ }
+ addRemoveClassName += pendClasses(options.removeClass, REMOVE_CLASS_SUFFIX);
+ }
+
+ // there may be a situation where a structural animation is combined together
+ // with CSS classes that need to resolve before the animation is computed.
+ // However this means that there is no explicit CSS code to block the animation
+ // from happening (by setting 0s none in the class name). If this is the case
+ // we need to apply the classes before the first rAF so we know to continue if
+ // there actually is a detected transition or keyframe animation
+ if (options.applyClassesEarly && addRemoveClassName.length) {
+ applyAnimationClasses(element, options);
+ }
+
+ var preparationClasses = [structuralClassName, addRemoveClassName].join(' ').trim();
+ var fullClassName = classes + ' ' + preparationClasses;
+ var activeClasses = pendClasses(preparationClasses, ACTIVE_CLASS_SUFFIX);
+ var hasToStyles = styles.to && Object.keys(styles.to).length > 0;
+ var containsKeyframeAnimation = (options.keyframeStyle || '').length > 0;
+
+ // there is no way we can trigger an animation if no styles and
+ // no classes are being applied which would then trigger a transition,
+ // unless there a is raw keyframe value that is applied to the element.
+ if (!containsKeyframeAnimation
+ && !hasToStyles
+ && !preparationClasses) {
+ return closeAndReturnNoopAnimator();
+ }
+
+ var cacheKey, stagger;
+ if (options.stagger > 0) {
+ var staggerVal = parseFloat(options.stagger);
+ stagger = {
+ transitionDelay: staggerVal,
+ animationDelay: staggerVal,
+ transitionDuration: 0,
+ animationDuration: 0
+ };
+ } else {
+ cacheKey = gcsHashFn(node, fullClassName);
+ stagger = computeCachedCssStaggerStyles(node, preparationClasses, cacheKey, DETECT_STAGGER_CSS_PROPERTIES);
+ }
+
+ if (!options.$$skipPreparationClasses) {
+ $$jqLite.addClass(element, preparationClasses);
+ }
+
+ var applyOnlyDuration;
+
+ if (options.transitionStyle) {
+ var transitionStyle = [TRANSITION_PROP, options.transitionStyle];
+ applyInlineStyle(node, transitionStyle);
+ temporaryStyles.push(transitionStyle);
+ }
+
+ if (options.duration >= 0) {
+ applyOnlyDuration = node.style[TRANSITION_PROP].length > 0;
+ var durationStyle = getCssTransitionDurationStyle(options.duration, applyOnlyDuration);
+
+ // we set the duration so that it will be picked up by getComputedStyle later
+ applyInlineStyle(node, durationStyle);
+ temporaryStyles.push(durationStyle);
+ }
+
+ if (options.keyframeStyle) {
+ var keyframeStyle = [ANIMATION_PROP, options.keyframeStyle];
+ applyInlineStyle(node, keyframeStyle);
+ temporaryStyles.push(keyframeStyle);
+ }
+
+ var itemIndex = stagger
+ ? options.staggerIndex >= 0
+ ? options.staggerIndex
+ : gcsLookup.count(cacheKey)
+ : 0;
+
+ var isFirst = itemIndex === 0;
+
+ // this is a pre-emptive way of forcing the setup classes to be added and applied INSTANTLY
+ // without causing any combination of transitions to kick in. By adding a negative delay value
+ // it forces the setup class' transition to end immediately. We later then remove the negative
+ // transition delay to allow for the transition to naturally do it's thing. The beauty here is
+ // that if there is no transition defined then nothing will happen and this will also allow
+ // other transitions to be stacked on top of each other without any chopping them out.
+ if (isFirst && !options.skipBlocking) {
+ blockTransitions(node, SAFE_FAST_FORWARD_DURATION_VALUE);
+ }
+
+ var timings = computeTimings(node, fullClassName, cacheKey);
+ var relativeDelay = timings.maxDelay;
+ maxDelay = Math.max(relativeDelay, 0);
+ maxDuration = timings.maxDuration;
+
+ var flags = {};
+ flags.hasTransitions = timings.transitionDuration > 0;
+ flags.hasAnimations = timings.animationDuration > 0;
+ flags.hasTransitionAll = flags.hasTransitions && timings.transitionProperty == 'all';
+ flags.applyTransitionDuration = hasToStyles && (
+ (flags.hasTransitions && !flags.hasTransitionAll)
+ || (flags.hasAnimations && !flags.hasTransitions));
+ flags.applyAnimationDuration = options.duration && flags.hasAnimations;
+ flags.applyTransitionDelay = truthyTimingValue(options.delay) && (flags.applyTransitionDuration || flags.hasTransitions);
+ flags.applyAnimationDelay = truthyTimingValue(options.delay) && flags.hasAnimations;
+ flags.recalculateTimingStyles = addRemoveClassName.length > 0;
+
+ if (flags.applyTransitionDuration || flags.applyAnimationDuration) {
+ maxDuration = options.duration ? parseFloat(options.duration) : maxDuration;
+
+ if (flags.applyTransitionDuration) {
+ flags.hasTransitions = true;
+ timings.transitionDuration = maxDuration;
+ applyOnlyDuration = node.style[TRANSITION_PROP + PROPERTY_KEY].length > 0;
+ temporaryStyles.push(getCssTransitionDurationStyle(maxDuration, applyOnlyDuration));
+ }
+
+ if (flags.applyAnimationDuration) {
+ flags.hasAnimations = true;
+ timings.animationDuration = maxDuration;
+ temporaryStyles.push(getCssKeyframeDurationStyle(maxDuration));
+ }
+ }
+
+ if (maxDuration === 0 && !flags.recalculateTimingStyles) {
+ return closeAndReturnNoopAnimator();
+ }
+
+ if (options.delay != null) {
+ var delayStyle;
+ if (typeof options.delay !== "boolean") {
+ delayStyle = parseFloat(options.delay);
+ // number in options.delay means we have to recalculate the delay for the closing timeout
+ maxDelay = Math.max(delayStyle, 0);
+ }
+
+ if (flags.applyTransitionDelay) {
+ temporaryStyles.push(getCssDelayStyle(delayStyle));
+ }
+
+ if (flags.applyAnimationDelay) {
+ temporaryStyles.push(getCssDelayStyle(delayStyle, true));
+ }
+ }
+
+ // we need to recalculate the delay value since we used a pre-emptive negative
+ // delay value and the delay value is required for the final event checking. This
+ // property will ensure that this will happen after the RAF phase has passed.
+ if (options.duration == null && timings.transitionDuration > 0) {
+ flags.recalculateTimingStyles = flags.recalculateTimingStyles || isFirst;
+ }
+
+ maxDelayTime = maxDelay * ONE_SECOND;
+ maxDurationTime = maxDuration * ONE_SECOND;
+ if (!options.skipBlocking) {
+ flags.blockTransition = timings.transitionDuration > 0;
+ flags.blockKeyframeAnimation = timings.animationDuration > 0 &&
+ stagger.animationDelay > 0 &&
+ stagger.animationDuration === 0;
+ }
+
+ if (options.from) {
+ if (options.cleanupStyles) {
+ registerRestorableStyles(restoreStyles, node, Object.keys(options.from));
+ }
+ applyAnimationFromStyles(element, options);
+ }
+
+ if (flags.blockTransition || flags.blockKeyframeAnimation) {
+ applyBlocking(maxDuration);
+ } else if (!options.skipBlocking) {
+ blockTransitions(node, false);
+ }
+
+ // TODO(matsko): for 1.5 change this code to have an animator object for better debugging
+ return {
+ $$willAnimate: true,
+ end: endFn,
+ start: function() {
+ if (animationClosed) return;
+
+ runnerHost = {
+ end: endFn,
+ cancel: cancelFn,
+ resume: null, //this will be set during the start() phase
+ pause: null
+ };
+
+ runner = new $$AnimateRunner(runnerHost);
+
+ waitUntilQuiet(start);
+
+ // we don't have access to pause/resume the animation
+ // since it hasn't run yet. AnimateRunner will therefore
+ // set noop functions for resume and pause and they will
+ // later be overridden once the animation is triggered
+ return runner;
+ }
+ };
+
+ function endFn() {
+ close();
+ }
+
+ function cancelFn() {
+ close(true);
+ }
+
+ function close(rejected) { // jshint ignore:line
+ // if the promise has been called already then we shouldn't close
+ // the animation again
+ if (animationClosed || (animationCompleted && animationPaused)) return;
+ animationClosed = true;
+ animationPaused = false;
+
+ if (!options.$$skipPreparationClasses) {
+ $$jqLite.removeClass(element, preparationClasses);
+ }
+ $$jqLite.removeClass(element, activeClasses);
+
+ blockKeyframeAnimations(node, false);
+ blockTransitions(node, false);
+
+ forEach(temporaryStyles, function(entry) {
+ // There is only one way to remove inline style properties entirely from elements.
+ // By using `removeProperty` this works, but we need to convert camel-cased CSS
+ // styles down to hyphenated values.
+ node.style[entry[0]] = '';
+ });
+
+ applyAnimationClasses(element, options);
+ applyAnimationStyles(element, options);
+
+ if (Object.keys(restoreStyles).length) {
+ forEach(restoreStyles, function(value, prop) {
+ value ? node.style.setProperty(prop, value)
+ : node.style.removeProperty(prop);
+ });
+ }
+
+ // the reason why we have this option is to allow a synchronous closing callback
+ // that is fired as SOON as the animation ends (when the CSS is removed) or if
+ // the animation never takes off at all. A good example is a leave animation since
+ // the element must be removed just after the animation is over or else the element
+ // will appear on screen for one animation frame causing an overbearing flicker.
+ if (options.onDone) {
+ options.onDone();
+ }
+
+ if (events && events.length) {
+ // Remove the transitionend / animationend listener(s)
+ element.off(events.join(' '), onAnimationProgress);
+ }
+
+ //Cancel the fallback closing timeout and remove the timer data
+ var animationTimerData = element.data(ANIMATE_TIMER_KEY);
+ if (animationTimerData) {
+ $timeout.cancel(animationTimerData[0].timer);
+ element.removeData(ANIMATE_TIMER_KEY);
+ }
+
+ // if the preparation function fails then the promise is not setup
+ if (runner) {
+ runner.complete(!rejected);
+ }
+ }
+
+ function applyBlocking(duration) {
+ if (flags.blockTransition) {
+ blockTransitions(node, duration);
+ }
+
+ if (flags.blockKeyframeAnimation) {
+ blockKeyframeAnimations(node, !!duration);
+ }
+ }
+
+ function closeAndReturnNoopAnimator() {
+ runner = new $$AnimateRunner({
+ end: endFn,
+ cancel: cancelFn
+ });
+
+ // should flush the cache animation
+ waitUntilQuiet(noop);
+ close();
+
+ return {
+ $$willAnimate: false,
+ start: function() {
+ return runner;
+ },
+ end: endFn
+ };
+ }
+
+ function onAnimationProgress(event) {
+ event.stopPropagation();
+ var ev = event.originalEvent || event;
+
+ // we now always use `Date.now()` due to the recent changes with
+ // event.timeStamp in Firefox, Webkit and Chrome (see #13494 for more info)
+ var timeStamp = ev.$manualTimeStamp || Date.now();
+
+ /* Firefox (or possibly just Gecko) likes to not round values up
+ * when a ms measurement is used for the animation */
+ var elapsedTime = parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES));
+
+ /* $manualTimeStamp is a mocked timeStamp value which is set
+ * within browserTrigger(). This is only here so that tests can
+ * mock animations properly. Real events fallback to event.timeStamp,
+ * or, if they don't, then a timeStamp is automatically created for them.
+ * We're checking to see if the timeStamp surpasses the expected delay,
+ * but we're using elapsedTime instead of the timeStamp on the 2nd
+ * pre-condition since animationPauseds sometimes close off early */
+ if (Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) {
+ // we set this flag to ensure that if the transition is paused then, when resumed,
+ // the animation will automatically close itself since transitions cannot be paused.
+ animationCompleted = true;
+ close();
+ }
+ }
+
+ function start() {
+ if (animationClosed) return;
+ if (!node.parentNode) {
+ close();
+ return;
+ }
+
+ // even though we only pause keyframe animations here the pause flag
+ // will still happen when transitions are used. Only the transition will
+ // not be paused since that is not possible. If the animation ends when
+ // paused then it will not complete until unpaused or cancelled.
+ var playPause = function(playAnimation) {
+ if (!animationCompleted) {
+ animationPaused = !playAnimation;
+ if (timings.animationDuration) {
+ var value = blockKeyframeAnimations(node, animationPaused);
+ animationPaused
+ ? temporaryStyles.push(value)
+ : removeFromArray(temporaryStyles, value);
+ }
+ } else if (animationPaused && playAnimation) {
+ animationPaused = false;
+ close();
+ }
+ };
+
+ // checking the stagger duration prevents an accidentally cascade of the CSS delay style
+ // being inherited from the parent. If the transition duration is zero then we can safely
+ // rely that the delay value is an intentional stagger delay style.
+ var maxStagger = itemIndex > 0
+ && ((timings.transitionDuration && stagger.transitionDuration === 0) ||
+ (timings.animationDuration && stagger.animationDuration === 0))
+ && Math.max(stagger.animationDelay, stagger.transitionDelay);
+ if (maxStagger) {
+ $timeout(triggerAnimationStart,
+ Math.floor(maxStagger * itemIndex * ONE_SECOND),
+ false);
+ } else {
+ triggerAnimationStart();
+ }
+
+ // this will decorate the existing promise runner with pause/resume methods
+ runnerHost.resume = function() {
+ playPause(true);
+ };
+
+ runnerHost.pause = function() {
+ playPause(false);
+ };
+
+ function triggerAnimationStart() {
+ // just incase a stagger animation kicks in when the animation
+ // itself was cancelled entirely
+ if (animationClosed) return;
+
+ applyBlocking(false);
+
+ forEach(temporaryStyles, function(entry) {
+ var key = entry[0];
+ var value = entry[1];
+ node.style[key] = value;
+ });
+
+ applyAnimationClasses(element, options);
+ $$jqLite.addClass(element, activeClasses);
+
+ if (flags.recalculateTimingStyles) {
+ fullClassName = node.className + ' ' + preparationClasses;
+ cacheKey = gcsHashFn(node, fullClassName);
+
+ timings = computeTimings(node, fullClassName, cacheKey);
+ relativeDelay = timings.maxDelay;
+ maxDelay = Math.max(relativeDelay, 0);
+ maxDuration = timings.maxDuration;
+
+ if (maxDuration === 0) {
+ close();
+ return;
+ }
+
+ flags.hasTransitions = timings.transitionDuration > 0;
+ flags.hasAnimations = timings.animationDuration > 0;
+ }
+
+ if (flags.applyAnimationDelay) {
+ relativeDelay = typeof options.delay !== "boolean" && truthyTimingValue(options.delay)
+ ? parseFloat(options.delay)
+ : relativeDelay;
+
+ maxDelay = Math.max(relativeDelay, 0);
+ timings.animationDelay = relativeDelay;
+ delayStyle = getCssDelayStyle(relativeDelay, true);
+ temporaryStyles.push(delayStyle);
+ node.style[delayStyle[0]] = delayStyle[1];
+ }
+
+ maxDelayTime = maxDelay * ONE_SECOND;
+ maxDurationTime = maxDuration * ONE_SECOND;
+
+ if (options.easing) {
+ var easeProp, easeVal = options.easing;
+ if (flags.hasTransitions) {
+ easeProp = TRANSITION_PROP + TIMING_KEY;
+ temporaryStyles.push([easeProp, easeVal]);
+ node.style[easeProp] = easeVal;
+ }
+ if (flags.hasAnimations) {
+ easeProp = ANIMATION_PROP + TIMING_KEY;
+ temporaryStyles.push([easeProp, easeVal]);
+ node.style[easeProp] = easeVal;
+ }
+ }
+
+ if (timings.transitionDuration) {
+ events.push(TRANSITIONEND_EVENT);
+ }
+
+ if (timings.animationDuration) {
+ events.push(ANIMATIONEND_EVENT);
+ }
+
+ startTime = Date.now();
+ var timerTime = maxDelayTime + CLOSING_TIME_BUFFER * maxDurationTime;
+ var endTime = startTime + timerTime;
+
+ var animationsData = element.data(ANIMATE_TIMER_KEY) || [];
+ var setupFallbackTimer = true;
+ if (animationsData.length) {
+ var currentTimerData = animationsData[0];
+ setupFallbackTimer = endTime > currentTimerData.expectedEndTime;
+ if (setupFallbackTimer) {
+ $timeout.cancel(currentTimerData.timer);
+ } else {
+ animationsData.push(close);
+ }
+ }
+
+ if (setupFallbackTimer) {
+ var timer = $timeout(onAnimationExpired, timerTime, false);
+ animationsData[0] = {
+ timer: timer,
+ expectedEndTime: endTime
+ };
+ animationsData.push(close);
+ element.data(ANIMATE_TIMER_KEY, animationsData);
+ }
+
+ if (events.length) {
+ element.on(events.join(' '), onAnimationProgress);
+ }
+
+ if (options.to) {
+ if (options.cleanupStyles) {
+ registerRestorableStyles(restoreStyles, node, Object.keys(options.to));
+ }
+ applyAnimationToStyles(element, options);
+ }
+ }
+
+ function onAnimationExpired() {
+ var animationsData = element.data(ANIMATE_TIMER_KEY);
+
+ // this will be false in the event that the element was
+ // removed from the DOM (via a leave animation or something
+ // similar)
+ if (animationsData) {
+ for (var i = 1; i < animationsData.length; i++) {
+ animationsData[i]();
+ }
+ element.removeData(ANIMATE_TIMER_KEY);
+ }
+ }
+ }
+ };
+ }];
+}];
+
+var $$AnimateCssDriverProvider = ['$$animationProvider', function($$animationProvider) {
+ $$animationProvider.drivers.push('$$animateCssDriver');
+
+ var NG_ANIMATE_SHIM_CLASS_NAME = 'ng-animate-shim';
+ var NG_ANIMATE_ANCHOR_CLASS_NAME = 'ng-anchor';
+
+ var NG_OUT_ANCHOR_CLASS_NAME = 'ng-anchor-out';
+ var NG_IN_ANCHOR_CLASS_NAME = 'ng-anchor-in';
+
+ function isDocumentFragment(node) {
+ return node.parentNode && node.parentNode.nodeType === 11;
+ }
+
+ this.$get = ['$animateCss', '$rootScope', '$$AnimateRunner', '$rootElement', '$sniffer', '$$jqLite', '$document',
+ function($animateCss, $rootScope, $$AnimateRunner, $rootElement, $sniffer, $$jqLite, $document) {
+
+ // only browsers that support these properties can render animations
+ if (!$sniffer.animations && !$sniffer.transitions) return noop;
+
+ var bodyNode = $document[0].body;
+ var rootNode = getDomNode($rootElement);
+
+ var rootBodyElement = jqLite(
+ // this is to avoid using something that exists outside of the body
+ // we also special case the doc fragment case because our unit test code
+ // appends the $rootElement to the body after the app has been bootstrapped
+ isDocumentFragment(rootNode) || bodyNode.contains(rootNode) ? rootNode : bodyNode
+ );
+
+ var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);
+
+ return function initDriverFn(animationDetails) {
+ return animationDetails.from && animationDetails.to
+ ? prepareFromToAnchorAnimation(animationDetails.from,
+ animationDetails.to,
+ animationDetails.classes,
+ animationDetails.anchors)
+ : prepareRegularAnimation(animationDetails);
+ };
+
+ function filterCssClasses(classes) {
+ //remove all the `ng-` stuff
+ return classes.replace(/\bng-\S+\b/g, '');
+ }
+
+ function getUniqueValues(a, b) {
+ if (isString(a)) a = a.split(' ');
+ if (isString(b)) b = b.split(' ');
+ return a.filter(function(val) {
+ return b.indexOf(val) === -1;
+ }).join(' ');
+ }
+
+ function prepareAnchoredAnimation(classes, outAnchor, inAnchor) {
+ var clone = jqLite(getDomNode(outAnchor).cloneNode(true));
+ var startingClasses = filterCssClasses(getClassVal(clone));
+
+ outAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME);
+ inAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME);
+
+ clone.addClass(NG_ANIMATE_ANCHOR_CLASS_NAME);
+
+ rootBodyElement.append(clone);
+
+ var animatorIn, animatorOut = prepareOutAnimation();
+
+ // the user may not end up using the `out` animation and
+ // only making use of the `in` animation or vice-versa.
+ // In either case we should allow this and not assume the
+ // animation is over unless both animations are not used.
+ if (!animatorOut) {
+ animatorIn = prepareInAnimation();
+ if (!animatorIn) {
+ return end();
+ }
+ }
+
+ var startingAnimator = animatorOut || animatorIn;
+
+ return {
+ start: function() {
+ var runner;
+
+ var currentAnimation = startingAnimator.start();
+ currentAnimation.done(function() {
+ currentAnimation = null;
+ if (!animatorIn) {
+ animatorIn = prepareInAnimation();
+ if (animatorIn) {
+ currentAnimation = animatorIn.start();
+ currentAnimation.done(function() {
+ currentAnimation = null;
+ end();
+ runner.complete();
+ });
+ return currentAnimation;
+ }
+ }
+ // in the event that there is no `in` animation
+ end();
+ runner.complete();
+ });
+
+ runner = new $$AnimateRunner({
+ end: endFn,
+ cancel: endFn
+ });
+
+ return runner;
+
+ function endFn() {
+ if (currentAnimation) {
+ currentAnimation.end();
+ }
+ }
+ }
+ };
+
+ function calculateAnchorStyles(anchor) {
+ var styles = {};
+
+ var coords = getDomNode(anchor).getBoundingClientRect();
+
+ // we iterate directly since safari messes up and doesn't return
+ // all the keys for the coords object when iterated
+ forEach(['width','height','top','left'], function(key) {
+ var value = coords[key];
+ switch (key) {
+ case 'top':
+ value += bodyNode.scrollTop;
+ break;
+ case 'left':
+ value += bodyNode.scrollLeft;
+ break;
+ }
+ styles[key] = Math.floor(value) + 'px';
+ });
+ return styles;
+ }
+
+ function prepareOutAnimation() {
+ var animator = $animateCss(clone, {
+ addClass: NG_OUT_ANCHOR_CLASS_NAME,
+ delay: true,
+ from: calculateAnchorStyles(outAnchor)
+ });
+
+ // read the comment within `prepareRegularAnimation` to understand
+ // why this check is necessary
+ return animator.$$willAnimate ? animator : null;
+ }
+
+ function getClassVal(element) {
+ return element.attr('class') || '';
+ }
+
+ function prepareInAnimation() {
+ var endingClasses = filterCssClasses(getClassVal(inAnchor));
+ var toAdd = getUniqueValues(endingClasses, startingClasses);
+ var toRemove = getUniqueValues(startingClasses, endingClasses);
+
+ var animator = $animateCss(clone, {
+ to: calculateAnchorStyles(inAnchor),
+ addClass: NG_IN_ANCHOR_CLASS_NAME + ' ' + toAdd,
+ removeClass: NG_OUT_ANCHOR_CLASS_NAME + ' ' + toRemove,
+ delay: true
+ });
+
+ // read the comment within `prepareRegularAnimation` to understand
+ // why this check is necessary
+ return animator.$$willAnimate ? animator : null;
+ }
+
+ function end() {
+ clone.remove();
+ outAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME);
+ inAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME);
+ }
+ }
+
+ function prepareFromToAnchorAnimation(from, to, classes, anchors) {
+ var fromAnimation = prepareRegularAnimation(from, noop);
+ var toAnimation = prepareRegularAnimation(to, noop);
+
+ var anchorAnimations = [];
+ forEach(anchors, function(anchor) {
+ var outElement = anchor['out'];
+ var inElement = anchor['in'];
+ var animator = prepareAnchoredAnimation(classes, outElement, inElement);
+ if (animator) {
+ anchorAnimations.push(animator);
+ }
+ });
+
+ // no point in doing anything when there are no elements to animate
+ if (!fromAnimation && !toAnimation && anchorAnimations.length === 0) return;
+
+ return {
+ start: function() {
+ var animationRunners = [];
+
+ if (fromAnimation) {
+ animationRunners.push(fromAnimation.start());
+ }
+
+ if (toAnimation) {
+ animationRunners.push(toAnimation.start());
+ }
+
+ forEach(anchorAnimations, function(animation) {
+ animationRunners.push(animation.start());
+ });
+
+ var runner = new $$AnimateRunner({
+ end: endFn,
+ cancel: endFn // CSS-driven animations cannot be cancelled, only ended
+ });
+
+ $$AnimateRunner.all(animationRunners, function(status) {
+ runner.complete(status);
+ });
+
+ return runner;
+
+ function endFn() {
+ forEach(animationRunners, function(runner) {
+ runner.end();
+ });
+ }
+ }
+ };
+ }
+
+ function prepareRegularAnimation(animationDetails) {
+ var element = animationDetails.element;
+ var options = animationDetails.options || {};
+
+ if (animationDetails.structural) {
+ options.event = animationDetails.event;
+ options.structural = true;
+ options.applyClassesEarly = true;
+
+ // we special case the leave animation since we want to ensure that
+ // the element is removed as soon as the animation is over. Otherwise
+ // a flicker might appear or the element may not be removed at all
+ if (animationDetails.event === 'leave') {
+ options.onDone = options.domOperation;
+ }
+ }
+
+ // We assign the preparationClasses as the actual animation event since
+ // the internals of $animateCss will just suffix the event token values
+ // with `-active` to trigger the animation.
+ if (options.preparationClasses) {
+ options.event = concatWithSpace(options.event, options.preparationClasses);
+ }
+
+ var animator = $animateCss(element, options);
+
+ // the driver lookup code inside of $$animation attempts to spawn a
+ // driver one by one until a driver returns a.$$willAnimate animator object.
+ // $animateCss will always return an object, however, it will pass in
+ // a flag as a hint as to whether an animation was detected or not
+ return animator.$$willAnimate ? animator : null;
+ }
+ }];
+}];
+
+// TODO(matsko): use caching here to speed things up for detection
+// TODO(matsko): add documentation
+// by the time...
+
+var $$AnimateJsProvider = ['$animateProvider', function($animateProvider) {
+ this.$get = ['$injector', '$$AnimateRunner', '$$jqLite',
+ function($injector, $$AnimateRunner, $$jqLite) {
+
+ var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);
+ // $animateJs(element, 'enter');
+ return function(element, event, classes, options) {
+ var animationClosed = false;
+
+ // the `classes` argument is optional and if it is not used
+ // then the classes will be resolved from the element's className
+ // property as well as options.addClass/options.removeClass.
+ if (arguments.length === 3 && isObject(classes)) {
+ options = classes;
+ classes = null;
+ }
+
+ options = prepareAnimationOptions(options);
+ if (!classes) {
+ classes = element.attr('class') || '';
+ if (options.addClass) {
+ classes += ' ' + options.addClass;
+ }
+ if (options.removeClass) {
+ classes += ' ' + options.removeClass;
+ }
+ }
+
+ var classesToAdd = options.addClass;
+ var classesToRemove = options.removeClass;
+
+ // the lookupAnimations function returns a series of animation objects that are
+ // matched up with one or more of the CSS classes. These animation objects are
+ // defined via the module.animation factory function. If nothing is detected then
+ // we don't return anything which then makes $animation query the next driver.
+ var animations = lookupAnimations(classes);
+ var before, after;
+ if (animations.length) {
+ var afterFn, beforeFn;
+ if (event == 'leave') {
+ beforeFn = 'leave';
+ afterFn = 'afterLeave'; // TODO(matsko): get rid of this
+ } else {
+ beforeFn = 'before' + event.charAt(0).toUpperCase() + event.substr(1);
+ afterFn = event;
+ }
+
+ if (event !== 'enter' && event !== 'move') {
+ before = packageAnimations(element, event, options, animations, beforeFn);
+ }
+ after = packageAnimations(element, event, options, animations, afterFn);
+ }
+
+ // no matching animations
+ if (!before && !after) return;
+
+ function applyOptions() {
+ options.domOperation();
+ applyAnimationClasses(element, options);
+ }
+
+ function close() {
+ animationClosed = true;
+ applyOptions();
+ applyAnimationStyles(element, options);
+ }
+
+ var runner;
+
+ return {
+ $$willAnimate: true,
+ end: function() {
+ if (runner) {
+ runner.end();
+ } else {
+ close();
+ runner = new $$AnimateRunner();
+ runner.complete(true);
+ }
+ return runner;
+ },
+ start: function() {
+ if (runner) {
+ return runner;
+ }
+
+ runner = new $$AnimateRunner();
+ var closeActiveAnimations;
+ var chain = [];
+
+ if (before) {
+ chain.push(function(fn) {
+ closeActiveAnimations = before(fn);
+ });
+ }
+
+ if (chain.length) {
+ chain.push(function(fn) {
+ applyOptions();
+ fn(true);
+ });
+ } else {
+ applyOptions();
+ }
+
+ if (after) {
+ chain.push(function(fn) {
+ closeActiveAnimations = after(fn);
+ });
+ }
+
+ runner.setHost({
+ end: function() {
+ endAnimations();
+ },
+ cancel: function() {
+ endAnimations(true);
+ }
+ });
+
+ $$AnimateRunner.chain(chain, onComplete);
+ return runner;
+
+ function onComplete(success) {
+ close(success);
+ runner.complete(success);
+ }
+
+ function endAnimations(cancelled) {
+ if (!animationClosed) {
+ (closeActiveAnimations || noop)(cancelled);
+ onComplete(cancelled);
+ }
+ }
+ }
+ };
+
+ function executeAnimationFn(fn, element, event, options, onDone) {
+ var args;
+ switch (event) {
+ case 'animate':
+ args = [element, options.from, options.to, onDone];
+ break;
+
+ case 'setClass':
+ args = [element, classesToAdd, classesToRemove, onDone];
+ break;
+
+ case 'addClass':
+ args = [element, classesToAdd, onDone];
+ break;
+
+ case 'removeClass':
+ args = [element, classesToRemove, onDone];
+ break;
+
+ default:
+ args = [element, onDone];
+ break;
+ }
+
+ args.push(options);
+
+ var value = fn.apply(fn, args);
+ if (value) {
+ if (isFunction(value.start)) {
+ value = value.start();
+ }
+
+ if (value instanceof $$AnimateRunner) {
+ value.done(onDone);
+ } else if (isFunction(value)) {
+ // optional onEnd / onCancel callback
+ return value;
+ }
+ }
+
+ return noop;
+ }
+
+ function groupEventedAnimations(element, event, options, animations, fnName) {
+ var operations = [];
+ forEach(animations, function(ani) {
+ var animation = ani[fnName];
+ if (!animation) return;
+
+ // note that all of these animations will run in parallel
+ operations.push(function() {
+ var runner;
+ var endProgressCb;
+
+ var resolved = false;
+ var onAnimationComplete = function(rejected) {
+ if (!resolved) {
+ resolved = true;
+ (endProgressCb || noop)(rejected);
+ runner.complete(!rejected);
+ }
+ };
+
+ runner = new $$AnimateRunner({
+ end: function() {
+ onAnimationComplete();
+ },
+ cancel: function() {
+ onAnimationComplete(true);
+ }
+ });
+
+ endProgressCb = executeAnimationFn(animation, element, event, options, function(result) {
+ var cancelled = result === false;
+ onAnimationComplete(cancelled);
+ });
+
+ return runner;
+ });
+ });
+
+ return operations;
+ }
+
+ function packageAnimations(element, event, options, animations, fnName) {
+ var operations = groupEventedAnimations(element, event, options, animations, fnName);
+ if (operations.length === 0) {
+ var a,b;
+ if (fnName === 'beforeSetClass') {
+ a = groupEventedAnimations(element, 'removeClass', options, animations, 'beforeRemoveClass');
+ b = groupEventedAnimations(element, 'addClass', options, animations, 'beforeAddClass');
+ } else if (fnName === 'setClass') {
+ a = groupEventedAnimations(element, 'removeClass', options, animations, 'removeClass');
+ b = groupEventedAnimations(element, 'addClass', options, animations, 'addClass');
+ }
+
+ if (a) {
+ operations = operations.concat(a);
+ }
+ if (b) {
+ operations = operations.concat(b);
+ }
+ }
+
+ if (operations.length === 0) return;
+
+ // TODO(matsko): add documentation
+ return function startAnimation(callback) {
+ var runners = [];
+ if (operations.length) {
+ forEach(operations, function(animateFn) {
+ runners.push(animateFn());
+ });
+ }
+
+ runners.length ? $$AnimateRunner.all(runners, callback) : callback();
+
+ return function endFn(reject) {
+ forEach(runners, function(runner) {
+ reject ? runner.cancel() : runner.end();
+ });
+ };
+ };
+ }
+ };
+
+ function lookupAnimations(classes) {
+ classes = isArray(classes) ? classes : classes.split(' ');
+ var matches = [], flagMap = {};
+ for (var i=0; i < classes.length; i++) {
+ var klass = classes[i],
+ animationFactory = $animateProvider.$$registeredAnimations[klass];
+ if (animationFactory && !flagMap[klass]) {
+ matches.push($injector.get(animationFactory));
+ flagMap[klass] = true;
+ }
+ }
+ return matches;
+ }
+ }];
+}];
+
+var $$AnimateJsDriverProvider = ['$$animationProvider', function($$animationProvider) {
+ $$animationProvider.drivers.push('$$animateJsDriver');
+ this.$get = ['$$animateJs', '$$AnimateRunner', function($$animateJs, $$AnimateRunner) {
+ return function initDriverFn(animationDetails) {
+ if (animationDetails.from && animationDetails.to) {
+ var fromAnimation = prepareAnimation(animationDetails.from);
+ var toAnimation = prepareAnimation(animationDetails.to);
+ if (!fromAnimation && !toAnimation) return;
+
+ return {
+ start: function() {
+ var animationRunners = [];
+
+ if (fromAnimation) {
+ animationRunners.push(fromAnimation.start());
+ }
+
+ if (toAnimation) {
+ animationRunners.push(toAnimation.start());
+ }
+
+ $$AnimateRunner.all(animationRunners, done);
+
+ var runner = new $$AnimateRunner({
+ end: endFnFactory(),
+ cancel: endFnFactory()
+ });
+
+ return runner;
+
+ function endFnFactory() {
+ return function() {
+ forEach(animationRunners, function(runner) {
+ // at this point we cannot cancel animations for groups just yet. 1.5+
+ runner.end();
+ });
+ };
+ }
+
+ function done(status) {
+ runner.complete(status);
+ }
+ }
+ };
+ } else {
+ return prepareAnimation(animationDetails);
+ }
+ };
+
+ function prepareAnimation(animationDetails) {
+ // TODO(matsko): make sure to check for grouped animations and delegate down to normal animations
+ var element = animationDetails.element;
+ var event = animationDetails.event;
+ var options = animationDetails.options;
+ var classes = animationDetails.classes;
+ return $$animateJs(element, event, classes, options);
+ }
+ }];
+}];
+
+var NG_ANIMATE_ATTR_NAME = 'data-ng-animate';
+var NG_ANIMATE_PIN_DATA = '$ngAnimatePin';
+var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
+ var PRE_DIGEST_STATE = 1;
+ var RUNNING_STATE = 2;
+ var ONE_SPACE = ' ';
+
+ var rules = this.rules = {
+ skip: [],
+ cancel: [],
+ join: []
+ };
+
+ function makeTruthyCssClassMap(classString) {
+ if (!classString) {
+ return null;
+ }
+
+ var keys = classString.split(ONE_SPACE);
+ var map = Object.create(null);
+
+ forEach(keys, function(key) {
+ map[key] = true;
+ });
+ return map;
+ }
+
+ function hasMatchingClasses(newClassString, currentClassString) {
+ if (newClassString && currentClassString) {
+ var currentClassMap = makeTruthyCssClassMap(currentClassString);
+ return newClassString.split(ONE_SPACE).some(function(className) {
+ return currentClassMap[className];
+ });
+ }
+ }
+
+ function isAllowed(ruleType, element, currentAnimation, previousAnimation) {
+ return rules[ruleType].some(function(fn) {
+ return fn(element, currentAnimation, previousAnimation);
+ });
+ }
+
+ function hasAnimationClasses(animation, and) {
+ var a = (animation.addClass || '').length > 0;
+ var b = (animation.removeClass || '').length > 0;
+ return and ? a && b : a || b;
+ }
+
+ rules.join.push(function(element, newAnimation, currentAnimation) {
+ // if the new animation is class-based then we can just tack that on
+ return !newAnimation.structural && hasAnimationClasses(newAnimation);
+ });
+
+ rules.skip.push(function(element, newAnimation, currentAnimation) {
+ // there is no need to animate anything if no classes are being added and
+ // there is no structural animation that will be triggered
+ return !newAnimation.structural && !hasAnimationClasses(newAnimation);
+ });
+
+ rules.skip.push(function(element, newAnimation, currentAnimation) {
+ // why should we trigger a new structural animation if the element will
+ // be removed from the DOM anyway?
+ return currentAnimation.event == 'leave' && newAnimation.structural;
+ });
+
+ rules.skip.push(function(element, newAnimation, currentAnimation) {
+ // if there is an ongoing current animation then don't even bother running the class-based animation
+ return currentAnimation.structural && currentAnimation.state === RUNNING_STATE && !newAnimation.structural;
+ });
+
+ rules.cancel.push(function(element, newAnimation, currentAnimation) {
+ // there can never be two structural animations running at the same time
+ return currentAnimation.structural && newAnimation.structural;
+ });
+
+ rules.cancel.push(function(element, newAnimation, currentAnimation) {
+ // if the previous animation is already running, but the new animation will
+ // be triggered, but the new animation is structural
+ return currentAnimation.state === RUNNING_STATE && newAnimation.structural;
+ });
+
+ rules.cancel.push(function(element, newAnimation, currentAnimation) {
+ // cancel the animation if classes added / removed in both animation cancel each other out,
+ // but only if the current animation isn't structural
+
+ if (currentAnimation.structural) return false;
+
+ var nA = newAnimation.addClass;
+ var nR = newAnimation.removeClass;
+ var cA = currentAnimation.addClass;
+ var cR = currentAnimation.removeClass;
+
+ // early detection to save the global CPU shortage :)
+ if ((isUndefined(nA) && isUndefined(nR)) || (isUndefined(cA) && isUndefined(cR))) {
+ return false;
+ }
+
+ return hasMatchingClasses(nA, cR) || hasMatchingClasses(nR, cA);
+ });
+
+ this.$get = ['$$rAF', '$rootScope', '$rootElement', '$document', '$$HashMap',
+ '$$animation', '$$AnimateRunner', '$templateRequest', '$$jqLite', '$$forceReflow',
+ function($$rAF, $rootScope, $rootElement, $document, $$HashMap,
+ $$animation, $$AnimateRunner, $templateRequest, $$jqLite, $$forceReflow) {
+
+ var activeAnimationsLookup = new $$HashMap();
+ var disabledElementsLookup = new $$HashMap();
+ var animationsEnabled = null;
+
+ function postDigestTaskFactory() {
+ var postDigestCalled = false;
+ return function(fn) {
+ // we only issue a call to postDigest before
+ // it has first passed. This prevents any callbacks
+ // from not firing once the animation has completed
+ // since it will be out of the digest cycle.
+ if (postDigestCalled) {
+ fn();
+ } else {
+ $rootScope.$$postDigest(function() {
+ postDigestCalled = true;
+ fn();
+ });
+ }
+ };
+ }
+
+ // Wait until all directive and route-related templates are downloaded and
+ // compiled. The $templateRequest.totalPendingRequests variable keeps track of
+ // all of the remote templates being currently downloaded. If there are no
+ // templates currently downloading then the watcher will still fire anyway.
+ var deregisterWatch = $rootScope.$watch(
+ function() { return $templateRequest.totalPendingRequests === 0; },
+ function(isEmpty) {
+ if (!isEmpty) return;
+ deregisterWatch();
+
+ // Now that all templates have been downloaded, $animate will wait until
+ // the post digest queue is empty before enabling animations. By having two
+ // calls to $postDigest calls we can ensure that the flag is enabled at the
+ // very end of the post digest queue. Since all of the animations in $animate
+ // use $postDigest, it's important that the code below executes at the end.
+ // This basically means that the page is fully downloaded and compiled before
+ // any animations are triggered.
+ $rootScope.$$postDigest(function() {
+ $rootScope.$$postDigest(function() {
+ // we check for null directly in the event that the application already called
+ // .enabled() with whatever arguments that it provided it with
+ if (animationsEnabled === null) {
+ animationsEnabled = true;
+ }
+ });
+ });
+ }
+ );
+
+ var callbackRegistry = {};
+
+ // remember that the classNameFilter is set during the provider/config
+ // stage therefore we can optimize here and setup a helper function
+ var classNameFilter = $animateProvider.classNameFilter();
+ var isAnimatableClassName = !classNameFilter
+ ? function() { return true; }
+ : function(className) {
+ return classNameFilter.test(className);
+ };
+
+ var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);
+
+ function normalizeAnimationDetails(element, animation) {
+ return mergeAnimationDetails(element, animation, {});
+ }
+
+ // IE9-11 has no method "contains" in SVG element and in Node.prototype. Bug #10259.
+ var contains = Node.prototype.contains || function(arg) {
+ // jshint bitwise: false
+ return this === arg || !!(this.compareDocumentPosition(arg) & 16);
+ // jshint bitwise: true
+ };
+
+ function findCallbacks(parent, element, event) {
+ var targetNode = getDomNode(element);
+ var targetParentNode = getDomNode(parent);
+
+ var matches = [];
+ var entries = callbackRegistry[event];
+ if (entries) {
+ forEach(entries, function(entry) {
+ if (contains.call(entry.node, targetNode)) {
+ matches.push(entry.callback);
+ } else if (event === 'leave' && contains.call(entry.node, targetParentNode)) {
+ matches.push(entry.callback);
+ }
+ });
+ }
+
+ return matches;
+ }
+
+ var $animate = {
+ on: function(event, container, callback) {
+ var node = extractElementNode(container);
+ callbackRegistry[event] = callbackRegistry[event] || [];
+ callbackRegistry[event].push({
+ node: node,
+ callback: callback
+ });
+
+ // Remove the callback when the element is removed from the DOM
+ jqLite(container).on('$destroy', function() {
+ $animate.off(event, container, callback);
+ });
+ },
+
+ off: function(event, container, callback) {
+ var entries = callbackRegistry[event];
+ if (!entries) return;
+
+ callbackRegistry[event] = arguments.length === 1
+ ? null
+ : filterFromRegistry(entries, container, callback);
+
+ function filterFromRegistry(list, matchContainer, matchCallback) {
+ var containerNode = extractElementNode(matchContainer);
+ return list.filter(function(entry) {
+ var isMatch = entry.node === containerNode &&
+ (!matchCallback || entry.callback === matchCallback);
+ return !isMatch;
+ });
+ }
+ },
+
+ pin: function(element, parentElement) {
+ assertArg(isElement(element), 'element', 'not an element');
+ assertArg(isElement(parentElement), 'parentElement', 'not an element');
+ element.data(NG_ANIMATE_PIN_DATA, parentElement);
+ },
+
+ push: function(element, event, options, domOperation) {
+ options = options || {};
+ options.domOperation = domOperation;
+ return queueAnimation(element, event, options);
+ },
+
+ // this method has four signatures:
+ // () - global getter
+ // (bool) - global setter
+ // (element) - element getter
+ // (element, bool) - element setter
+ enabled: function(element, bool) {
+ var argCount = arguments.length;
+
+ if (argCount === 0) {
+ // () - Global getter
+ bool = !!animationsEnabled;
+ } else {
+ var hasElement = isElement(element);
+
+ if (!hasElement) {
+ // (bool) - Global setter
+ bool = animationsEnabled = !!element;
+ } else {
+ var node = getDomNode(element);
+ var recordExists = disabledElementsLookup.get(node);
+
+ if (argCount === 1) {
+ // (element) - Element getter
+ bool = !recordExists;
+ } else {
+ // (element, bool) - Element setter
+ disabledElementsLookup.put(node, !bool);
+ }
+ }
+ }
+
+ return bool;
+ }
+ };
+
+ return $animate;
+
+ function queueAnimation(element, event, initialOptions) {
+ // we always make a copy of the options since
+ // there should never be any side effects on
+ // the input data when running `$animateCss`.
+ var options = copy(initialOptions);
+
+ var node, parent;
+ element = stripCommentsFromElement(element);
+ if (element) {
+ node = getDomNode(element);
+ parent = element.parent();
+ }
+
+ options = prepareAnimationOptions(options);
+
+ // we create a fake runner with a working promise.
+ // These methods will become available after the digest has passed
+ var runner = new $$AnimateRunner();
+
+ // this is used to trigger callbacks in postDigest mode
+ var runInNextPostDigestOrNow = postDigestTaskFactory();
+
+ if (isArray(options.addClass)) {
+ options.addClass = options.addClass.join(' ');
+ }
+
+ if (options.addClass && !isString(options.addClass)) {
+ options.addClass = null;
+ }
+
+ if (isArray(options.removeClass)) {
+ options.removeClass = options.removeClass.join(' ');
+ }
+
+ if (options.removeClass && !isString(options.removeClass)) {
+ options.removeClass = null;
+ }
+
+ if (options.from && !isObject(options.from)) {
+ options.from = null;
+ }
+
+ if (options.to && !isObject(options.to)) {
+ options.to = null;
+ }
+
+ // there are situations where a directive issues an animation for
+ // a jqLite wrapper that contains only comment nodes... If this
+ // happens then there is no way we can perform an animation
+ if (!node) {
+ close();
+ return runner;
+ }
+
+ var className = [node.className, options.addClass, options.removeClass].join(' ');
+ if (!isAnimatableClassName(className)) {
+ close();
+ return runner;
+ }
+
+ var isStructural = ['enter', 'move', 'leave'].indexOf(event) >= 0;
+
+ // this is a hard disable of all animations for the application or on
+ // the element itself, therefore there is no need to continue further
+ // past this point if not enabled
+ // Animations are also disabled if the document is currently hidden (page is not visible
+ // to the user), because browsers slow down or do not flush calls to requestAnimationFrame
+ var skipAnimations = !animationsEnabled || $document[0].hidden || disabledElementsLookup.get(node);
+ var existingAnimation = (!skipAnimations && activeAnimationsLookup.get(node)) || {};
+ var hasExistingAnimation = !!existingAnimation.state;
+
+ // there is no point in traversing the same collection of parent ancestors if a followup
+ // animation will be run on the same element that already did all that checking work
+ if (!skipAnimations && (!hasExistingAnimation || existingAnimation.state != PRE_DIGEST_STATE)) {
+ skipAnimations = !areAnimationsAllowed(element, parent, event);
+ }
+
+ if (skipAnimations) {
+ close();
+ return runner;
+ }
+
+ if (isStructural) {
+ closeChildAnimations(element);
+ }
+
+ var newAnimation = {
+ structural: isStructural,
+ element: element,
+ event: event,
+ addClass: options.addClass,
+ removeClass: options.removeClass,
+ close: close,
+ options: options,
+ runner: runner
+ };
+
+ if (hasExistingAnimation) {
+ var skipAnimationFlag = isAllowed('skip', element, newAnimation, existingAnimation);
+ if (skipAnimationFlag) {
+ if (existingAnimation.state === RUNNING_STATE) {
+ close();
+ return runner;
+ } else {
+ mergeAnimationDetails(element, existingAnimation, newAnimation);
+ return existingAnimation.runner;
+ }
+ }
+ var cancelAnimationFlag = isAllowed('cancel', element, newAnimation, existingAnimation);
+ if (cancelAnimationFlag) {
+ if (existingAnimation.state === RUNNING_STATE) {
+ // this will end the animation right away and it is safe
+ // to do so since the animation is already running and the
+ // runner callback code will run in async
+ existingAnimation.runner.end();
+ } else if (existingAnimation.structural) {
+ // this means that the animation is queued into a digest, but
+ // hasn't started yet. Therefore it is safe to run the close
+ // method which will call the runner methods in async.
+ existingAnimation.close();
+ } else {
+ // this will merge the new animation options into existing animation options
+ mergeAnimationDetails(element, existingAnimation, newAnimation);
+
+ return existingAnimation.runner;
+ }
+ } else {
+ // a joined animation means that this animation will take over the existing one
+ // so an example would involve a leave animation taking over an enter. Then when
+ // the postDigest kicks in the enter will be ignored.
+ var joinAnimationFlag = isAllowed('join', element, newAnimation, existingAnimation);
+ if (joinAnimationFlag) {
+ if (existingAnimation.state === RUNNING_STATE) {
+ normalizeAnimationDetails(element, newAnimation);
+ } else {
+ applyGeneratedPreparationClasses(element, isStructural ? event : null, options);
+
+ event = newAnimation.event = existingAnimation.event;
+ options = mergeAnimationDetails(element, existingAnimation, newAnimation);
+
+ //we return the same runner since only the option values of this animation will
+ //be fed into the `existingAnimation`.
+ return existingAnimation.runner;
+ }
+ }
+ }
+ } else {
+ // normalization in this case means that it removes redundant CSS classes that
+ // already exist (addClass) or do not exist (removeClass) on the element
+ normalizeAnimationDetails(element, newAnimation);
+ }
+
+ // when the options are merged and cleaned up we may end up not having to do
+ // an animation at all, therefore we should check this before issuing a post
+ // digest callback. Structural animations will always run no matter what.
+ var isValidAnimation = newAnimation.structural;
+ if (!isValidAnimation) {
+ // animate (from/to) can be quickly checked first, otherwise we check if any classes are present
+ isValidAnimation = (newAnimation.event === 'animate' && Object.keys(newAnimation.options.to || {}).length > 0)
+ || hasAnimationClasses(newAnimation);
+ }
+
+ if (!isValidAnimation) {
+ close();
+ clearElementAnimationState(element);
+ return runner;
+ }
+
+ // the counter keeps track of cancelled animations
+ var counter = (existingAnimation.counter || 0) + 1;
+ newAnimation.counter = counter;
+
+ markElementAnimationState(element, PRE_DIGEST_STATE, newAnimation);
+
+ $rootScope.$$postDigest(function() {
+ var animationDetails = activeAnimationsLookup.get(node);
+ var animationCancelled = !animationDetails;
+ animationDetails = animationDetails || {};
+
+ // if addClass/removeClass is called before something like enter then the
+ // registered parent element may not be present. The code below will ensure
+ // that a final value for parent element is obtained
+ var parentElement = element.parent() || [];
+
+ // animate/structural/class-based animations all have requirements. Otherwise there
+ // is no point in performing an animation. The parent node must also be set.
+ var isValidAnimation = parentElement.length > 0
+ && (animationDetails.event === 'animate'
+ || animationDetails.structural
+ || hasAnimationClasses(animationDetails));
+
+ // this means that the previous animation was cancelled
+ // even if the follow-up animation is the same event
+ if (animationCancelled || animationDetails.counter !== counter || !isValidAnimation) {
+ // if another animation did not take over then we need
+ // to make sure that the domOperation and options are
+ // handled accordingly
+ if (animationCancelled) {
+ applyAnimationClasses(element, options);
+ applyAnimationStyles(element, options);
+ }
+
+ // if the event changed from something like enter to leave then we do
+ // it, otherwise if it's the same then the end result will be the same too
+ if (animationCancelled || (isStructural && animationDetails.event !== event)) {
+ options.domOperation();
+ runner.end();
+ }
+
+ // in the event that the element animation was not cancelled or a follow-up animation
+ // isn't allowed to animate from here then we need to clear the state of the element
+ // so that any future animations won't read the expired animation data.
+ if (!isValidAnimation) {
+ clearElementAnimationState(element);
+ }
+
+ return;
+ }
+
+ // this combined multiple class to addClass / removeClass into a setClass event
+ // so long as a structural event did not take over the animation
+ event = !animationDetails.structural && hasAnimationClasses(animationDetails, true)
+ ? 'setClass'
+ : animationDetails.event;
+
+ markElementAnimationState(element, RUNNING_STATE);
+ var realRunner = $$animation(element, event, animationDetails.options);
+
+ realRunner.done(function(status) {
+ close(!status);
+ var animationDetails = activeAnimationsLookup.get(node);
+ if (animationDetails && animationDetails.counter === counter) {
+ clearElementAnimationState(getDomNode(element));
+ }
+ notifyProgress(runner, event, 'close', {});
+ });
+
+ // this will update the runner's flow-control events based on
+ // the `realRunner` object.
+ runner.setHost(realRunner);
+ notifyProgress(runner, event, 'start', {});
+ });
+
+ return runner;
+
+ function notifyProgress(runner, event, phase, data) {
+ runInNextPostDigestOrNow(function() {
+ var callbacks = findCallbacks(parent, element, event);
+ if (callbacks.length) {
+ // do not optimize this call here to RAF because
+ // we don't know how heavy the callback code here will
+ // be and if this code is buffered then this can
+ // lead to a performance regression.
+ $$rAF(function() {
+ forEach(callbacks, function(callback) {
+ callback(element, phase, data);
+ });
+ });
+ }
+ });
+ runner.progress(event, phase, data);
+ }
+
+ function close(reject) { // jshint ignore:line
+ clearGeneratedClasses(element, options);
+ applyAnimationClasses(element, options);
+ applyAnimationStyles(element, options);
+ options.domOperation();
+ runner.complete(!reject);
+ }
+ }
+
+ function closeChildAnimations(element) {
+ var node = getDomNode(element);
+ var children = node.querySelectorAll('[' + NG_ANIMATE_ATTR_NAME + ']');
+ forEach(children, function(child) {
+ var state = parseInt(child.getAttribute(NG_ANIMATE_ATTR_NAME));
+ var animationDetails = activeAnimationsLookup.get(child);
+ if (animationDetails) {
+ switch (state) {
+ case RUNNING_STATE:
+ animationDetails.runner.end();
+ /* falls through */
+ case PRE_DIGEST_STATE:
+ activeAnimationsLookup.remove(child);
+ break;
+ }
+ }
+ });
+ }
+
+ function clearElementAnimationState(element) {
+ var node = getDomNode(element);
+ node.removeAttribute(NG_ANIMATE_ATTR_NAME);
+ activeAnimationsLookup.remove(node);
+ }
+
+ function isMatchingElement(nodeOrElmA, nodeOrElmB) {
+ return getDomNode(nodeOrElmA) === getDomNode(nodeOrElmB);
+ }
+
+ /**
+ * This fn returns false if any of the following is true:
+ * a) animations on any parent element are disabled, and animations on the element aren't explicitly allowed
+ * b) a parent element has an ongoing structural animation, and animateChildren is false
+ * c) the element is not a child of the body
+ * d) the element is not a child of the $rootElement
+ */
+ function areAnimationsAllowed(element, parentElement, event) {
+ var bodyElement = jqLite($document[0].body);
+ var bodyElementDetected = isMatchingElement(element, bodyElement) || element[0].nodeName === 'HTML';
+ var rootElementDetected = isMatchingElement(element, $rootElement);
+ var parentAnimationDetected = false;
+ var animateChildren;
+ var elementDisabled = disabledElementsLookup.get(getDomNode(element));
+
+ var parentHost = jqLite.data(element[0], NG_ANIMATE_PIN_DATA);
+ if (parentHost) {
+ parentElement = parentHost;
+ }
+
+ parentElement = getDomNode(parentElement);
+
+ while (parentElement) {
+ if (!rootElementDetected) {
+ // angular doesn't want to attempt to animate elements outside of the application
+ // therefore we need to ensure that the rootElement is an ancestor of the current element
+ rootElementDetected = isMatchingElement(parentElement, $rootElement);
+ }
+
+ if (parentElement.nodeType !== ELEMENT_NODE) {
+ // no point in inspecting the #document element
+ break;
+ }
+
+ var details = activeAnimationsLookup.get(parentElement) || {};
+ // either an enter, leave or move animation will commence
+ // therefore we can't allow any animations to take place
+ // but if a parent animation is class-based then that's ok
+ if (!parentAnimationDetected) {
+ var parentElementDisabled = disabledElementsLookup.get(parentElement);
+
+ if (parentElementDisabled === true && elementDisabled !== false) {
+ // disable animations if the user hasn't explicitly enabled animations on the
+ // current element
+ elementDisabled = true;
+ // element is disabled via parent element, no need to check anything else
+ break;
+ } else if (parentElementDisabled === false) {
+ elementDisabled = false;
+ }
+ parentAnimationDetected = details.structural;
+ }
+
+ if (isUndefined(animateChildren) || animateChildren === true) {
+ var value = jqLite.data(parentElement, NG_ANIMATE_CHILDREN_DATA);
+ if (isDefined(value)) {
+ animateChildren = value;
+ }
+ }
+
+ // there is no need to continue traversing at this point
+ if (parentAnimationDetected && animateChildren === false) break;
+
+ if (!bodyElementDetected) {
+ // we also need to ensure that the element is or will be a part of the body element
+ // otherwise it is pointless to even issue an animation to be rendered
+ bodyElementDetected = isMatchingElement(parentElement, bodyElement);
+ }
+
+ if (bodyElementDetected && rootElementDetected) {
+ // If both body and root have been found, any other checks are pointless,
+ // as no animation data should live outside the application
+ break;
+ }
+
+ if (!rootElementDetected) {
+ // If no rootElement is detected, check if the parentElement is pinned to another element
+ parentHost = jqLite.data(parentElement, NG_ANIMATE_PIN_DATA);
+ if (parentHost) {
+ // The pin target element becomes the next parent element
+ parentElement = getDomNode(parentHost);
+ continue;
+ }
+ }
+
+ parentElement = parentElement.parentNode;
+ }
+
+ var allowAnimation = (!parentAnimationDetected || animateChildren) && elementDisabled !== true;
+ return allowAnimation && rootElementDetected && bodyElementDetected;
+ }
+
+ function markElementAnimationState(element, state, details) {
+ details = details || {};
+ details.state = state;
+
+ var node = getDomNode(element);
+ node.setAttribute(NG_ANIMATE_ATTR_NAME, state);
+
+ var oldValue = activeAnimationsLookup.get(node);
+ var newValue = oldValue
+ ? extend(oldValue, details)
+ : details;
+ activeAnimationsLookup.put(node, newValue);
+ }
+ }];
+}];
+
+var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
+ var NG_ANIMATE_REF_ATTR = 'ng-animate-ref';
+
+ var drivers = this.drivers = [];
+
+ var RUNNER_STORAGE_KEY = '$$animationRunner';
+
+ function setRunner(element, runner) {
+ element.data(RUNNER_STORAGE_KEY, runner);
+ }
+
+ function removeRunner(element) {
+ element.removeData(RUNNER_STORAGE_KEY);
+ }
+
+ function getRunner(element) {
+ return element.data(RUNNER_STORAGE_KEY);
+ }
+
+ this.$get = ['$$jqLite', '$rootScope', '$injector', '$$AnimateRunner', '$$HashMap', '$$rAFScheduler',
+ function($$jqLite, $rootScope, $injector, $$AnimateRunner, $$HashMap, $$rAFScheduler) {
+
+ var animationQueue = [];
+ var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);
+
+ function sortAnimations(animations) {
+ var tree = { children: [] };
+ var i, lookup = new $$HashMap();
+
+ // this is done first beforehand so that the hashmap
+ // is filled with a list of the elements that will be animated
+ for (i = 0; i < animations.length; i++) {
+ var animation = animations[i];
+ lookup.put(animation.domNode, animations[i] = {
+ domNode: animation.domNode,
+ fn: animation.fn,
+ children: []
+ });
+ }
+
+ for (i = 0; i < animations.length; i++) {
+ processNode(animations[i]);
+ }
+
+ return flatten(tree);
+
+ function processNode(entry) {
+ if (entry.processed) return entry;
+ entry.processed = true;
+
+ var elementNode = entry.domNode;
+ var parentNode = elementNode.parentNode;
+ lookup.put(elementNode, entry);
+
+ var parentEntry;
+ while (parentNode) {
+ parentEntry = lookup.get(parentNode);
+ if (parentEntry) {
+ if (!parentEntry.processed) {
+ parentEntry = processNode(parentEntry);
+ }
+ break;
+ }
+ parentNode = parentNode.parentNode;
+ }
+
+ (parentEntry || tree).children.push(entry);
+ return entry;
+ }
+
+ function flatten(tree) {
+ var result = [];
+ var queue = [];
+ var i;
+
+ for (i = 0; i < tree.children.length; i++) {
+ queue.push(tree.children[i]);
+ }
+
+ var remainingLevelEntries = queue.length;
+ var nextLevelEntries = 0;
+ var row = [];
+
+ for (i = 0; i < queue.length; i++) {
+ var entry = queue[i];
+ if (remainingLevelEntries <= 0) {
+ remainingLevelEntries = nextLevelEntries;
+ nextLevelEntries = 0;
+ result.push(row);
+ row = [];
+ }
+ row.push(entry.fn);
+ entry.children.forEach(function(childEntry) {
+ nextLevelEntries++;
+ queue.push(childEntry);
+ });
+ remainingLevelEntries--;
+ }
+
+ if (row.length) {
+ result.push(row);
+ }
+
+ return result;
+ }
+ }
+
+ // TODO(matsko): document the signature in a better way
+ return function(element, event, options) {
+ options = prepareAnimationOptions(options);
+ var isStructural = ['enter', 'move', 'leave'].indexOf(event) >= 0;
+
+ // there is no animation at the current moment, however
+ // these runner methods will get later updated with the
+ // methods leading into the driver's end/cancel methods
+ // for now they just stop the animation from starting
+ var runner = new $$AnimateRunner({
+ end: function() { close(); },
+ cancel: function() { close(true); }
+ });
+
+ if (!drivers.length) {
+ close();
+ return runner;
+ }
+
+ setRunner(element, runner);
+
+ var classes = mergeClasses(element.attr('class'), mergeClasses(options.addClass, options.removeClass));
+ var tempClasses = options.tempClasses;
+ if (tempClasses) {
+ classes += ' ' + tempClasses;
+ options.tempClasses = null;
+ }
+
+ var prepareClassName;
+ if (isStructural) {
+ prepareClassName = 'ng-' + event + PREPARE_CLASS_SUFFIX;
+ $$jqLite.addClass(element, prepareClassName);
+ }
+
+ animationQueue.push({
+ // this data is used by the postDigest code and passed into
+ // the driver step function
+ element: element,
+ classes: classes,
+ event: event,
+ structural: isStructural,
+ options: options,
+ beforeStart: beforeStart,
+ close: close
+ });
+
+ element.on('$destroy', handleDestroyedElement);
+
+ // we only want there to be one function called within the post digest
+ // block. This way we can group animations for all the animations that
+ // were apart of the same postDigest flush call.
+ if (animationQueue.length > 1) return runner;
+
+ $rootScope.$$postDigest(function() {
+ var animations = [];
+ forEach(animationQueue, function(entry) {
+ // the element was destroyed early on which removed the runner
+ // form its storage. This means we can't animate this element
+ // at all and it already has been closed due to destruction.
+ if (getRunner(entry.element)) {
+ animations.push(entry);
+ } else {
+ entry.close();
+ }
+ });
+
+ // now any future animations will be in another postDigest
+ animationQueue.length = 0;
+
+ var groupedAnimations = groupAnimations(animations);
+ var toBeSortedAnimations = [];
+
+ forEach(groupedAnimations, function(animationEntry) {
+ toBeSortedAnimations.push({
+ domNode: getDomNode(animationEntry.from ? animationEntry.from.element : animationEntry.element),
+ fn: function triggerAnimationStart() {
+ // it's important that we apply the `ng-animate` CSS class and the
+ // temporary classes before we do any driver invoking since these
+ // CSS classes may be required for proper CSS detection.
+ animationEntry.beforeStart();
+
+ var startAnimationFn, closeFn = animationEntry.close;
+
+ // in the event that the element was removed before the digest runs or
+ // during the RAF sequencing then we should not trigger the animation.
+ var targetElement = animationEntry.anchors
+ ? (animationEntry.from.element || animationEntry.to.element)
+ : animationEntry.element;
+
+ if (getRunner(targetElement)) {
+ var operation = invokeFirstDriver(animationEntry);
+ if (operation) {
+ startAnimationFn = operation.start;
+ }
+ }
+
+ if (!startAnimationFn) {
+ closeFn();
+ } else {
+ var animationRunner = startAnimationFn();
+ animationRunner.done(function(status) {
+ closeFn(!status);
+ });
+ updateAnimationRunners(animationEntry, animationRunner);
+ }
+ }
+ });
+ });
+
+ // we need to sort each of the animations in order of parent to child
+ // relationships. This ensures that the child classes are applied at the
+ // right time.
+ $$rAFScheduler(sortAnimations(toBeSortedAnimations));
+ });
+
+ return runner;
+
+ // TODO(matsko): change to reference nodes
+ function getAnchorNodes(node) {
+ var SELECTOR = '[' + NG_ANIMATE_REF_ATTR + ']';
+ var items = node.hasAttribute(NG_ANIMATE_REF_ATTR)
+ ? [node]
+ : node.querySelectorAll(SELECTOR);
+ var anchors = [];
+ forEach(items, function(node) {
+ var attr = node.getAttribute(NG_ANIMATE_REF_ATTR);
+ if (attr && attr.length) {
+ anchors.push(node);
+ }
+ });
+ return anchors;
+ }
+
+ function groupAnimations(animations) {
+ var preparedAnimations = [];
+ var refLookup = {};
+ forEach(animations, function(animation, index) {
+ var element = animation.element;
+ var node = getDomNode(element);
+ var event = animation.event;
+ var enterOrMove = ['enter', 'move'].indexOf(event) >= 0;
+ var anchorNodes = animation.structural ? getAnchorNodes(node) : [];
+
+ if (anchorNodes.length) {
+ var direction = enterOrMove ? 'to' : 'from';
+
+ forEach(anchorNodes, function(anchor) {
+ var key = anchor.getAttribute(NG_ANIMATE_REF_ATTR);
+ refLookup[key] = refLookup[key] || {};
+ refLookup[key][direction] = {
+ animationID: index,
+ element: jqLite(anchor)
+ };
+ });
+ } else {
+ preparedAnimations.push(animation);
+ }
+ });
+
+ var usedIndicesLookup = {};
+ var anchorGroups = {};
+ forEach(refLookup, function(operations, key) {
+ var from = operations.from;
+ var to = operations.to;
+
+ if (!from || !to) {
+ // only one of these is set therefore we can't have an
+ // anchor animation since all three pieces are required
+ var index = from ? from.animationID : to.animationID;
+ var indexKey = index.toString();
+ if (!usedIndicesLookup[indexKey]) {
+ usedIndicesLookup[indexKey] = true;
+ preparedAnimations.push(animations[index]);
+ }
+ return;
+ }
+
+ var fromAnimation = animations[from.animationID];
+ var toAnimation = animations[to.animationID];
+ var lookupKey = from.animationID.toString();
+ if (!anchorGroups[lookupKey]) {
+ var group = anchorGroups[lookupKey] = {
+ structural: true,
+ beforeStart: function() {
+ fromAnimation.beforeStart();
+ toAnimation.beforeStart();
+ },
+ close: function() {
+ fromAnimation.close();
+ toAnimation.close();
+ },
+ classes: cssClassesIntersection(fromAnimation.classes, toAnimation.classes),
+ from: fromAnimation,
+ to: toAnimation,
+ anchors: [] // TODO(matsko): change to reference nodes
+ };
+
+ // the anchor animations require that the from and to elements both have at least
+ // one shared CSS class which effectively marries the two elements together to use
+ // the same animation driver and to properly sequence the anchor animation.
+ if (group.classes.length) {
+ preparedAnimations.push(group);
+ } else {
+ preparedAnimations.push(fromAnimation);
+ preparedAnimations.push(toAnimation);
+ }
+ }
+
+ anchorGroups[lookupKey].anchors.push({
+ 'out': from.element, 'in': to.element
+ });
+ });
+
+ return preparedAnimations;
+ }
+
+ function cssClassesIntersection(a,b) {
+ a = a.split(' ');
+ b = b.split(' ');
+ var matches = [];
+
+ for (var i = 0; i < a.length; i++) {
+ var aa = a[i];
+ if (aa.substring(0,3) === 'ng-') continue;
+
+ for (var j = 0; j < b.length; j++) {
+ if (aa === b[j]) {
+ matches.push(aa);
+ break;
+ }
+ }
+ }
+
+ return matches.join(' ');
+ }
+
+ function invokeFirstDriver(animationDetails) {
+ // we loop in reverse order since the more general drivers (like CSS and JS)
+ // may attempt more elements, but custom drivers are more particular
+ for (var i = drivers.length - 1; i >= 0; i--) {
+ var driverName = drivers[i];
+ if (!$injector.has(driverName)) continue; // TODO(matsko): remove this check
+
+ var factory = $injector.get(driverName);
+ var driver = factory(animationDetails);
+ if (driver) {
+ return driver;
+ }
+ }
+ }
+
+ function beforeStart() {
+ element.addClass(NG_ANIMATE_CLASSNAME);
+ if (tempClasses) {
+ $$jqLite.addClass(element, tempClasses);
+ }
+ if (prepareClassName) {
+ $$jqLite.removeClass(element, prepareClassName);
+ prepareClassName = null;
+ }
+ }
+
+ function updateAnimationRunners(animation, newRunner) {
+ if (animation.from && animation.to) {
+ update(animation.from.element);
+ update(animation.to.element);
+ } else {
+ update(animation.element);
+ }
+
+ function update(element) {
+ getRunner(element).setHost(newRunner);
+ }
+ }
+
+ function handleDestroyedElement() {
+ var runner = getRunner(element);
+ if (runner && (event !== 'leave' || !options.$$domOperationFired)) {
+ runner.end();
+ }
+ }
+
+ function close(rejected) { // jshint ignore:line
+ element.off('$destroy', handleDestroyedElement);
+ removeRunner(element);
+
+ applyAnimationClasses(element, options);
+ applyAnimationStyles(element, options);
+ options.domOperation();
+
+ if (tempClasses) {
+ $$jqLite.removeClass(element, tempClasses);
+ }
+
+ element.removeClass(NG_ANIMATE_CLASSNAME);
+ runner.complete(!rejected);
+ }
+ };
+ }];
+}];
+
+/**
+ * @ngdoc directive
+ * @name ngAnimateSwap
+ * @restrict A
+ * @scope
+ *
+ * @description
+ *
+ * ngAnimateSwap is a animation-oriented directive that allows for the container to
+ * be removed and entered in whenever the associated expression changes. A
+ * common usecase for this directive is a rotating banner or slider component which
+ * contains one image being present at a time. When the active image changes
+ * then the old image will perform a `leave` animation and the new element
+ * will be inserted via an `enter` animation.
+ *
+ * @animations
+ * | Animation | Occurs |
+ * |----------------------------------|--------------------------------------|
+ * | {@link ng.$animate#enter enter} | when the new element is inserted to the DOM |
+ * | {@link ng.$animate#leave leave} | when the old element is removed from the DOM |
+ *
+ * @example
+ *
+ *
+ *
+ *
+ * {{ number }}
+ *
+ *
+ *
+ *
+ * angular.module('ngAnimateSwapExample', ['ngAnimate'])
+ * .controller('AppCtrl', ['$scope', '$interval', function($scope, $interval) {
+ * $scope.number = 0;
+ * $interval(function() {
+ * $scope.number++;
+ * }, 1000);
+ *
+ * var colors = ['red','blue','green','yellow','orange'];
+ * $scope.colorClass = function(number) {
+ * return colors[number % colors.length];
+ * };
+ * }]);
+ *
+ *
+ * .container {
+ * height:250px;
+ * width:250px;
+ * position:relative;
+ * overflow:hidden;
+ * border:2px solid black;
+ * }
+ * .container .cell {
+ * font-size:150px;
+ * text-align:center;
+ * line-height:250px;
+ * position:absolute;
+ * top:0;
+ * left:0;
+ * right:0;
+ * border-bottom:2px solid black;
+ * }
+ * .swap-animation.ng-enter, .swap-animation.ng-leave {
+ * transition:0.5s linear all;
+ * }
+ * .swap-animation.ng-enter {
+ * top:-250px;
+ * }
+ * .swap-animation.ng-enter-active {
+ * top:0px;
+ * }
+ * .swap-animation.ng-leave {
+ * top:0px;
+ * }
+ * .swap-animation.ng-leave-active {
+ * top:250px;
+ * }
+ * .red { background:red; }
+ * .green { background:green; }
+ * .blue { background:blue; }
+ * .yellow { background:yellow; }
+ * .orange { background:orange; }
+ *
+ *
+ */
+var ngAnimateSwapDirective = ['$animate', '$rootScope', function($animate, $rootScope) {
+ return {
+ restrict: 'A',
+ transclude: 'element',
+ terminal: true,
+ priority: 600, // we use 600 here to ensure that the directive is caught before others
+ link: function(scope, $element, attrs, ctrl, $transclude) {
+ var previousElement, previousScope;
+ scope.$watchCollection(attrs.ngAnimateSwap || attrs['for'], function(value) {
+ if (previousElement) {
+ $animate.leave(previousElement);
+ }
+ if (previousScope) {
+ previousScope.$destroy();
+ previousScope = null;
+ }
+ if (value || value === 0) {
+ previousScope = scope.$new();
+ $transclude(previousScope, function(element) {
+ previousElement = element;
+ $animate.enter(element, null, $element);
+ });
+ }
+ });
+ }
+ };
+}];
+
+/* global angularAnimateModule: true,
+
+ ngAnimateSwapDirective,
+ $$AnimateAsyncRunFactory,
+ $$rAFSchedulerFactory,
+ $$AnimateChildrenDirective,
+ $$AnimateQueueProvider,
+ $$AnimationProvider,
+ $AnimateCssProvider,
+ $$AnimateCssDriverProvider,
+ $$AnimateJsProvider,
+ $$AnimateJsDriverProvider,
+*/
+
+/**
+ * @ngdoc module
+ * @name ngAnimate
+ * @description
+ *
+ * The `ngAnimate` module provides support for CSS-based animations (keyframes and transitions) as well as JavaScript-based animations via
+ * callback hooks. Animations are not enabled by default, however, by including `ngAnimate` the animation hooks are enabled for an Angular app.
+ *
+ *
+ *
+ * # Usage
+ * Simply put, there are two ways to make use of animations when ngAnimate is used: by using **CSS** and **JavaScript**. The former works purely based
+ * using CSS (by using matching CSS selectors/styles) and the latter triggers animations that are registered via `module.animation()`. For
+ * both CSS and JS animations the sole requirement is to have a matching `CSS class` that exists both in the registered animation and within
+ * the HTML element that the animation will be triggered on.
+ *
+ * ## Directive Support
+ * The following directives are "animation aware":
+ *
+ * | Directive | Supported Animations |
+ * |----------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------|
+ * | {@link ng.directive:ngRepeat#animations ngRepeat} | enter, leave and move |
+ * | {@link ngRoute.directive:ngView#animations ngView} | enter and leave |
+ * | {@link ng.directive:ngInclude#animations ngInclude} | enter and leave |
+ * | {@link ng.directive:ngSwitch#animations ngSwitch} | enter and leave |
+ * | {@link ng.directive:ngIf#animations ngIf} | enter and leave |
+ * | {@link ng.directive:ngClass#animations ngClass} | add and remove (the CSS class(es) present) |
+ * | {@link ng.directive:ngShow#animations ngShow} & {@link ng.directive:ngHide#animations ngHide} | add and remove (the ng-hide class value) |
+ * | {@link ng.directive:form#animation-hooks form} & {@link ng.directive:ngModel#animation-hooks ngModel} | add and remove (dirty, pristine, valid, invalid & all other validations) |
+ * | {@link module:ngMessages#animations ngMessages} | add and remove (ng-active & ng-inactive) |
+ * | {@link module:ngMessages#animations ngMessage} | enter and leave |
+ *
+ * (More information can be found by visiting each the documentation associated with each directive.)
+ *
+ * ## CSS-based Animations
+ *
+ * CSS-based animations with ngAnimate are unique since they require no JavaScript code at all. By using a CSS class that we reference between our HTML
+ * and CSS code we can create an animation that will be picked up by Angular when an the underlying directive performs an operation.
+ *
+ * The example below shows how an `enter` animation can be made possible on an element using `ng-if`:
+ *
+ * ```html
+ *
+ * Fade me in out
+ *
+ *
+ *
+ * ```
+ *
+ * Notice the CSS class **fade**? We can now create the CSS transition code that references this class:
+ *
+ * ```css
+ * /* The starting CSS styles for the enter animation */
+ * .fade.ng-enter {
+ * transition:0.5s linear all;
+ * opacity:0;
+ * }
+ *
+ * /* The finishing CSS styles for the enter animation */
+ * .fade.ng-enter.ng-enter-active {
+ * opacity:1;
+ * }
+ * ```
+ *
+ * The key thing to remember here is that, depending on the animation event (which each of the directives above trigger depending on what's going on) two
+ * generated CSS classes will be applied to the element; in the example above we have `.ng-enter` and `.ng-enter-active`. For CSS transitions, the transition
+ * code **must** be defined within the starting CSS class (in this case `.ng-enter`). The destination class is what the transition will animate towards.
+ *
+ * If for example we wanted to create animations for `leave` and `move` (ngRepeat triggers move) then we can do so using the same CSS naming conventions:
+ *
+ * ```css
+ * /* now the element will fade out before it is removed from the DOM */
+ * .fade.ng-leave {
+ * transition:0.5s linear all;
+ * opacity:1;
+ * }
+ * .fade.ng-leave.ng-leave-active {
+ * opacity:0;
+ * }
+ * ```
+ *
+ * We can also make use of **CSS Keyframes** by referencing the keyframe animation within the starting CSS class:
+ *
+ * ```css
+ * /* there is no need to define anything inside of the destination
+ * CSS class since the keyframe will take charge of the animation */
+ * .fade.ng-leave {
+ * animation: my_fade_animation 0.5s linear;
+ * -webkit-animation: my_fade_animation 0.5s linear;
+ * }
+ *
+ * @keyframes my_fade_animation {
+ * from { opacity:1; }
+ * to { opacity:0; }
+ * }
+ *
+ * @-webkit-keyframes my_fade_animation {
+ * from { opacity:1; }
+ * to { opacity:0; }
+ * }
+ * ```
+ *
+ * Feel free also mix transitions and keyframes together as well as any other CSS classes on the same element.
+ *
+ * ### CSS Class-based Animations
+ *
+ * Class-based animations (animations that are triggered via `ngClass`, `ngShow`, `ngHide` and some other directives) have a slightly different
+ * naming convention. Class-based animations are basic enough that a standard transition or keyframe can be referenced on the class being added
+ * and removed.
+ *
+ * For example if we wanted to do a CSS animation for `ngHide` then we place an animation on the `.ng-hide` CSS class:
+ *
+ * ```html
+ *
+ * Show and hide me
+ *
+ *
+ *
+ *
+ * ```
+ *
+ * All that is going on here with ngShow/ngHide behind the scenes is the `.ng-hide` class is added/removed (when the hidden state is valid). Since
+ * ngShow and ngHide are animation aware then we can match up a transition and ngAnimate handles the rest.
+ *
+ * In addition the addition and removal of the CSS class, ngAnimate also provides two helper methods that we can use to further decorate the animation
+ * with CSS styles.
+ *
+ * ```html
+ *
+ * Highlight this box
+ *
+ *
+ *
+ *
+ * ```
+ *
+ * We can also make use of CSS keyframes by placing them within the CSS classes.
+ *
+ *
+ * ### CSS Staggering Animations
+ * A Staggering animation is a collection of animations that are issued with a slight delay in between each successive operation resulting in a
+ * curtain-like effect. The ngAnimate module (versions >=1.2) supports staggering animations and the stagger effect can be
+ * performed by creating a **ng-EVENT-stagger** CSS class and attaching that class to the base CSS class used for
+ * the animation. The style property expected within the stagger class can either be a **transition-delay** or an
+ * **animation-delay** property (or both if your animation contains both transitions and keyframe animations).
+ *
+ * ```css
+ * .my-animation.ng-enter {
+ * /* standard transition code */
+ * transition: 1s linear all;
+ * opacity:0;
+ * }
+ * .my-animation.ng-enter-stagger {
+ * /* this will have a 100ms delay between each successive leave animation */
+ * transition-delay: 0.1s;
+ *
+ * /* As of 1.4.4, this must always be set: it signals ngAnimate
+ * to not accidentally inherit a delay property from another CSS class */
+ * transition-duration: 0s;
+ * }
+ * .my-animation.ng-enter.ng-enter-active {
+ * /* standard transition styles */
+ * opacity:1;
+ * }
+ * ```
+ *
+ * Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations
+ * on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this
+ * are that each of the elements must have the same CSS className value as well as the same parent element. A stagger operation
+ * will also be reset if one or more animation frames have passed since the multiple calls to `$animate` were fired.
+ *
+ * The following code will issue the **ng-leave-stagger** event on the element provided:
+ *
+ * ```js
+ * var kids = parent.children();
+ *
+ * $animate.leave(kids[0]); //stagger index=0
+ * $animate.leave(kids[1]); //stagger index=1
+ * $animate.leave(kids[2]); //stagger index=2
+ * $animate.leave(kids[3]); //stagger index=3
+ * $animate.leave(kids[4]); //stagger index=4
+ *
+ * window.requestAnimationFrame(function() {
+ * //stagger has reset itself
+ * $animate.leave(kids[5]); //stagger index=0
+ * $animate.leave(kids[6]); //stagger index=1
+ *
+ * $scope.$digest();
+ * });
+ * ```
+ *
+ * Stagger animations are currently only supported within CSS-defined animations.
+ *
+ * ### The `ng-animate` CSS class
+ *
+ * When ngAnimate is animating an element it will apply the `ng-animate` CSS class to the element for the duration of the animation.
+ * This is a temporary CSS class and it will be removed once the animation is over (for both JavaScript and CSS-based animations).
+ *
+ * Therefore, animations can be applied to an element using this temporary class directly via CSS.
+ *
+ * ```css
+ * .zipper.ng-animate {
+ * transition:0.5s linear all;
+ * }
+ * .zipper.ng-enter {
+ * opacity:0;
+ * }
+ * .zipper.ng-enter.ng-enter-active {
+ * opacity:1;
+ * }
+ * .zipper.ng-leave {
+ * opacity:1;
+ * }
+ * .zipper.ng-leave.ng-leave-active {
+ * opacity:0;
+ * }
+ * ```
+ *
+ * (Note that the `ng-animate` CSS class is reserved and it cannot be applied on an element directly since ngAnimate will always remove
+ * the CSS class once an animation has completed.)
+ *
+ *
+ * ### The `ng-[event]-prepare` class
+ *
+ * This is a special class that can be used to prevent unwanted flickering / flash of content before
+ * the actual animation starts. The class is added as soon as an animation is initialized, but removed
+ * before the actual animation starts (after waiting for a $digest).
+ * It is also only added for *structural* animations (`enter`, `move`, and `leave`).
+ *
+ * In practice, flickering can appear when nesting elements with structural animations such as `ngIf`
+ * into elements that have class-based animations such as `ngClass`.
+ *
+ * ```html
+ *
+ *
+ *
+ *
+ *
+ * ```
+ *
+ * It is possible that during the `enter` animation, the `.message` div will be briefly visible before it starts animating.
+ * In that case, you can add styles to the CSS that make sure the element stays hidden before the animation starts:
+ *
+ * ```css
+ * .message.ng-enter-prepare {
+ * opacity: 0;
+ * }
+ *
+ * ```
+ *
+ * ## JavaScript-based Animations
+ *
+ * ngAnimate also allows for animations to be consumed by JavaScript code. The approach is similar to CSS-based animations (where there is a shared
+ * CSS class that is referenced in our HTML code) but in addition we need to register the JavaScript animation on the module. By making use of the
+ * `module.animation()` module function we can register the animation.
+ *
+ * Let's see an example of a enter/leave animation using `ngRepeat`:
+ *
+ * ```html
+ *
+ * {{ item }}
+ *
+ * ```
+ *
+ * See the **slide** CSS class? Let's use that class to define an animation that we'll structure in our module code by using `module.animation`:
+ *
+ * ```js
+ * myModule.animation('.slide', [function() {
+ * return {
+ * // make note that other events (like addClass/removeClass)
+ * // have different function input parameters
+ * enter: function(element, doneFn) {
+ * jQuery(element).fadeIn(1000, doneFn);
+ *
+ * // remember to call doneFn so that angular
+ * // knows that the animation has concluded
+ * },
+ *
+ * move: function(element, doneFn) {
+ * jQuery(element).fadeIn(1000, doneFn);
+ * },
+ *
+ * leave: function(element, doneFn) {
+ * jQuery(element).fadeOut(1000, doneFn);
+ * }
+ * }
+ * }]);
+ * ```
+ *
+ * The nice thing about JS-based animations is that we can inject other services and make use of advanced animation libraries such as
+ * greensock.js and velocity.js.
+ *
+ * If our animation code class-based (meaning that something like `ngClass`, `ngHide` and `ngShow` triggers it) then we can still define
+ * our animations inside of the same registered animation, however, the function input arguments are a bit different:
+ *
+ * ```html
+ *
+ * this box is moody
+ *
+ *
+ *
+ *
+ * ```
+ *
+ * ```js
+ * myModule.animation('.colorful', [function() {
+ * return {
+ * addClass: function(element, className, doneFn) {
+ * // do some cool animation and call the doneFn
+ * },
+ * removeClass: function(element, className, doneFn) {
+ * // do some cool animation and call the doneFn
+ * },
+ * setClass: function(element, addedClass, removedClass, doneFn) {
+ * // do some cool animation and call the doneFn
+ * }
+ * }
+ * }]);
+ * ```
+ *
+ * ## CSS + JS Animations Together
+ *
+ * AngularJS 1.4 and higher has taken steps to make the amalgamation of CSS and JS animations more flexible. However, unlike earlier versions of Angular,
+ * defining CSS and JS animations to work off of the same CSS class will not work anymore. Therefore the example below will only result in **JS animations taking
+ * charge of the animation**:
+ *
+ * ```html
+ *
+ * Slide in and out
+ *
+ * ```
+ *
+ * ```js
+ * myModule.animation('.slide', [function() {
+ * return {
+ * enter: function(element, doneFn) {
+ * jQuery(element).slideIn(1000, doneFn);
+ * }
+ * }
+ * }]);
+ * ```
+ *
+ * ```css
+ * .slide.ng-enter {
+ * transition:0.5s linear all;
+ * transform:translateY(-100px);
+ * }
+ * .slide.ng-enter.ng-enter-active {
+ * transform:translateY(0);
+ * }
+ * ```
+ *
+ * Does this mean that CSS and JS animations cannot be used together? Do JS-based animations always have higher priority? We can make up for the
+ * lack of CSS animations by using the `$animateCss` service to trigger our own tweaked-out, CSS-based animations directly from
+ * our own JS-based animation code:
+ *
+ * ```js
+ * myModule.animation('.slide', ['$animateCss', function($animateCss) {
+ * return {
+ * enter: function(element) {
+* // this will trigger `.slide.ng-enter` and `.slide.ng-enter-active`.
+ * return $animateCss(element, {
+ * event: 'enter',
+ * structural: true
+ * });
+ * }
+ * }
+ * }]);
+ * ```
+ *
+ * The nice thing here is that we can save bandwidth by sticking to our CSS-based animation code and we don't need to rely on a 3rd-party animation framework.
+ *
+ * The `$animateCss` service is very powerful since we can feed in all kinds of extra properties that will be evaluated and fed into a CSS transition or
+ * keyframe animation. For example if we wanted to animate the height of an element while adding and removing classes then we can do so by providing that
+ * data into `$animateCss` directly:
+ *
+ * ```js
+ * myModule.animation('.slide', ['$animateCss', function($animateCss) {
+ * return {
+ * enter: function(element) {
+ * return $animateCss(element, {
+ * event: 'enter',
+ * structural: true,
+ * addClass: 'maroon-setting',
+ * from: { height:0 },
+ * to: { height: 200 }
+ * });
+ * }
+ * }
+ * }]);
+ * ```
+ *
+ * Now we can fill in the rest via our transition CSS code:
+ *
+ * ```css
+ * /* the transition tells ngAnimate to make the animation happen */
+ * .slide.ng-enter { transition:0.5s linear all; }
+ *
+ * /* this extra CSS class will be absorbed into the transition
+ * since the $animateCss code is adding the class */
+ * .maroon-setting { background:red; }
+ * ```
+ *
+ * And `$animateCss` will figure out the rest. Just make sure to have the `done()` callback fire the `doneFn` function to signal when the animation is over.
+ *
+ * To learn more about what's possible be sure to visit the {@link ngAnimate.$animateCss $animateCss service}.
+ *
+ * ## Animation Anchoring (via `ng-animate-ref`)
+ *
+ * ngAnimate in AngularJS 1.4 comes packed with the ability to cross-animate elements between
+ * structural areas of an application (like views) by pairing up elements using an attribute
+ * called `ng-animate-ref`.
+ *
+ * Let's say for example we have two views that are managed by `ng-view` and we want to show
+ * that there is a relationship between two components situated in within these views. By using the
+ * `ng-animate-ref` attribute we can identify that the two components are paired together and we
+ * can then attach an animation, which is triggered when the view changes.
+ *
+ * Say for example we have the following template code:
+ *
+ * ```html
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * ```
+ *
+ * Now, when the view changes (once the link is clicked), ngAnimate will examine the
+ * HTML contents to see if there is a match reference between any components in the view
+ * that is leaving and the view that is entering. It will scan both the view which is being
+ * removed (leave) and inserted (enter) to see if there are any paired DOM elements that
+ * contain a matching ref value.
+ *
+ * The two images match since they share the same ref value. ngAnimate will now create a
+ * transport element (which is a clone of the first image element) and it will then attempt
+ * to animate to the position of the second image element in the next view. For the animation to
+ * work a special CSS class called `ng-anchor` will be added to the transported element.
+ *
+ * We can now attach a transition onto the `.banner.ng-anchor` CSS class and then
+ * ngAnimate will handle the entire transition for us as well as the addition and removal of
+ * any changes of CSS classes between the elements:
+ *
+ * ```css
+ * .banner.ng-anchor {
+ * /* this animation will last for 1 second since there are
+ * two phases to the animation (an `in` and an `out` phase) */
+ * transition:0.5s linear all;
+ * }
+ * ```
+ *
+ * We also **must** include animations for the views that are being entered and removed
+ * (otherwise anchoring wouldn't be possible since the new view would be inserted right away).
+ *
+ * ```css
+ * .view-animation.ng-enter, .view-animation.ng-leave {
+ * transition:0.5s linear all;
+ * position:fixed;
+ * left:0;
+ * top:0;
+ * width:100%;
+ * }
+ * .view-animation.ng-enter {
+ * transform:translateX(100%);
+ * }
+ * .view-animation.ng-leave,
+ * .view-animation.ng-enter.ng-enter-active {
+ * transform:translateX(0%);
+ * }
+ * .view-animation.ng-leave.ng-leave-active {
+ * transform:translateX(-100%);
+ * }
+ * ```
+ *
+ * Now we can jump back to the anchor animation. When the animation happens, there are two stages that occur:
+ * an `out` and an `in` stage. The `out` stage happens first and that is when the element is animated away
+ * from its origin. Once that animation is over then the `in` stage occurs which animates the
+ * element to its destination. The reason why there are two animations is to give enough time
+ * for the enter animation on the new element to be ready.
+ *
+ * The example above sets up a transition for both the in and out phases, but we can also target the out or
+ * in phases directly via `ng-anchor-out` and `ng-anchor-in`.
+ *
+ * ```css
+ * .banner.ng-anchor-out {
+ * transition: 0.5s linear all;
+ *
+ * /* the scale will be applied during the out animation,
+ * but will be animated away when the in animation runs */
+ * transform: scale(1.2);
+ * }
+ *
+ * .banner.ng-anchor-in {
+ * transition: 1s linear all;
+ * }
+ * ```
+ *
+ *
+ *
+ *
+ * ### Anchoring Demo
+ *
+
+
+ Home
+
+
+
+
+ .record {
+ display:block;
+ font-size:20px;
+ }
+ .profile {
+ background:black;
+ color:white;
+ font-size:100px;
+ }
+ .view-container {
+ position:relative;
+ }
+ .view-container > .view.ng-animate {
+ position:absolute;
+ top:0;
+ left:0;
+ width:100%;
+ min-height:500px;
+ }
+ .view.ng-enter, .view.ng-leave,
+ .record.ng-anchor {
+ transition:0.5s linear all;
+ }
+ .view.ng-enter {
+ transform:translateX(100%);
+ }
+ .view.ng-enter.ng-enter-active, .view.ng-leave {
+ transform:translateX(0%);
+ }
+ .view.ng-leave.ng-leave-active {
+ transform:translateX(-100%);
+ }
+ .record.ng-anchor-out {
+ background:red;
+ }
+
+
+ *
+ * ### How is the element transported?
+ *
+ * When an anchor animation occurs, ngAnimate will clone the starting element and position it exactly where the starting
+ * element is located on screen via absolute positioning. The cloned element will be placed inside of the root element
+ * of the application (where ng-app was defined) and all of the CSS classes of the starting element will be applied. The
+ * element will then animate into the `out` and `in` animations and will eventually reach the coordinates and match
+ * the dimensions of the destination element. During the entire animation a CSS class of `.ng-animate-shim` will be applied
+ * to both the starting and destination elements in order to hide them from being visible (the CSS styling for the class
+ * is: `visibility:hidden`). Once the anchor reaches its destination then it will be removed and the destination element
+ * will become visible since the shim class will be removed.
+ *
+ * ### How is the morphing handled?
+ *
+ * CSS Anchoring relies on transitions and keyframes and the internal code is intelligent enough to figure out
+ * what CSS classes differ between the starting element and the destination element. These different CSS classes
+ * will be added/removed on the anchor element and a transition will be applied (the transition that is provided
+ * in the anchor class). Long story short, ngAnimate will figure out what classes to add and remove which will
+ * make the transition of the element as smooth and automatic as possible. Be sure to use simple CSS classes that
+ * do not rely on DOM nesting structure so that the anchor element appears the same as the starting element (since
+ * the cloned element is placed inside of root element which is likely close to the body element).
+ *
+ * Note that if the root element is on the `` element then the cloned node will be placed inside of body.
+ *
+ *
+ * ## Using $animate in your directive code
+ *
+ * So far we've explored how to feed in animations into an Angular application, but how do we trigger animations within our own directives in our application?
+ * By injecting the `$animate` service into our directive code, we can trigger structural and class-based hooks which can then be consumed by animations. Let's
+ * imagine we have a greeting box that shows and hides itself when the data changes
+ *
+ * ```html
+ * Hi there
+ * ```
+ *
+ * ```js
+ * ngModule.directive('greetingBox', ['$animate', function($animate) {
+ * return function(scope, element, attrs) {
+ * attrs.$observe('active', function(value) {
+ * value ? $animate.addClass(element, 'on') : $animate.removeClass(element, 'on');
+ * });
+ * });
+ * }]);
+ * ```
+ *
+ * Now the `on` CSS class is added and removed on the greeting box component. Now if we add a CSS class on top of the greeting box element
+ * in our HTML code then we can trigger a CSS or JS animation to happen.
+ *
+ * ```css
+ * /* normally we would create a CSS class to reference on the element */
+ * greeting-box.on { transition:0.5s linear all; background:green; color:white; }
+ * ```
+ *
+ * The `$animate` service contains a variety of other methods like `enter`, `leave`, `animate` and `setClass`. To learn more about what's
+ * possible be sure to visit the {@link ng.$animate $animate service API page}.
+ *
+ *
+ * ## Callbacks and Promises
+ *
+ * When `$animate` is called it returns a promise that can be used to capture when the animation has ended. Therefore if we were to trigger
+ * an animation (within our directive code) then we can continue performing directive and scope related activities after the animation has
+ * ended by chaining onto the returned promise that animation method returns.
+ *
+ * ```js
+ * // somewhere within the depths of the directive
+ * $animate.enter(element, parent).then(function() {
+ * //the animation has completed
+ * });
+ * ```
+ *
+ * (Note that earlier versions of Angular prior to v1.4 required the promise code to be wrapped using `$scope.$apply(...)`. This is not the case
+ * anymore.)
+ *
+ * In addition to the animation promise, we can also make use of animation-related callbacks within our directives and controller code by registering
+ * an event listener using the `$animate` service. Let's say for example that an animation was triggered on our view
+ * routing controller to hook into that:
+ *
+ * ```js
+ * ngModule.controller('HomePageController', ['$animate', function($animate) {
+ * $animate.on('enter', ngViewElement, function(element) {
+ * // the animation for this route has completed
+ * }]);
+ * }])
+ * ```
+ *
+ * (Note that you will need to trigger a digest within the callback to get angular to notice any scope-related changes.)
+ */
+
+/**
+ * @ngdoc service
+ * @name $animate
+ * @kind object
+ *
+ * @description
+ * The ngAnimate `$animate` service documentation is the same for the core `$animate` service.
+ *
+ * Click here {@link ng.$animate to learn more about animations with `$animate`}.
+ */
+angular.module('ngAnimate', [])
+ .directive('ngAnimateSwap', ngAnimateSwapDirective)
+
+ .directive('ngAnimateChildren', $$AnimateChildrenDirective)
+ .factory('$$rAFScheduler', $$rAFSchedulerFactory)
+
+ .provider('$$animateQueue', $$AnimateQueueProvider)
+ .provider('$$animation', $$AnimationProvider)
+
+ .provider('$animateCss', $AnimateCssProvider)
+ .provider('$$animateCssDriver', $$AnimateCssDriverProvider)
+
+ .provider('$$animateJs', $$AnimateJsProvider)
+ .provider('$$animateJsDriver', $$AnimateJsDriverProvider);
+
+
+})(window, window.angular);
diff --git a/www/lib/ionic/js/angular/angular-animate.min.js b/www/lib/ionic/js/angular/angular-animate.min.js
new file mode 100644
index 0000000..57108b2
--- /dev/null
+++ b/www/lib/ionic/js/angular/angular-animate.min.js
@@ -0,0 +1,56 @@
+/*
+ AngularJS v1.5.3
+ (c) 2010-2016 Google, Inc. http://angularjs.org
+ License: MIT
+*/
+(function(E,w,Va){'use strict';function ya(a,b,c){if(!a)throw Ka("areq",b||"?",c||"required");return a}function za(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;ba(a)&&(a=a.join(" "));ba(b)&&(b=b.join(" "));return a+" "+b}function La(a){var b={};a&&(a.to||a.from)&&(b.to=a.to,b.from=a.from);return b}function V(a,b,c){var d="";a=ba(a)?a:a&&I(a)&&a.length?a.split(/\s+/):[];q(a,function(a,f){a&&0=a&&(a=h,h=0,b.push(e),e=[]);e.push(f.fn);f.children.forEach(function(a){h++;c.push(a)});a--}e.length&&b.push(e);return b}(c)}var l=[],w=Q(a);return function(s,x,v){function h(a){a=a.hasAttribute("ng-animate-ref")?[a]:a.querySelectorAll("[ng-animate-ref]");var b=[];q(a,function(a){var c=a.getAttribute("ng-animate-ref");c&&c.length&&b.push(a)});return b}function P(a){var b=[],c={};q(a,function(a,g){var d=A(a.element),k=0<=["enter","move"].indexOf(a.event),d=a.structural?
+h(d):[];if(d.length){var e=k?"to":"from";q(d,function(a){var b=a.getAttribute("ng-animate-ref");c[b]=c[b]||{};c[b][e]={animationID:g,element:H(a)}})}else b.push(a)});var d={},k={};q(c,function(c,h){var e=c.from,f=c.to;if(e&&f){var m=a[e.animationID],C=a[f.animationID],n=e.animationID.toString();if(!k[n]){var D=k[n]={structural:!0,beforeStart:function(){m.beforeStart();C.beforeStart()},close:function(){m.close();C.close()},classes:y(m.classes,C.classes),from:m,to:C,anchors:[]};D.classes.length?b.push(D):
+(b.push(m),b.push(C))}k[n].anchors.push({out:e.element,"in":f.element})}else e=e?e.animationID:f.animationID,f=e.toString(),d[f]||(d[f]=!0,b.push(a[e]))});return b}function y(a,b){a=a.split(" ");b=b.split(" ");for(var c=[],d=0;d=Q&&b>=L&&(H=!0,n())}function K(){function b(){if(!P){D(!1);q(y,function(a){m.style[a[0]]=a[1]});h(a,g);e.addClass(a,ga);if(p.recalculateTimingStyles){na=m.className+" "+fa;ia=w(m,na);B=v(m,na,ia);$=B.maxDelay;I=Math.max($,0);L=B.maxDuration;if(0===L){n();return}p.hasTransitions=0z.expectedEndTime)?r.cancel(z.timer):f.push(n)}K&&(l=r(c,l,!1),f[0]={timer:l,expectedEndTime:d},f.push(n),a.data("$$animateCss",f));
+if(ea.length)a.on(ea.join(" "),C);g.to&&(g.cleanupStyles&&Ga(G,m,Object.keys(g.to)),Ba(a,g))}}function c(){var b=a.data("$$animateCss");if(b){for(var d=1;d
+ *
+ * See {@link ngResource.$resource `$resource`} for usage.
+ */
+
+/**
+ * @ngdoc service
+ * @name $resource
+ * @requires $http
+ * @requires ng.$log
+ * @requires $q
+ * @requires ng.$timeout
+ *
+ * @description
+ * A factory which creates a resource object that lets you interact with
+ * [RESTful](http://en.wikipedia.org/wiki/Representational_State_Transfer) server-side data sources.
+ *
+ * The returned resource object has action methods which provide high-level behaviors without
+ * the need to interact with the low level {@link ng.$http $http} service.
+ *
+ * Requires the {@link ngResource `ngResource`} module to be installed.
+ *
+ * By default, trailing slashes will be stripped from the calculated URLs,
+ * which can pose problems with server backends that do not expect that
+ * behavior. This can be disabled by configuring the `$resourceProvider` like
+ * this:
+ *
+ * ```js
+ app.config(['$resourceProvider', function($resourceProvider) {
+ // Don't strip trailing slashes from calculated URLs
+ $resourceProvider.defaults.stripTrailingSlashes = false;
+ }]);
+ * ```
+ *
+ * @param {string} url A parameterized URL template with parameters prefixed by `:` as in
+ * `/user/:username`. If you are using a URL with a port number (e.g.
+ * `http://example.com:8080/api`), it will be respected.
+ *
+ * If you are using a url with a suffix, just add the suffix, like this:
+ * `$resource('http://example.com/resource.json')` or `$resource('http://example.com/:id.json')`
+ * or even `$resource('http://example.com/resource/:resource_id.:format')`
+ * If the parameter before the suffix is empty, :resource_id in this case, then the `/.` will be
+ * collapsed down to a single `.`. If you need this sequence to appear and not collapse then you
+ * can escape it with `/\.`.
+ *
+ * @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in
+ * `actions` methods. If a parameter value is a function, it will be executed every time
+ * when a param value needs to be obtained for a request (unless the param was overridden).
+ *
+ * Each key value in the parameter object is first bound to url template if present and then any
+ * excess keys are appended to the url search query after the `?`.
+ *
+ * Given a template `/path/:verb` and parameter `{verb:'greet', salutation:'Hello'}` results in
+ * URL `/path/greet?salutation=Hello`.
+ *
+ * If the parameter value is prefixed with `@` then the value for that parameter will be extracted
+ * from the corresponding property on the `data` object (provided when calling an action method).
+ * For example, if the `defaultParam` object is `{someParam: '@someProp'}` then the value of
+ * `someParam` will be `data.someProp`.
+ *
+ * @param {Object.