gh-pages 45ffed017569 cached
144 files
4.6 MB
1.2M tokens
1272 symbols
1 requests
Download .txt
Showing preview only (4,851K chars total). Download the full file or copy to clipboard to get everything.
Repository: ionic-in-action/ionic-demo-resort-app
Branch: gh-pages
Commit: 45ffed017569
Files: 144
Total size: 4.6 MB

Directory structure:
gitextract_hwmsr4en/

├── .bowerrc
├── .gitignore
├── LICENSE
├── README.md
├── bower.json
├── config.xml
├── gulpfile.js
├── hooks/
│   ├── README.md
│   └── after_prepare/
│       └── 010_add_platform_class.js
├── ionic.project
├── package.json
├── scss/
│   └── ionic.app.scss
└── www/
    ├── api/
    │   └── data.json
    ├── css/
    │   └── style.css
    ├── index.html
    ├── js/
    │   └── app.js
    ├── lib/
    │   ├── angular/
    │   │   ├── .bower.json
    │   │   ├── README.md
    │   │   ├── angular-csp.css
    │   │   ├── angular.js
    │   │   ├── angular.min.js.gzip
    │   │   └── bower.json
    │   ├── angular-animate/
    │   │   ├── .bower.json
    │   │   ├── README.md
    │   │   ├── angular-animate.js
    │   │   └── bower.json
    │   ├── angular-sanitize/
    │   │   ├── .bower.json
    │   │   ├── README.md
    │   │   ├── angular-sanitize.js
    │   │   └── bower.json
    │   ├── angular-ui-router/
    │   │   ├── .bower.json
    │   │   ├── CHANGELOG.md
    │   │   ├── LICENSE
    │   │   ├── README.md
    │   │   ├── bower.json
    │   │   ├── release/
    │   │   │   └── angular-ui-router.js
    │   │   └── src/
    │   │       ├── common.js
    │   │       ├── compat.js
    │   │       ├── resolve.js
    │   │       ├── state.js
    │   │       ├── stateDirectives.js
    │   │       ├── stateFilters.js
    │   │       ├── templateFactory.js
    │   │       ├── urlMatcherFactory.js
    │   │       ├── urlRouter.js
    │   │       ├── view.js
    │   │       ├── viewDirective.js
    │   │       └── viewScroll.js
    │   ├── angularfire/
    │   │   ├── .bower.json
    │   │   ├── README.md
    │   │   ├── bower.json
    │   │   └── dist/
    │   │       └── angularfire.js
    │   ├── collide/
    │   │   ├── .bower.json
    │   │   ├── .gitignore
    │   │   ├── README.md
    │   │   ├── bower.json
    │   │   ├── collide.js
    │   │   ├── package.json
    │   │   ├── test/
    │   │   │   ├── animator.spec.js
    │   │   │   ├── core/
    │   │   │   │   └── timeline.spec.js
    │   │   │   └── util/
    │   │   │       └── simple-emitter.spec.js
    │   │   └── test.html
    │   ├── firebase/
    │   │   ├── .bower.json
    │   │   ├── LICENSE
    │   │   ├── README.md
    │   │   ├── bower.json
    │   │   ├── firebase-debug.js
    │   │   └── firebase.js
    │   ├── firebase-simple-login/
    │   │   ├── .bower.json
    │   │   ├── CHANGELOG.md
    │   │   ├── LICENSE
    │   │   ├── README.md
    │   │   ├── firebase-simple-login-debug.js
    │   │   └── firebase-simple-login.js
    │   ├── ionic/
    │   │   ├── .bower.json
    │   │   ├── README.md
    │   │   ├── bower.json
    │   │   ├── css/
    │   │   │   └── ionic.css
    │   │   ├── js/
    │   │   │   ├── ionic-angular.js
    │   │   │   ├── ionic.bundle.js
    │   │   │   └── ionic.js
    │   │   └── scss/
    │   │       ├── _action-sheet.scss
    │   │       ├── _animations.scss
    │   │       ├── _backdrop.scss
    │   │       ├── _badge.scss
    │   │       ├── _bar.scss
    │   │       ├── _button-bar.scss
    │   │       ├── _button.scss
    │   │       ├── _checkbox.scss
    │   │       ├── _form.scss
    │   │       ├── _grid.scss
    │   │       ├── _items.scss
    │   │       ├── _list.scss
    │   │       ├── _loading.scss
    │   │       ├── _menu.scss
    │   │       ├── _mixins.scss
    │   │       ├── _modal.scss
    │   │       ├── _platform.scss
    │   │       ├── _popover.scss
    │   │       ├── _popup.scss
    │   │       ├── _progress.scss
    │   │       ├── _radio.scss
    │   │       ├── _range.scss
    │   │       ├── _reset.scss
    │   │       ├── _scaffolding.scss
    │   │       ├── _select.scss
    │   │       ├── _slide-box.scss
    │   │       ├── _split-pane.scss
    │   │       ├── _tabs.scss
    │   │       ├── _toggle.scss
    │   │       ├── _type.scss
    │   │       ├── _util.scss
    │   │       ├── _variables.scss
    │   │       ├── ionic.scss
    │   │       └── ionicons/
    │   │           ├── _ionicons-animation.scss
    │   │           ├── _ionicons-font.scss
    │   │           ├── _ionicons-icons.scss
    │   │           ├── _ionicons-variables.scss
    │   │           └── ionicons.scss
    │   └── mockfirebase/
    │       ├── .bower.json
    │       ├── CONTRIBUTING.md
    │       ├── MAINTAINING.md
    │       ├── README.md
    │       ├── bower.json
    │       └── dist/
    │           └── mockfirebase.js
    └── views/
        ├── about/
        │   └── about.html
        ├── events/
        │   ├── events.html
        │   └── events.js
        ├── food/
        │   ├── food.html
        │   ├── food.js
        │   └── preview.html
        ├── home/
        │   ├── comments.html
        │   ├── home.html
        │   └── home.js
        ├── local/
        │   ├── beaches.html
        │   ├── food.html
        │   ├── local.html
        │   └── sights.html
        ├── reservation/
        │   ├── reservation.html
        │   └── reservation.js
        ├── tour/
        │   ├── tour.html
        │   └── tour.js
        └── weather/
            ├── weather.html
            └── weather.js

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

================================================
FILE: .bowerrc
================================================
{
  "directory": "www/lib"
}


================================================
FILE: .gitignore
================================================
# Specifies intentionally untracked files to ignore when using Git
# http://git-scm.com/docs/gitignore

node_modules/
platforms/
plugins/


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2014
Jeremy Wilken (Gnome on the run)

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

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

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


================================================
FILE: README.md
================================================
# Ionic Framework Demo App

This is a demo app built with the Ionic Framework that you can preview in the browser or clone and run locally on an emulator or device.

# View it now

https://ionic-in-action.github.io/ionic-demo-resort-app/www/

# Run locally

This assumes you already have an emulator setup for iOS or Android. Substitute `ios` for `android` below to use Android.

    npm install -g ionic cordova
    git clone https://github.com/ionic-in-action/ionic-demo-resort-app.git
    cd ionic-demo-resort-app
    ionic platform add ios
    ionic emulate ios

# LICENSE

Ionic is licensed under the MIT Open Source license. For more information, see the LICENSE file in this repository.


================================================
FILE: bower.json
================================================
{
  "name": "ionic-in-action-demo",
  "private": "true",
  "dependencies": {
    "ionic": "driftyco/ionic-bower#1.0.0-beta.12",
    "firebase": "~1.0.21",
    "angularfire": "~0.8.2"
  }
}


================================================
FILE: config.xml
================================================
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<widget id="com.ionicinaction.demo" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
  <name>Ionic In Action</name>
  <description>
    Demo of Ionic.
    </description>
  <author email="author@ionicinaction.com" href="http://ionicinaction.com/">
      Ionic in Action
    </author>
  <content src="index.html"/>
  <access origin="*"/>
  <preference name="webviewbounce" value="false"/>
  <preference name="UIWebViewBounce" value="false"/>
  <preference name="DisallowOverscroll" value="true"/>
  <preference name="BackupWebStorage" value="none"/>
  <preference name="SplashScreen" value="screen" />
  <preference name="SplashScreenDelay" value="10000" />
  <feature name="StatusBar">
    <param name="ios-package" value="CDVStatusBar" onload="true"/>
  </feature>
  <icon src="media/icons/icon.png" />
</widget>


================================================
FILE: gulpfile.js
================================================
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())
    .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();
});


================================================
FILE: hooks/README.md
================================================
<!--
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
-->
# 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/)



================================================
FILE: hooks/after_prepare/010_add_platform_class.js
================================================
#!/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(/<body(?=[\s>])(.*?)>/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<platforms.length; x++) {
    // open up the index.html file at the www root
    try {
      var platform = platforms[x].trim().toLowerCase();
      var indexPath;

      if(platform == 'android') {
        indexPath = path.join('platforms', platform, 'assets', 'www', 'index.html');
      } else {
        indexPath = path.join('platforms', platform, 'www', 'index.html');
      }

      if(fs.existsSync(indexPath)) {
        addPlatformBodyTag(indexPath, platform);
      }

    } catch(e) {
      process.stdout.write(e);
    }
  }

}


================================================
FILE: ionic.project
================================================
{
  "name": "ionic-in-action-demo",
  "app_id": ""
}


================================================
FILE: package.json
================================================
{
  "name": "ionic-in-action-demo",
  "version": "1.0.0",
  "description": "Ionic in Action Demo",
  "dependencies": {
    "gulp": "^3.5.6",
    "gulp-sass": "^0.7.1",
    "gulp-concat": "^2.2.0",
    "gulp-minify-css": "^0.3.0",
    "gulp-rename": "^1.2.0"
  },
  "devDependencies": {
    "bower": "^1.3.3",
    "gulp-util": "^2.2.14",
    "shelljs": "^0.3.0"
  }
}


================================================
FILE: scss/ionic.app.scss
================================================
/*
To customize the look and feel of Ionic, you can override the variables
in ionic's _variables.scss file.

For example, you might change some of the default colors:

$light:                           #fff !default;
$stable:                          #f8f8f8 !default;
$positive:                        #4a87ee !default;
$calm:                            #43cee6 !default;
$balanced:                        #66cc33 !default;
$energized:                       #f0b840 !default;
$assertive:                       #ef4e3a !default;
$royal:                           #8a6de9 !default;
$dark:                            #444 !default;
*/

// The path for our ionicons font files, relative to the built CSS in www/css
$ionicons-font-path: "../lib/ionic/fonts" !default;

// Include all of Ionic
@import "www/lib/ionic/scss/ionic";



================================================
FILE: www/api/data.json
================================================
{
  "menu": [
    {
      "meal": "Breakfast",
      "items": [
        { "item": "Eggs", "price": 2.50 },
        { "item": "Cereal", "price": 3.00 },
        { "item": "Fruit", "price": 4.00 },
        { "item": "Pancakes", "price": 5.50 },
        { "item": "Bacon", "price": 4.50 }
      ]
    },
    {
      "meal": "Lunch",
      "items": [
        { "item": "Grilled Cheese", "price": 3.50 },
        { "item": "Salad", "price": 4.50 },
        { "item": "Hamburger & Fries", "price": 6.50 },
        { "item": "Pork Sandwich & Fries", "price": 6.50 },
        { "item": "Fish Sandwich & Fries", "price": 5.50 },
        { "item": "Tofu Sandwish & Vegitables", "price": 5.50 },
        { "item": "Chicken Fingers", "price": 4.50 }
      ]
    },
    {
      "meal": "Dinner",
      "items": [
        { "item": "Chicken Fried Chicken", "price": 8.50 },
        { "item": "Chicken Parmesean", "price": 7.50 },
        { "item": "Steak & Vegitables", "price": 11.50 },
        { "item": "Lobster & Rice", "price": 14.50 },
        { "item": "Shrimp Scampi & Pasta", "price": 12.50 },
        { "item": "Tofu Pasta Primavera", "price": 10.50 },
        { "item": "10\" Pizza", "price": 7.50 }
      ]
    },
    {
      "meal": "Dessert",
      "items": [
        { "item": "Ice Cream", "price": 3.50 },
        { "item": "Cake", "price": 4.50 },
        { "item": "Strawberry Sundae", "price": 4.50 }
      ]
    }
  ],
  "events": [
    {
      "day": "Sunday",
      "events": [
        { "day": "Sunday", "time": "8:00am",  "location": "Fitness Center", "event": "Morning Yoga" },
        { "day": "Sunday", "time": "10:00am", "location": "Beach", "event": "Surfing Lessons" },
        { "day": "Sunday", "time": "11:00am", "location": "Community Center", "event": "Bingo" },
        { "day": "Sunday", "time": "1:00pm",  "location": "Community Center", "event": "Ice Cream Social" },
        { "day": "Sunday", "time": "2:00pm",  "location": "Community Center", "event": "Wine Tasting" },
        { "day": "Sunday", "time": "4:00pm",  "location": "Front Desk", "event": "Resort Tour" },
        { "day": "Sunday", "time": "6:00pm",  "location": "Pool 2", "event": "Sing and Swim" },
        { "day": "Sunday", "time": "8:00pm",  "location": "Dock", "event": "Sunset Cruise" }
      ]
    },
    {
      "day": "Monday",
      "events": [
        { "day": "Monday", "time": "8:00am",  "location": "Fitness Center", "event": "Morning Training" },
        { "day": "Monday", "time": "10:00am", "location": "Beach", "event": "Snorkeling Lessons" },
        { "day": "Monday", "time": "11:00am", "location": "Community Center", "event": "Bingo" },
        { "day": "Monday", "time": "1:00pm",  "location": "Community Center", "event": "Lawn Darts" },
        { "day": "Monday", "time": "2:00pm",  "location": "Community Center", "event": "Beer Tasting" },
        { "day": "Monday", "time": "4:00pm",  "location": "Front Desk", "event": "Resort Tour" },
        { "day": "Monday", "time": "6:00pm",  "location": "Community Center", "event": "Poker Tournament" },
        { "day": "Monday", "time": "8:00pm",  "location": "Pool 3", "event": "Swim in Kids Movie" }
      ]
    },
    {
      "day": "Tuesday",
      "events": [
        { "day": "Tuesday", "time": "8:00am",  "location": "Fitness Center", "event": "Morning Yoga" },
        { "day": "Tuesday", "time": "10:00am", "location": "Beach", "event": "Scuba Lessons" },
        { "day": "Tuesday", "time": "11:00am", "location": "Community Center", "event": "Build Your Own Pizza" },
        { "day": "Tuesday", "time": "1:00pm",  "location": "Community Center", "event": "Ice Cream Social" },
        { "day": "Tuesday", "time": "2:00pm",  "location": "Pool 1", "event": "Adults Only Swim" },
        { "day": "Tuesday", "time": "4:00pm",  "location": "Front Desk", "event": "Resort Tour" },
        { "day": "Tuesday", "time": "6:00pm",  "location": "Pool 3", "event": "Cannonball Competition" },
        { "day": "Tuesday", "time": "8:00pm",  "location": "Dock", "event": "Sunset Cruise" }
      ]
    },
    {
      "day": "Wednesday",
      "events": [
        { "day": "Tuesday", "time": "8:00am",  "location": "Fitness Center", "event": "Morning Resort Run" },
        { "day": "Tuesday", "time": "10:00am", "location": "Beach", "event": "Wildlife Tour" },
        { "day": "Tuesday", "time": "11:00am", "location": "Community Center", "event": "Tennis Challenge" },
        { "day": "Tuesday", "time": "1:00pm",  "location": "Pool 2", "event": "Adults Only Swim" },
        { "day": "Tuesday", "time": "2:00pm",  "location": "Community Center", "event": "Cheese Tasting" },
        { "day": "Tuesday", "time": "4:00pm",  "location": "Front Desk", "event": "Resort Tour" },
        { "day": "Tuesday", "time": "6:00pm",  "location": "Pool 3", "event": "Happy Hour" },
        { "day": "Tuesday", "time": "8:00pm",  "location": "Beach", "event": "Crab Search" }
      ]
    },
    {
      "day": "Thursday",
      "events": [
        { "day": "Monday", "time": "8:00am",  "location": "Fitness Center", "event": "Morning Yoga" },
        { "day": "Monday", "time": "10:00am", "location": "Community Center", "event": "Build and Fly Kites" },
        { "day": "Monday", "time": "11:00am", "location": "Community Center", "event": "Hole in One Challenge" },
        { "day": "Monday", "time": "1:00pm",  "location": "Community Center", "event": "Cooking Local Cuisine" },
        { "day": "Monday", "time": "2:00pm",  "location": "Community Center", "event": "Basketball" },
        { "day": "Monday", "time": "4:00pm",  "location": "Front Desk", "event": "Resort Tour" },
        { "day": "Monday", "time": "6:00pm",  "location": "Community Center", "event": "Hay Ride" },
        { "day": "Monday", "time": "8:00pm",  "location": "Pool 3", "event": "Live Music" }
      ]
    },
    {
      "day": "Friday",
      "events": [
        { "day": "Monday", "time": "8:00am",  "location": "Fitness Center", "event": "Morning P90X" },
        { "day": "Monday", "time": "10:00am", "location": "Community Center", "event": "Kayaking" },
        { "day": "Monday", "time": "11:00am", "location": "Community Center", "event": "Kids Crafts" },
        { "day": "Monday", "time": "1:00pm",  "location": "Community Center", "event": "Driving Range Contest" },
        { "day": "Monday", "time": "2:00pm",  "location": "Pool 1", "event": "Adults Only Swim" },
        { "day": "Monday", "time": "4:00pm",  "location": "Front Desk", "event": "Resort Tour" },
        { "day": "Monday", "time": "6:00pm",  "location": "Community Center", "event": "Family Style Dinner" },
        { "day": "Monday", "time": "8:00pm",  "location": "Pool 3", "event": "Live Music" }
      ]
    },
    {
      "day": "Saturday",
      "events": [
        { "day": "Sunday", "time": "8:00am",  "location": "Fitness Center", "event": "Morning Fitness" },
        { "day": "Sunday", "time": "10:00am", "location": "Clubhouse", "event": "Golf Scramble" },
        { "day": "Sunday", "time": "11:00am", "location": "Community Center", "event": "Bridge" },
        { "day": "Sunday", "time": "1:00pm",  "location": "Community Center", "event": "Sand Castle Competition" },
        { "day": "Sunday", "time": "2:00pm",  "location": "Community Center", "event": "Happy Hour" },
        { "day": "Sunday", "time": "4:00pm",  "location": "Front Desk", "event": "Resort Tour" },
        { "day": "Sunday", "time": "6:00pm",  "location": "Beach", "event": "BBQ" },
        { "day": "Sunday", "time": "8:00pm",  "location": "Dock", "event": "Stargazing Cruise" }
      ]
    }
  ]
}


================================================
FILE: www/css/style.css
================================================
.tour {
  background-color: #ffefd6;
  text-align: center;
  position: absolute;
  z-index: 100;
}
.tour .slider {
  height: 100%;
  padding-top: 80px;
}
.tour img {
  max-height: 70%;
}
.comments .button-block {
  margin: 0;
}
.room-service ion-header-bar {
  margin-top: 44px;
}
.room-service ion-content {
  top: 88px;
}
.item.button-block {
  margin-top: 0;
  border-radius: 0;
}


================================================
FILE: www/index.html
================================================
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
    <title></title>

    <link href="lib/ionic/css/ionic.css" rel="stylesheet">
    <link href="css/style.css" rel="stylesheet">

    <!-- ionic/angularjs js -->
    <script src="lib/ionic/js/ionic.bundle.js"></script>

    <!-- firebase -->
    <script src="lib/firebase/firebase.js"></script>
    <script src="lib/angularfire/dist/angularfire.js"></script>

    <!-- cordova script (this will be a 404 during development) -->
    <script src="cordova.js"></script>

    <!-- your app's js -->
    <script src="js/app.js"></script>
    <script src="views/events/events.js"></script>
    <script src="views/food/food.js"></script>
    <script src="views/home/home.js"></script>
    <script src="views/reservation/reservation.js"></script>
    <script src="views/tour/tour.js"></script>
    <script src="views/weather/weather.js"></script>
  </head>
  <body ng-app="App">

    <ion-side-menus>
      <ion-side-menu-content>
        <ion-nav-bar class="bar-positive nav-title-slide-ios7">
          <button menu-toggle="left" class="button button-icon icon ion-navicon"></button>
        </ion-nav-bar>
        <ion-nav-view></ion-nav-view>
      </ion-side-menu-content>

      <ion-side-menu side="left">
        <ion-header-bar class="bar-dark">
          <h1 class="title">Sunshine Resort</h1>
        </ion-header-bar>
        <ion-content has-header="true">
          <ion-list>
            <ion-item href="#/" class="item-icon-left" menu-close><i class="icon ion-home"></i> Home</ion-item>
            <ion-item href="#/reservation" class="item-icon-left" menu-close><i class="icon ion-folder"></i> Reservation</ion-item>
            <ion-item href="tel:8005555555" class="item-icon-left" menu-close><i class="icon ion-ios7-telephone"></i> Call Concierge</ion-item>
            <ion-item href="#/weather" class="item-icon-left" menu-close><i class="icon ion-ios7-partlysunny"></i> Weather</ion-item>
            <ion-item href="#/events" class="item-icon-left" menu-close><i class="icon ion-calendar"></i> Events</ion-item>
            <ion-item href="#/local/food" class="item-icon-left" menu-close> <i class="icon ion-location"></i> Local Places</ion-item>
            <ion-item href="#/food" class="item-icon-left" menu-close> <i class="icon ion-fork"></i> Order Room Service</ion-item>
            <ion-item href="#/about" class="item-icon-left" menu-close> <i class="icon ion-ios7-information"></i> About</ion-item>
          </ion-list>
        </ion-content>
      </ion-side-menu>

    </ion-side-menus>
  </body>
</html>


================================================
FILE: www/js/app.js
================================================
angular.module('App', ['ionic', 'firebase'])

.config(function ($stateProvider, $urlRouterProvider) {
  $stateProvider
    .state('tour', {
      url: '/tour',
      templateUrl: 'views/tour/tour.html',
      controller: 'TourCtrl'
    })
    .state('home', {
      url: '/',
      templateUrl: 'views/home/home.html',
      controller: 'HomeCtrl'
    })
    .state('about', {
      url: '/about',
      templateUrl: 'views/about/about.html'
    })
    .state('reservation', {
      url: '/reservation',
      templateUrl: 'views/reservation/reservation.html',
      controller: 'ReservationCtrl'
    })
    .state('events', {
      url: '/events',
      templateUrl: 'views/events/events.html',
      controller: 'EventsCtrl'
    })
    .state('food', {
      url: '/food',
      templateUrl: 'views/food/food.html',
      controller: 'FoodCtrl'
    })
    .state('weather', {
      url: '/weather',
      templateUrl: 'views/weather/weather.html',
      controller: 'WeatherCtrl'
    })
    .state('local', {
      abstract: true,
      url: '/local',
      templateUrl: 'views/local/local.html'
    })
    .state('local.food', {
      url: '/food',
      views: {
        'local-food': {
          templateUrl: 'views/local/food.html'
        }
      }
    })
    .state('local.beaches', {
      url: '/beaches',
      views: {
        'local-beaches': {
          templateUrl: 'views/local/beaches.html'
        }
      }
    })
    .state('local.sights', {
      url: '/sights',
      views: {
        'local-sights': {
          templateUrl: 'views/local/sights.html'
        }
      }
    });

  $urlRouterProvider.otherwise('/');
})

.run(function($ionicPlatform, $location) {
  $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.Keyboard) {
      cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
    }
    if(window.StatusBar) {
      StatusBar.styleDefault();
    }
  });

  var firstVisit = localStorage.getItem('firstVisit');
  if (!firstVisit) {
    $location.url('/tour');
  }
})

.factory('EventsService', function ($firebase) {
  var firebase = new Firebase('https://ionic-in-action-demo.firebaseio.com/events');
  var service = $firebase(firebase);
  return service;
})

.factory('MenuService', function ($firebase) {
  var firebase = new Firebase('https://ionic-in-action-demo.firebaseio.com/menu');
  var service = $firebase(firebase);
  return service;
})

.controller('NavbarCtrl', function ($scope, $ionicSideMenuDelegate) {

  $scope.openMenu = function () {
    $ionicSideMenuDelegate.toggleLeft();
  };
});


================================================
FILE: www/lib/angular/.bower.json
================================================
{
  "name": "angular",
  "version": "1.2.24",
  "main": "./angular.js",
  "dependencies": {},
  "homepage": "https://github.com/angular/bower-angular",
  "_release": "1.2.24",
  "_resolution": {
    "type": "version",
    "tag": "v1.2.24",
    "commit": "e2acb3e79e8f571bd36e12f31c7b2587e0c9dff3"
  },
  "_source": "git://github.com/angular/bower-angular.git",
  "_target": "~1.2.17",
  "_originalSource": "angular"
}

================================================
FILE: www/lib/angular/README.md
================================================
# bower-angular

This repo is for distribution on `bower`. The source for this module is in the
[main AngularJS repo](https://github.com/angular/angular.js).
Please file issues and pull requests against that repo.

## Install

Install with `bower`:

```shell
bower install angular
```

Add a `<script>` to your `index.html`:

```html
<script src="/bower_components/angular/angular.js"></script>
```

## Documentation

Documentation is available on the
[AngularJS docs site](http://docs.angularjs.org/).

## License

The MIT License

Copyright (c) 2010-2012 Google, Inc. http://angularjs.org

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

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

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


================================================
FILE: www/lib/angular/angular-csp.css
================================================
/* Include this file in your html if you are using the CSP mode. */

@charset "UTF-8";

[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak],
.ng-cloak, .x-ng-cloak,
.ng-hide {
  display: none !important;
}

ng\:form {
  display: block;
}

.ng-animate-block-transitions {
  transition:0s all!important;
  -webkit-transition:0s all!important;
}

/* show the element during a show/hide animation when the
 * animation is ongoing, but the .ng-hide class is active */
.ng-hide-add-active, .ng-hide-remove {
  display: block!important;
}


================================================
FILE: www/lib/angular/angular.js
================================================
/**
 * @license AngularJS v1.2.24
 * (c) 2010-2014 Google, Inc. http://angularjs.org
 * License: MIT
 */
(function(window, document, undefined) {'use strict';

/**
 * @description
 *
 * This object provides a utility for producing rich Error messages within
 * Angular. It can be called as follows:
 *
 * var exampleMinErr = minErr('example');
 * throw exampleMinErr('one', 'This {0} is {1}', foo, bar);
 *
 * The above creates an instance of minErr in the example namespace. The
 * resulting error will have a namespaced error code of example.one.  The
 * resulting error will replace {0} with the value of foo, and {1} with the
 * value of bar. The object is not restricted in the number of arguments it can
 * take.
 *
 * If fewer arguments are specified than necessary for interpolation, the extra
 * interpolation markers will be preserved in the final string.
 *
 * Since data will be parsed statically during a build step, some restrictions
 * are applied with respect to how minErr instances are created and called.
 * Instances should have names of the form namespaceMinErr for a minErr created
 * using minErr('namespace') . Error codes, namespaces and template strings
 * should all be static strings, not variables or general expressions.
 *
 * @param {string} module The namespace to use for the new minErr instance.
 * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance
 */

function minErr(module) {
  return function () {
    var code = arguments[0],
      prefix = '[' + (module ? module + ':' : '') + code + '] ',
      template = arguments[1],
      templateArgs = arguments,
      stringify = function (obj) {
        if (typeof obj === 'function') {
          return obj.toString().replace(/ \{[\s\S]*$/, '');
        } else if (typeof obj === 'undefined') {
          return 'undefined';
        } else if (typeof obj !== 'string') {
          return JSON.stringify(obj);
        }
        return obj;
      },
      message, i;

    message = prefix + template.replace(/\{\d+\}/g, function (match) {
      var index = +match.slice(1, -1), arg;

      if (index + 2 < templateArgs.length) {
        arg = templateArgs[index + 2];
        if (typeof arg === 'function') {
          return arg.toString().replace(/ ?\{[\s\S]*$/, '');
        } else if (typeof arg === 'undefined') {
          return 'undefined';
        } else if (typeof arg !== 'string') {
          return toJson(arg);
        }
        return arg;
      }
      return match;
    });

    message = message + '\nhttp://errors.angularjs.org/1.2.24/' +
      (module ? module + '/' : '') + code;
    for (i = 2; i < arguments.length; i++) {
      message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
        encodeURIComponent(stringify(arguments[i]));
    }

    return new Error(message);
  };
}

/* We need to tell jshint what variables are being exported */
/* global angular: true,
    msie: true,
    jqLite: true,
    jQuery: true,
    slice: true,
    push: true,
    toString: true,
    ngMinErr: true,
    angularModule: true,
    nodeName_: true,
    uid: true,
    VALIDITY_STATE_PROPERTY: true,

    lowercase: true,
    uppercase: true,
    manualLowercase: true,
    manualUppercase: true,
    nodeName_: true,
    isArrayLike: true,
    forEach: true,
    sortedKeys: true,
    forEachSorted: true,
    reverseParams: true,
    nextUid: true,
    setHashKey: true,
    extend: true,
    int: true,
    inherit: true,
    noop: true,
    identity: true,
    valueFn: true,
    isUndefined: true,
    isDefined: true,
    isObject: true,
    isString: true,
    isNumber: true,
    isDate: true,
    isArray: true,
    isFunction: true,
    isRegExp: true,
    isWindow: true,
    isScope: true,
    isFile: true,
    isBlob: true,
    isBoolean: true,
    isPromiseLike: true,
    trim: true,
    isElement: true,
    makeMap: true,
    map: true,
    size: true,
    includes: true,
    indexOf: true,
    arrayRemove: true,
    isLeafNode: true,
    copy: true,
    shallowCopy: true,
    equals: true,
    csp: true,
    concat: true,
    sliceArgs: true,
    bind: true,
    toJsonReplacer: true,
    toJson: true,
    fromJson: true,
    toBoolean: true,
    startingTag: true,
    tryDecodeURIComponent: true,
    parseKeyValue: true,
    toKeyValue: true,
    encodeUriSegment: true,
    encodeUriQuery: true,
    angularInit: true,
    bootstrap: true,
    snake_case: true,
    bindJQuery: true,
    assertArg: true,
    assertArgFn: true,
    assertNotHasOwnProperty: true,
    getter: true,
    getBlockElements: true,
    hasOwnProperty: true,
*/

////////////////////////////////////

/**
 * @ngdoc module
 * @name ng
 * @module ng
 * @description
 *
 * # ng (core module)
 * The ng module is loaded by default when an AngularJS application is started. The module itself
 * contains the essential components for an AngularJS application to function. The table below
 * lists a high level breakdown of each of the services/factories, filters, directives and testing
 * components available within this core module.
 *
 * <div doc-module-components="ng"></div>
 */

// The name of a form control's ValidityState property.
// This is used so that it's possible for internal tests to create mock ValidityStates.
var VALIDITY_STATE_PROPERTY = 'validity';

/**
 * @ngdoc function
 * @name angular.lowercase
 * @module ng
 * @kind function
 *
 * @description Converts the specified string to lowercase.
 * @param {string} string String to be converted to lowercase.
 * @returns {string} Lowercased string.
 */
var lowercase = function(string){return isString(string) ? string.toLowerCase() : string;};
var hasOwnProperty = Object.prototype.hasOwnProperty;

/**
 * @ngdoc function
 * @name angular.uppercase
 * @module ng
 * @kind function
 *
 * @description Converts the specified string to uppercase.
 * @param {string} string String to be converted to uppercase.
 * @returns {string} Uppercased string.
 */
var uppercase = function(string){return isString(string) ? string.toUpperCase() : string;};


var manualLowercase = function(s) {
  /* jshint bitwise: false */
  return isString(s)
      ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);})
      : s;
};
var manualUppercase = function(s) {
  /* jshint bitwise: false */
  return isString(s)
      ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);})
      : s;
};


// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish
// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods
// with correct but slower alternatives.
if ('i' !== 'I'.toLowerCase()) {
  lowercase = manualLowercase;
  uppercase = manualUppercase;
}


var /** holds major version number for IE or NaN for real browsers */
    msie,
    jqLite,           // delay binding since jQuery could be loaded after us.
    jQuery,           // delay binding
    slice             = [].slice,
    push              = [].push,
    toString          = Object.prototype.toString,
    ngMinErr          = minErr('ng'),

    /** @name angular */
    angular           = window.angular || (window.angular = {}),
    angularModule,
    nodeName_,
    uid               = ['0', '0', '0'];

/**
 * IE 11 changed the format of the UserAgent string.
 * See http://msdn.microsoft.com/en-us/library/ms537503.aspx
 */
msie = int((/msie (\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]);
if (isNaN(msie)) {
  msie = int((/trident\/.*; rv:(\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]);
}


/**
 * @private
 * @param {*} obj
 * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments,
 *                   String ...)
 */
function isArrayLike(obj) {
  if (obj == null || isWindow(obj)) {
    return false;
  }

  var length = obj.length;

  if (obj.nodeType === 1 && length) {
    return true;
  }

  return isString(obj) || isArray(obj) || length === 0 ||
         typeof length === 'number' && length > 0 && (length - 1) in obj;
}

/**
 * @ngdoc function
 * @name angular.forEach
 * @module ng
 * @kind function
 *
 * @description
 * Invokes the `iterator` function once for each item in `obj` collection, which can be either an
 * object or an array. The `iterator` function is invoked with `iterator(value, key)`, where `value`
 * is the value of an object property or an array element and `key` is the object property key or
 * array element index. Specifying a `context` for the function is optional.
 *
 * It is worth noting that `.forEach` does not iterate over inherited properties because it filters
 * using the `hasOwnProperty` method.
 *
   ```js
     var values = {name: 'misko', gender: 'male'};
     var log = [];
     angular.forEach(values, function(value, key) {
       this.push(key + ': ' + value);
     }, log);
     expect(log).toEqual(['name: misko', 'gender: male']);
   ```
 *
 * @param {Object|Array} obj Object to iterate over.
 * @param {Function} iterator Iterator function.
 * @param {Object=} context Object to become context (`this`) for the iterator function.
 * @returns {Object|Array} Reference to `obj`.
 */
function forEach(obj, iterator, context) {
  var key;
  if (obj) {
    if (isFunction(obj)) {
      for (key in obj) {
        // Need to check if hasOwnProperty exists,
        // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function
        if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) {
          iterator.call(context, obj[key], key);
        }
      }
    } else if (isArray(obj) || isArrayLike(obj)) {
      for (key = 0; key < obj.length; key++) {
        iterator.call(context, obj[key], key);
      }
    } else if (obj.forEach && obj.forEach !== forEach) {
        obj.forEach(iterator, context);
    } else {
      for (key in obj) {
        if (obj.hasOwnProperty(key)) {
          iterator.call(context, obj[key], key);
        }
      }
    }
  }
  return obj;
}

function sortedKeys(obj) {
  var keys = [];
  for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
      keys.push(key);
    }
  }
  return keys.sort();
}

function forEachSorted(obj, iterator, context) {
  var keys = sortedKeys(obj);
  for ( var i = 0; i < keys.length; i++) {
    iterator.call(context, obj[keys[i]], keys[i]);
  }
  return keys;
}


/**
 * when using forEach the params are value, key, but it is often useful to have key, value.
 * @param {function(string, *)} iteratorFn
 * @returns {function(*, string)}
 */
function reverseParams(iteratorFn) {
  return function(value, key) { iteratorFn(key, value); };
}

/**
 * A consistent way of creating unique IDs in angular. The ID is a sequence of alpha numeric
 * characters such as '012ABC'. The reason why we are not using simply a number counter is that
 * the number string gets longer over time, and it can also overflow, where as the nextId
 * will grow much slower, it is a string, and it will never overflow.
 *
 * @returns {string} an unique alpha-numeric string
 */
function nextUid() {
  var index = uid.length;
  var digit;

  while(index) {
    index--;
    digit = uid[index].charCodeAt(0);
    if (digit == 57 /*'9'*/) {
      uid[index] = 'A';
      return uid.join('');
    }
    if (digit == 90  /*'Z'*/) {
      uid[index] = '0';
    } else {
      uid[index] = String.fromCharCode(digit + 1);
      return uid.join('');
    }
  }
  uid.unshift('0');
  return uid.join('');
}


/**
 * Set or clear the hashkey for an object.
 * @param obj object
 * @param h the hashkey (!truthy to delete the hashkey)
 */
function setHashKey(obj, h) {
  if (h) {
    obj.$$hashKey = h;
  }
  else {
    delete obj.$$hashKey;
  }
}

/**
 * @ngdoc function
 * @name angular.extend
 * @module ng
 * @kind function
 *
 * @description
 * Extends the destination object `dst` by copying all of the properties from the `src` object(s)
 * to `dst`. You can specify multiple `src` objects.
 *
 * @param {Object} dst Destination object.
 * @param {...Object} src Source object(s).
 * @returns {Object} Reference to `dst`.
 */
function extend(dst) {
  var h = dst.$$hashKey;
  forEach(arguments, function(obj) {
    if (obj !== dst) {
      forEach(obj, function(value, key) {
        dst[key] = value;
      });
    }
  });

  setHashKey(dst,h);
  return dst;
}

function int(str) {
  return parseInt(str, 10);
}


function inherit(parent, extra) {
  return extend(new (extend(function() {}, {prototype:parent}))(), extra);
}

/**
 * @ngdoc function
 * @name angular.noop
 * @module ng
 * @kind function
 *
 * @description
 * A function that performs no operations. This function can be useful when writing code in the
 * functional style.
   ```js
     function foo(callback) {
       var result = calculateResult();
       (callback || angular.noop)(result);
     }
   ```
 */
function noop() {}
noop.$inject = [];


/**
 * @ngdoc function
 * @name angular.identity
 * @module ng
 * @kind function
 *
 * @description
 * A function that returns its first argument. This function is useful when writing code in the
 * functional style.
 *
   ```js
     function transformer(transformationFn, value) {
       return (transformationFn || angular.identity)(value);
     };
   ```
 */
function identity($) {return $;}
identity.$inject = [];


function valueFn(value) {return function() {return value;};}

/**
 * @ngdoc function
 * @name angular.isUndefined
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a reference is undefined.
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is undefined.
 */
function isUndefined(value){return typeof value === 'undefined';}


/**
 * @ngdoc function
 * @name angular.isDefined
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a reference is defined.
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is defined.
 */
function isDefined(value){return typeof value !== 'undefined';}


/**
 * @ngdoc function
 * @name angular.isObject
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not
 * considered to be objects. Note that JavaScript arrays are objects.
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is an `Object` but not `null`.
 */
function isObject(value){return value != null && typeof value === 'object';}


/**
 * @ngdoc function
 * @name angular.isString
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a reference is a `String`.
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is a `String`.
 */
function isString(value){return typeof value === 'string';}


/**
 * @ngdoc function
 * @name angular.isNumber
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a reference is a `Number`.
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is a `Number`.
 */
function isNumber(value){return typeof value === 'number';}


/**
 * @ngdoc function
 * @name angular.isDate
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a value is a date.
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is a `Date`.
 */
function isDate(value) {
  return toString.call(value) === '[object Date]';
}


/**
 * @ngdoc function
 * @name angular.isArray
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a reference is an `Array`.
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is an `Array`.
 */
var isArray = (function() {
  if (!isFunction(Array.isArray)) {
    return function(value) {
      return toString.call(value) === '[object Array]';
    };
  }
  return Array.isArray;
})();

/**
 * @ngdoc function
 * @name angular.isFunction
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a reference is a `Function`.
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is a `Function`.
 */
function isFunction(value){return typeof value === 'function';}


/**
 * Determines if a value is a regular expression object.
 *
 * @private
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is a `RegExp`.
 */
function isRegExp(value) {
  return toString.call(value) === '[object RegExp]';
}


/**
 * Checks if `obj` is a window object.
 *
 * @private
 * @param {*} obj Object to check
 * @returns {boolean} True if `obj` is a window obj.
 */
function isWindow(obj) {
  return obj && obj.document && obj.location && obj.alert && obj.setInterval;
}


function isScope(obj) {
  return obj && obj.$evalAsync && obj.$watch;
}


function isFile(obj) {
  return toString.call(obj) === '[object File]';
}


function isBlob(obj) {
  return toString.call(obj) === '[object Blob]';
}


function isBoolean(value) {
  return typeof value === 'boolean';
}


function isPromiseLike(obj) {
  return obj && isFunction(obj.then);
}


var trim = (function() {
  // native trim is way faster: http://jsperf.com/angular-trim-test
  // but IE doesn't have it... :-(
  // TODO: we should move this into IE/ES5 polyfill
  if (!String.prototype.trim) {
    return function(value) {
      return isString(value) ? value.replace(/^\s\s*/, '').replace(/\s\s*$/, '') : value;
    };
  }
  return function(value) {
    return isString(value) ? value.trim() : value;
  };
})();


/**
 * @ngdoc function
 * @name angular.isElement
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a reference is a DOM element (or wrapped jQuery element).
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element).
 */
function isElement(node) {
  return !!(node &&
    (node.nodeName  // we are a direct element
    || (node.prop && node.attr && node.find)));  // we have an on and find method part of jQuery API
}

/**
 * @param str 'key1,key2,...'
 * @returns {object} in the form of {key1:true, key2:true, ...}
 */
function makeMap(str) {
  var obj = {}, items = str.split(","), i;
  for ( i = 0; i < items.length; i++ )
    obj[ items[i] ] = true;
  return obj;
}


if (msie < 9) {
  nodeName_ = function(element) {
    element = element.nodeName ? element : element[0];
    return (element.scopeName && element.scopeName != 'HTML')
      ? uppercase(element.scopeName + ':' + element.nodeName) : element.nodeName;
  };
} else {
  nodeName_ = function(element) {
    return element.nodeName ? element.nodeName : element[0].nodeName;
  };
}


function map(obj, iterator, context) {
  var results = [];
  forEach(obj, function(value, index, list) {
    results.push(iterator.call(context, value, index, list));
  });
  return results;
}


/**
 * @description
 * Determines the number of elements in an array, the number of properties an object has, or
 * the length of a string.
 *
 * Note: This function is used to augment the Object type in Angular expressions. See
 * {@link angular.Object} for more information about Angular arrays.
 *
 * @param {Object|Array|string} obj Object, array, or string to inspect.
 * @param {boolean} [ownPropsOnly=false] Count only "own" properties in an object
 * @returns {number} The size of `obj` or `0` if `obj` is neither an object nor an array.
 */
function size(obj, ownPropsOnly) {
  var count = 0, key;

  if (isArray(obj) || isString(obj)) {
    return obj.length;
  } else if (isObject(obj)) {
    for (key in obj)
      if (!ownPropsOnly || obj.hasOwnProperty(key))
        count++;
  }

  return count;
}


function includes(array, obj) {
  return indexOf(array, obj) != -1;
}

function indexOf(array, obj) {
  if (array.indexOf) return array.indexOf(obj);

  for (var i = 0; i < array.length; i++) {
    if (obj === array[i]) return i;
  }
  return -1;
}

function arrayRemove(array, value) {
  var index = indexOf(array, value);
  if (index >=0)
    array.splice(index, 1);
  return value;
}

function isLeafNode (node) {
  if (node) {
    switch (node.nodeName) {
    case "OPTION":
    case "PRE":
    case "TITLE":
      return true;
    }
  }
  return false;
}

/**
 * @ngdoc function
 * @name angular.copy
 * @module ng
 * @kind function
 *
 * @description
 * Creates a deep copy of `source`, which should be an object or an array.
 *
 * * If no destination is supplied, a copy of the object or array is created.
 * * If a destination is provided, all of its elements (for array) or properties (for objects)
 *   are deleted and then all elements/properties from the source are copied to it.
 * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned.
 * * If `source` is identical to 'destination' an exception will be thrown.
 *
 * @param {*} source The source that will be used to make a copy.
 *                   Can be any type, including primitives, `null`, and `undefined`.
 * @param {(Object|Array)=} destination Destination into which the source is copied. If
 *     provided, must be of the same type as `source`.
 * @returns {*} The copy or updated `destination`, if `destination` was specified.
 *
 * @example
 <example module="copyExample">
 <file name="index.html">
 <div ng-controller="ExampleController">
 <form novalidate class="simple-form">
 Name: <input type="text" ng-model="user.name" /><br />
 E-mail: <input type="email" ng-model="user.email" /><br />
 Gender: <input type="radio" ng-model="user.gender" value="male" />male
 <input type="radio" ng-model="user.gender" value="female" />female<br />
 <button ng-click="reset()">RESET</button>
 <button ng-click="update(user)">SAVE</button>
 </form>
 <pre>form = {{user | json}}</pre>
 <pre>master = {{master | json}}</pre>
 </div>

 <script>
  angular.module('copyExample', [])
    .controller('ExampleController', ['$scope', function($scope) {
      $scope.master= {};

      $scope.update = function(user) {
        // Example with 1 argument
        $scope.master= angular.copy(user);
      };

      $scope.reset = function() {
        // Example with 2 arguments
        angular.copy($scope.master, $scope.user);
      };

      $scope.reset();
    }]);
 </script>
 </file>
 </example>
 */
function copy(source, destination, stackSource, stackDest) {
  if (isWindow(source) || isScope(source)) {
    throw ngMinErr('cpws',
      "Can't copy! Making copies of Window or Scope instances is not supported.");
  }

  if (!destination) {
    destination = source;
    if (source) {
      if (isArray(source)) {
        destination = copy(source, [], stackSource, stackDest);
      } else if (isDate(source)) {
        destination = new Date(source.getTime());
      } else if (isRegExp(source)) {
        destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]);
        destination.lastIndex = source.lastIndex;
      } else if (isObject(source)) {
        destination = copy(source, {}, stackSource, stackDest);
      }
    }
  } else {
    if (source === destination) throw ngMinErr('cpi',
      "Can't copy! Source and destination are identical.");

    stackSource = stackSource || [];
    stackDest = stackDest || [];

    if (isObject(source)) {
      var index = indexOf(stackSource, source);
      if (index !== -1) return stackDest[index];

      stackSource.push(source);
      stackDest.push(destination);
    }

    var result;
    if (isArray(source)) {
      destination.length = 0;
      for ( var i = 0; i < source.length; i++) {
        result = copy(source[i], null, stackSource, stackDest);
        if (isObject(source[i])) {
          stackSource.push(source[i]);
          stackDest.push(result);
        }
        destination.push(result);
      }
    } else {
      var h = destination.$$hashKey;
      if (isArray(destination)) {
        destination.length = 0;
      } else {
        forEach(destination, function(value, key) {
          delete destination[key];
        });
      }
      for ( var key in source) {
        result = copy(source[key], null, stackSource, stackDest);
        if (isObject(source[key])) {
          stackSource.push(source[key]);
          stackDest.push(result);
        }
        destination[key] = result;
      }
      setHashKey(destination,h);
    }

  }
  return destination;
}

/**
 * Creates a shallow copy of an object, an array or a primitive
 */
function shallowCopy(src, dst) {
  if (isArray(src)) {
    dst = dst || [];

    for ( var i = 0; i < src.length; i++) {
      dst[i] = src[i];
    }
  } else if (isObject(src)) {
    dst = dst || {};

    for (var key in src) {
      if (hasOwnProperty.call(src, key) && !(key.charAt(0) === '$' && key.charAt(1) === '$')) {
        dst[key] = src[key];
      }
    }
  }

  return dst || src;
}


/**
 * @ngdoc function
 * @name angular.equals
 * @module ng
 * @kind function
 *
 * @description
 * Determines if two objects or two values are equivalent. Supports value types, regular
 * expressions, arrays and objects.
 *
 * Two objects or values are considered equivalent if at least one of the following is true:
 *
 * * Both objects or values pass `===` comparison.
 * * Both objects or values are of the same type and all of their properties are equal by
 *   comparing them with `angular.equals`.
 * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal)
 * * Both values represent the same regular expression (In JavaScript,
 *   /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual
 *   representation matches).
 *
 * During a property comparison, properties of `function` type and properties with names
 * that begin with `$` are ignored.
 *
 * Scope and DOMWindow objects are being compared only by identify (`===`).
 *
 * @param {*} o1 Object or value to compare.
 * @param {*} o2 Object or value to compare.
 * @returns {boolean} True if arguments are equal.
 */
function equals(o1, o2) {
  if (o1 === o2) return true;
  if (o1 === null || o2 === null) return false;
  if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN
  var t1 = typeof o1, t2 = typeof o2, length, key, keySet;
  if (t1 == t2) {
    if (t1 == 'object') {
      if (isArray(o1)) {
        if (!isArray(o2)) return false;
        if ((length = o1.length) == o2.length) {
          for(key=0; key<length; key++) {
            if (!equals(o1[key], o2[key])) return false;
          }
          return true;
        }
      } else if (isDate(o1)) {
        if (!isDate(o2)) return false;
        return (isNaN(o1.getTime()) && isNaN(o2.getTime())) || (o1.getTime() === o2.getTime());
      } else if (isRegExp(o1) && isRegExp(o2)) {
        return o1.toString() == o2.toString();
      } else {
        if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || isArray(o2)) return false;
        keySet = {};
        for(key in o1) {
          if (key.charAt(0) === '$' || isFunction(o1[key])) continue;
          if (!equals(o1[key], o2[key])) return false;
          keySet[key] = true;
        }
        for(key in o2) {
          if (!keySet.hasOwnProperty(key) &&
              key.charAt(0) !== '$' &&
              o2[key] !== undefined &&
              !isFunction(o2[key])) return false;
        }
        return true;
      }
    }
  }
  return false;
}

var csp = function() {
  if (isDefined(csp.isActive_)) return csp.isActive_;

  var active = !!(document.querySelector('[ng-csp]') ||
                  document.querySelector('[data-ng-csp]'));

  if (!active) {
    try {
      /* jshint -W031, -W054 */
      new Function('');
      /* jshint +W031, +W054 */
    } catch (e) {
      active = true;
    }
  }

  return (csp.isActive_ = active);
};



function concat(array1, array2, index) {
  return array1.concat(slice.call(array2, index));
}

function sliceArgs(args, startIndex) {
  return slice.call(args, startIndex || 0);
}


/* jshint -W101 */
/**
 * @ngdoc function
 * @name angular.bind
 * @module ng
 * @kind function
 *
 * @description
 * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for
 * `fn`). You can supply optional `args` that are prebound to the function. This feature is also
 * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as
 * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application).
 *
 * @param {Object} self Context which `fn` should be evaluated in.
 * @param {function()} fn Function to be bound.
 * @param {...*} args Optional arguments to be prebound to the `fn` function call.
 * @returns {function()} Function that wraps the `fn` with all the specified bindings.
 */
/* jshint +W101 */
function bind(self, fn) {
  var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];
  if (isFunction(fn) && !(fn instanceof RegExp)) {
    return curryArgs.length
      ? function() {
          return arguments.length
            ? fn.apply(self, curryArgs.concat(slice.call(arguments, 0)))
            : fn.apply(self, curryArgs);
        }
      : function() {
          return arguments.length
            ? fn.apply(self, arguments)
            : fn.call(self);
        };
  } else {
    // in IE, native methods are not functions so they cannot be bound (note: they don't need to be)
    return fn;
  }
}


function toJsonReplacer(key, value) {
  var val = value;

  if (typeof key === 'string' && key.charAt(0) === '$') {
    val = undefined;
  } else if (isWindow(value)) {
    val = '$WINDOW';
  } else if (value &&  document === value) {
    val = '$DOCUMENT';
  } else if (isScope(value)) {
    val = '$SCOPE';
  }

  return val;
}


/**
 * @ngdoc function
 * @name angular.toJson
 * @module ng
 * @kind function
 *
 * @description
 * Serializes input into a JSON-formatted string. Properties with leading $ characters will be
 * stripped since angular uses this notation internally.
 *
 * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON.
 * @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace.
 * @returns {string|undefined} JSON-ified string representing `obj`.
 */
function toJson(obj, pretty) {
  if (typeof obj === 'undefined') return undefined;
  return JSON.stringify(obj, toJsonReplacer, pretty ? '  ' : null);
}


/**
 * @ngdoc function
 * @name angular.fromJson
 * @module ng
 * @kind function
 *
 * @description
 * Deserializes a JSON string.
 *
 * @param {string} json JSON string to deserialize.
 * @returns {Object|Array|string|number} Deserialized thingy.
 */
function fromJson(json) {
  return isString(json)
      ? JSON.parse(json)
      : json;
}


function toBoolean(value) {
  if (typeof value === 'function') {
    value = true;
  } else if (value && value.length !== 0) {
    var v = lowercase("" + value);
    value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]');
  } else {
    value = false;
  }
  return value;
}

/**
 * @returns {string} Returns the string representation of the element.
 */
function startingTag(element) {
  element = jqLite(element).clone();
  try {
    // turns out IE does not let you set .html() on elements which
    // are not allowed to have children. So we just ignore it.
    element.empty();
  } catch(e) {}
  // As Per DOM Standards
  var TEXT_NODE = 3;
  var elemHtml = jqLite('<div>').append(element).html();
  try {
    return element[0].nodeType === TEXT_NODE ? lowercase(elemHtml) :
        elemHtml.
          match(/^(<[^>]+>)/)[1].
          replace(/^<([\w\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); });
  } catch(e) {
    return lowercase(elemHtml);
  }

}


/////////////////////////////////////////////////

/**
 * Tries to decode the URI component without throwing an exception.
 *
 * @private
 * @param str value potential URI component to check.
 * @returns {boolean} True if `value` can be decoded
 * with the decodeURIComponent function.
 */
function tryDecodeURIComponent(value) {
  try {
    return decodeURIComponent(value);
  } catch(e) {
    // Ignore any invalid uri component
  }
}


/**
 * Parses an escaped url query string into key-value pairs.
 * @returns {Object.<string,boolean|Array>}
 */
function parseKeyValue(/**string*/keyValue) {
  var obj = {}, key_value, key;
  forEach((keyValue || "").split('&'), function(keyValue) {
    if ( keyValue ) {
      key_value = keyValue.replace(/\+/g,'%20').split('=');
      key = tryDecodeURIComponent(key_value[0]);
      if ( isDefined(key) ) {
        var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;
        if (!hasOwnProperty.call(obj, key)) {
          obj[key] = val;
        } else if(isArray(obj[key])) {
          obj[key].push(val);
        } else {
          obj[key] = [obj[key],val];
        }
      }
    }
  });
  return obj;
}

function toKeyValue(obj) {
  var parts = [];
  forEach(obj, function(value, key) {
    if (isArray(value)) {
      forEach(value, function(arrayValue) {
        parts.push(encodeUriQuery(key, true) +
                   (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true)));
      });
    } else {
    parts.push(encodeUriQuery(key, true) +
               (value === true ? '' : '=' + encodeUriQuery(value, true)));
    }
  });
  return parts.length ? parts.join('&') : '';
}


/**
 * We need our custom method because encodeURIComponent is too aggressive and doesn't follow
 * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path
 * segments:
 *    segment       = *pchar
 *    pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
 *    pct-encoded   = "%" HEXDIG HEXDIG
 *    unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
 *    sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
 *                     / "*" / "+" / "," / ";" / "="
 */
function encodeUriSegment(val) {
  return encodeUriQuery(val, true).
             replace(/%26/gi, '&').
             replace(/%3D/gi, '=').
             replace(/%2B/gi, '+');
}


/**
 * This method is intended for encoding *key* or *value* parts of query component. We need a custom
 * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be
 * encoded per http://tools.ietf.org/html/rfc3986:
 *    query       = *( pchar / "/" / "?" )
 *    pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
 *    unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
 *    pct-encoded   = "%" HEXDIG HEXDIG
 *    sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
 *                     / "*" / "+" / "," / ";" / "="
 */
function encodeUriQuery(val, pctEncodeSpaces) {
  return encodeURIComponent(val).
             replace(/%40/gi, '@').
             replace(/%3A/gi, ':').
             replace(/%24/g, '$').
             replace(/%2C/gi, ',').
             replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));
}


/**
 * @ngdoc directive
 * @name ngApp
 * @module ng
 *
 * @element ANY
 * @param {angular.Module} ngApp an optional application
 *   {@link angular.module module} name to load.
 *
 * @description
 *
 * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive
 * designates the **root element** of the application and is typically placed near the root element
 * of the page - e.g. on the `<body>` or `<html>` tags.
 *
 * Only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp`
 * found in the document will be used to define the root element to auto-bootstrap as an
 * application. To run multiple applications in an HTML document you must manually bootstrap them using
 * {@link angular.bootstrap} instead. AngularJS applications cannot be nested within each other.
 *
 * You can specify an **AngularJS module** to be used as the root module for the application.  This
 * module will be loaded into the {@link auto.$injector} when the application is bootstrapped and
 * should contain the application code needed or have dependencies on other modules that will
 * contain the code. See {@link angular.module} for more information.
 *
 * In the example below if the `ngApp` directive were not placed on the `html` element then the
 * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}`
 * would not be resolved to `3`.
 *
 * `ngApp` is the easiest, and most common, way to bootstrap an application.
 *
 <example module="ngAppDemo">
   <file name="index.html">
   <div ng-controller="ngAppDemoController">
     I can add: {{a}} + {{b}} =  {{ a+b }}
   </div>
   </file>
   <file name="script.js">
   angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) {
     $scope.a = 1;
     $scope.b = 2;
   });
   </file>
 </example>
 *
 */
function angularInit(element, bootstrap) {
  var elements = [element],
      appElement,
      module,
      names = ['ng:app', 'ng-app', 'x-ng-app', 'data-ng-app'],
      NG_APP_CLASS_REGEXP = /\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;

  function append(element) {
    element && elements.push(element);
  }

  forEach(names, function(name) {
    names[name] = true;
    append(document.getElementById(name));
    name = name.replace(':', '\\:');
    if (element.querySelectorAll) {
      forEach(element.querySelectorAll('.' + name), append);
      forEach(element.querySelectorAll('.' + name + '\\:'), append);
      forEach(element.querySelectorAll('[' + name + ']'), append);
    }
  });

  forEach(elements, function(element) {
    if (!appElement) {
      var className = ' ' + element.className + ' ';
      var match = NG_APP_CLASS_REGEXP.exec(className);
      if (match) {
        appElement = element;
        module = (match[2] || '').replace(/\s+/g, ',');
      } else {
        forEach(element.attributes, function(attr) {
          if (!appElement && names[attr.name]) {
            appElement = element;
            module = attr.value;
          }
        });
      }
    }
  });
  if (appElement) {
    bootstrap(appElement, module ? [module] : []);
  }
}

/**
 * @ngdoc function
 * @name angular.bootstrap
 * @module ng
 * @description
 * Use this function to manually start up angular application.
 *
 * See: {@link guide/bootstrap Bootstrap}
 *
 * Note that ngScenario-based end-to-end tests cannot use this function to bootstrap manually.
 * They must use {@link ng.directive:ngApp ngApp}.
 *
 * Angular will detect if it has been loaded into the browser more than once and only allow the
 * first loaded script to be bootstrapped and will report a warning to the browser console for
 * each of the subsequent scripts. This prevents strange results in applications, where otherwise
 * multiple instances of Angular try to work on the DOM.
 *
 * <example name="multi-bootstrap" module="multi-bootstrap">
 * <file name="index.html">
 * <script src="../../../angular.js"></script>
 * <div ng-controller="BrokenTable">
 *   <table>
 *   <tr>
 *     <th ng-repeat="heading in headings">{{heading}}</th>
 *   </tr>
 *   <tr ng-repeat="filling in fillings">
 *     <td ng-repeat="fill in filling">{{fill}}</td>
 *   </tr>
 * </table>
 * </div>
 * </file>
 * <file name="controller.js">
 * var app = angular.module('multi-bootstrap', [])
 *
 * .controller('BrokenTable', function($scope) {
 *     $scope.headings = ['One', 'Two', 'Three'];
 *     $scope.fillings = [[1, 2, 3], ['A', 'B', 'C'], [7, 8, 9]];
 * });
 * </file>
 * <file name="protractor.js" type="protractor">
 * it('should only insert one table cell for each item in $scope.fillings', function() {
 *  expect(element.all(by.css('td')).count())
 *      .toBe(9);
 * });
 * </file>
 * </example>
 *
 * @param {DOMElement} element DOM element which is the root of angular application.
 * @param {Array<String|Function|Array>=} modules an array of modules to load into the application.
 *     Each item in the array should be the name of a predefined module or a (DI annotated)
 *     function that will be invoked by the injector as a run block.
 *     See: {@link angular.module modules}
 * @returns {auto.$injector} Returns the newly created injector for this app.
 */
function bootstrap(element, modules) {
  var doBootstrap = function() {
    element = jqLite(element);

    if (element.injector()) {
      var tag = (element[0] === document) ? 'document' : startingTag(element);
      //Encode angle brackets to prevent input from being sanitized to empty string #8683
      throw ngMinErr(
          'btstrpd',
          "App Already Bootstrapped with this Element '{0}'",
          tag.replace(/</,'&lt;').replace(/>/,'&gt;'));
    }

    modules = modules || [];
    modules.unshift(['$provide', function($provide) {
      $provide.value('$rootElement', element);
    }]);
    modules.unshift('ng');
    var injector = createInjector(modules);
    injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector', '$animate',
       function(scope, element, compile, injector, animate) {
        scope.$apply(function() {
          element.data('$injector', injector);
          compile(element)(scope);
        });
      }]
    );
    return injector;
  };

  var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/;

  if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) {
    return doBootstrap();
  }

  window.name = window.name.replace(NG_DEFER_BOOTSTRAP, '');
  angular.resumeBootstrap = function(extraModules) {
    forEach(extraModules, function(module) {
      modules.push(module);
    });
    doBootstrap();
  };
}

var SNAKE_CASE_REGEXP = /[A-Z]/g;
function snake_case(name, separator) {
  separator = separator || '_';
  return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {
    return (pos ? separator : '') + letter.toLowerCase();
  });
}

function bindJQuery() {
  // bind to jQuery if present;
  jQuery = window.jQuery;
  // Use jQuery if it exists with proper functionality, otherwise default to us.
  // Angular 1.2+ requires jQuery 1.7.1+ for on()/off() support.
  if (jQuery && jQuery.fn.on) {
    jqLite = jQuery;
    extend(jQuery.fn, {
      scope: JQLitePrototype.scope,
      isolateScope: JQLitePrototype.isolateScope,
      controller: JQLitePrototype.controller,
      injector: JQLitePrototype.injector,
      inheritedData: JQLitePrototype.inheritedData
    });
    // Method signature:
    //     jqLitePatchJQueryRemove(name, dispatchThis, filterElems, getterIfNoArguments)
    jqLitePatchJQueryRemove('remove', true, true, false);
    jqLitePatchJQueryRemove('empty', false, false, false);
    jqLitePatchJQueryRemove('html', false, false, true);
  } else {
    jqLite = JQLite;
  }
  angular.element = jqLite;
}

/**
 * throw error if the argument is falsy.
 */
function assertArg(arg, name, reason) {
  if (!arg) {
    throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required"));
  }
  return arg;
}

function assertArgFn(arg, name, acceptArrayAnnotation) {
  if (acceptArrayAnnotation && isArray(arg)) {
      arg = arg[arg.length - 1];
  }

  assertArg(isFunction(arg), name, 'not a function, got ' +
      (arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg));
  return arg;
}

/**
 * throw error if the name given is hasOwnProperty
 * @param  {String} name    the name to test
 * @param  {String} context the context in which the name is used, such as module or directive
 */
function assertNotHasOwnProperty(name, context) {
  if (name === 'hasOwnProperty') {
    throw ngMinErr('badname', "hasOwnProperty is not a valid {0} name", context);
  }
}

/**
 * Return the value accessible from the object by path. Any undefined traversals are ignored
 * @param {Object} obj starting object
 * @param {String} path path to traverse
 * @param {boolean} [bindFnToScope=true]
 * @returns {Object} value as accessible by path
 */
//TODO(misko): this function needs to be removed
function getter(obj, path, bindFnToScope) {
  if (!path) return obj;
  var keys = path.split('.');
  var key;
  var lastInstance = obj;
  var len = keys.length;

  for (var i = 0; i < len; i++) {
    key = keys[i];
    if (obj) {
      obj = (lastInstance = obj)[key];
    }
  }
  if (!bindFnToScope && isFunction(obj)) {
    return bind(lastInstance, obj);
  }
  return obj;
}

/**
 * Return the DOM siblings between the first and last node in the given array.
 * @param {Array} array like object
 * @returns {DOMElement} object containing the elements
 */
function getBlockElements(nodes) {
  var startNode = nodes[0],
      endNode = nodes[nodes.length - 1];
  if (startNode === endNode) {
    return jqLite(startNode);
  }

  var element = startNode;
  var elements = [element];

  do {
    element = element.nextSibling;
    if (!element) break;
    elements.push(element);
  } while (element !== endNode);

  return jqLite(elements);
}

/**
 * @ngdoc type
 * @name angular.Module
 * @module ng
 * @description
 *
 * Interface for configuring angular {@link angular.module modules}.
 */

function setupModuleLoader(window) {

  var $injectorMinErr = minErr('$injector');
  var ngMinErr = minErr('ng');

  function ensure(obj, name, factory) {
    return obj[name] || (obj[name] = factory());
  }

  var angular = ensure(window, 'angular', Object);

  // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap
  angular.$$minErr = angular.$$minErr || minErr;

  return ensure(angular, 'module', function() {
    /** @type {Object.<string, angular.Module>} */
    var modules = {};

    /**
     * @ngdoc function
     * @name angular.module
     * @module ng
     * @description
     *
     * The `angular.module` is a global place for creating, registering and retrieving Angular
     * modules.
     * All modules (angular core or 3rd party) that should be available to an application must be
     * registered using this mechanism.
     *
     * When passed two or more arguments, a new module is created.  If passed only one argument, an
     * existing module (the name passed as the first argument to `module`) is retrieved.
     *
     *
     * # Module
     *
     * A module is a collection of services, directives, controllers, filters, and configuration information.
     * `angular.module` is used to configure the {@link auto.$injector $injector}.
     *
     * ```js
     * // Create a new module
     * var myModule = angular.module('myModule', []);
     *
     * // register a new service
     * myModule.value('appName', 'MyCoolApp');
     *
     * // configure existing services inside initialization blocks.
     * myModule.config(['$locationProvider', function($locationProvider) {
     *   // Configure existing providers
     *   $locationProvider.hashPrefix('!');
     * }]);
     * ```
     *
     * Then you can create an injector and load your modules like this:
     *
     * ```js
     * var injector = angular.injector(['ng', 'myModule'])
     * ```
     *
     * However it's more likely that you'll just use
     * {@link ng.directive:ngApp ngApp} or
     * {@link angular.bootstrap} to simplify this process for you.
     *
     * @param {!string} name The name of the module to create or retrieve.
     * @param {!Array.<string>=} requires If specified then new module is being created. If
     *        unspecified then the module is being retrieved for further configuration.
     * @param {Function=} configFn Optional configuration function for the module. Same as
     *        {@link angular.Module#config Module#config()}.
     * @returns {module} new module with the {@link angular.Module} api.
     */
    return function module(name, requires, configFn) {
      var assertNotHasOwnProperty = function(name, context) {
        if (name === 'hasOwnProperty') {
          throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);
        }
      };

      assertNotHasOwnProperty(name, 'module');
      if (requires && modules.hasOwnProperty(name)) {
        modules[name] = null;
      }
      return ensure(modules, name, function() {
        if (!requires) {
          throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " +
             "the module name or forgot to load it. If registering a module ensure that you " +
             "specify the dependencies as the second argument.", name);
        }

        /** @type {!Array.<Array.<*>>} */
        var invokeQueue = [];

        /** @type {!Array.<Function>} */
        var runBlocks = [];

        var config = invokeLater('$injector', 'invoke');

        /** @type {angular.Module} */
        var moduleInstance = {
          // Private state
          _invokeQueue: invokeQueue,
          _runBlocks: runBlocks,

          /**
           * @ngdoc property
           * @name angular.Module#requires
           * @module ng
           *
           * @description
           * Holds the list of modules which the injector will load before the current module is
           * loaded.
           */
          requires: requires,

          /**
           * @ngdoc property
           * @name angular.Module#name
           * @module ng
           *
           * @description
           * Name of the module.
           */
          name: name,


          /**
           * @ngdoc method
           * @name angular.Module#provider
           * @module ng
           * @param {string} name service name
           * @param {Function} providerType Construction function for creating new instance of the
           *                                service.
           * @description
           * See {@link auto.$provide#provider $provide.provider()}.
           */
          provider: invokeLater('$provide', 'provider'),

          /**
           * @ngdoc method
           * @name angular.Module#factory
           * @module ng
           * @param {string} name service name
           * @param {Function} providerFunction Function for creating new instance of the service.
           * @description
           * See {@link auto.$provide#factory $provide.factory()}.
           */
          factory: invokeLater('$provide', 'factory'),

          /**
           * @ngdoc method
           * @name angular.Module#service
           * @module ng
           * @param {string} name service name
           * @param {Function} constructor A constructor function that will be instantiated.
           * @description
           * See {@link auto.$provide#service $provide.service()}.
           */
          service: invokeLater('$provide', 'service'),

          /**
           * @ngdoc method
           * @name angular.Module#value
           * @module ng
           * @param {string} name service name
           * @param {*} object Service instance object.
           * @description
           * See {@link auto.$provide#value $provide.value()}.
           */
          value: invokeLater('$provide', 'value'),

          /**
           * @ngdoc method
           * @name angular.Module#constant
           * @module ng
           * @param {string} name constant name
           * @param {*} object Constant value.
           * @description
           * Because the constant are fixed, they get applied before other provide methods.
           * See {@link auto.$provide#constant $provide.constant()}.
           */
          constant: invokeLater('$provide', 'constant', 'unshift'),

          /**
           * @ngdoc method
           * @name angular.Module#animation
           * @module ng
           * @param {string} name animation name
           * @param {Function} animationFactory Factory function for creating new instance of an
           *                                    animation.
           * @description
           *
           * **NOTE**: animations take effect only if the **ngAnimate** module is loaded.
           *
           *
           * Defines an animation hook that can be later used with
           * {@link ngAnimate.$animate $animate} service and directives that use this service.
           *
           * ```js
           * module.animation('.animation-name', function($inject1, $inject2) {
           *   return {
           *     eventName : function(element, done) {
           *       //code to run the animation
           *       //once complete, then run done()
           *       return function cancellationFunction(element) {
           *         //code to cancel the animation
           *       }
           *     }
           *   }
           * })
           * ```
           *
           * See {@link ngAnimate.$animateProvider#register $animateProvider.register()} and
           * {@link ngAnimate ngAnimate module} for more information.
           */
          animation: invokeLater('$animateProvider', 'register'),

          /**
           * @ngdoc method
           * @name angular.Module#filter
           * @module ng
           * @param {string} name Filter name.
           * @param {Function} filterFactory Factory function for creating new instance of filter.
           * @description
           * See {@link ng.$filterProvider#register $filterProvider.register()}.
           */
          filter: invokeLater('$filterProvider', 'register'),

          /**
           * @ngdoc method
           * @name angular.Module#controller
           * @module ng
           * @param {string|Object} name Controller name, or an object map of controllers where the
           *    keys are the names and the values are the constructors.
           * @param {Function} constructor Controller constructor function.
           * @description
           * See {@link ng.$controllerProvider#register $controllerProvider.register()}.
           */
          controller: invokeLater('$controllerProvider', 'register'),

          /**
           * @ngdoc method
           * @name angular.Module#directive
           * @module ng
           * @param {string|Object} name Directive name, or an object map of directives where the
           *    keys are the names and the values are the factories.
           * @param {Function} directiveFactory Factory function for creating new instance of
           * directives.
           * @description
           * See {@link ng.$compileProvider#directive $compileProvider.directive()}.
           */
          directive: invokeLater('$compileProvider', 'directive'),

          /**
           * @ngdoc method
           * @name angular.Module#config
           * @module ng
           * @param {Function} configFn Execute this function on module load. Useful for service
           *    configuration.
           * @description
           * Use this method to register work which needs to be performed on module loading.
           * For more about how to configure services, see
           * {@link providers#providers_provider-recipe Provider Recipe}.
           */
          config: config,

          /**
           * @ngdoc method
           * @name angular.Module#run
           * @module ng
           * @param {Function} initializationFn Execute this function after injector creation.
           *    Useful for application initialization.
           * @description
           * Use this method to register work which should be performed when the injector is done
           * loading all modules.
           */
          run: function(block) {
            runBlocks.push(block);
            return this;
          }
        };

        if (configFn) {
          config(configFn);
        }

        return  moduleInstance;

        /**
         * @param {string} provider
         * @param {string} method
         * @param {String=} insertMethod
         * @returns {angular.Module}
         */
        function invokeLater(provider, method, insertMethod) {
          return function() {
            invokeQueue[insertMethod || 'push']([provider, method, arguments]);
            return moduleInstance;
          };
        }
      });
    };
  });

}

/* global angularModule: true,
  version: true,

  $LocaleProvider,
  $CompileProvider,

    htmlAnchorDirective,
    inputDirective,
    inputDirective,
    formDirective,
    scriptDirective,
    selectDirective,
    styleDirective,
    optionDirective,
    ngBindDirective,
    ngBindHtmlDirective,
    ngBindTemplateDirective,
    ngClassDirective,
    ngClassEvenDirective,
    ngClassOddDirective,
    ngCspDirective,
    ngCloakDirective,
    ngControllerDirective,
    ngFormDirective,
    ngHideDirective,
    ngIfDirective,
    ngIncludeDirective,
    ngIncludeFillContentDirective,
    ngInitDirective,
    ngNonBindableDirective,
    ngPluralizeDirective,
    ngRepeatDirective,
    ngShowDirective,
    ngStyleDirective,
    ngSwitchDirective,
    ngSwitchWhenDirective,
    ngSwitchDefaultDirective,
    ngOptionsDirective,
    ngTranscludeDirective,
    ngModelDirective,
    ngListDirective,
    ngChangeDirective,
    requiredDirective,
    requiredDirective,
    ngValueDirective,
    ngAttributeAliasDirectives,
    ngEventDirectives,

    $AnchorScrollProvider,
    $AnimateProvider,
    $BrowserProvider,
    $CacheFactoryProvider,
    $ControllerProvider,
    $DocumentProvider,
    $ExceptionHandlerProvider,
    $FilterProvider,
    $InterpolateProvider,
    $IntervalProvider,
    $HttpProvider,
    $HttpBackendProvider,
    $LocationProvider,
    $LogProvider,
    $ParseProvider,
    $RootScopeProvider,
    $QProvider,
    $$SanitizeUriProvider,
    $SceProvider,
    $SceDelegateProvider,
    $SnifferProvider,
    $TemplateCacheProvider,
    $TimeoutProvider,
    $$RAFProvider,
    $$AsyncCallbackProvider,
    $WindowProvider
*/


/**
 * @ngdoc object
 * @name angular.version
 * @module ng
 * @description
 * An object that contains information about the current AngularJS version. This object has the
 * following properties:
 *
 * - `full` – `{string}` – Full version string, such as "0.9.18".
 * - `major` – `{number}` – Major version number, such as "0".
 * - `minor` – `{number}` – Minor version number, such as "9".
 * - `dot` – `{number}` – Dot version number, such as "18".
 * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
 */
var version = {
  full: '1.2.24',    // all of these placeholder strings will be replaced by grunt's
  major: 1,    // package task
  minor: 2,
  dot: 24,
  codeName: 'static-levitation'
};


function publishExternalAPI(angular){
  extend(angular, {
    'bootstrap': bootstrap,
    'copy': copy,
    'extend': extend,
    'equals': equals,
    'element': jqLite,
    'forEach': forEach,
    'injector': createInjector,
    'noop': noop,
    'bind': bind,
    'toJson': toJson,
    'fromJson': fromJson,
    'identity': identity,
    'isUndefined': isUndefined,
    'isDefined': isDefined,
    'isString': isString,
    'isFunction': isFunction,
    'isObject': isObject,
    'isNumber': isNumber,
    'isElement': isElement,
    'isArray': isArray,
    'version': version,
    'isDate': isDate,
    'lowercase': lowercase,
    'uppercase': uppercase,
    'callbacks': {counter: 0},
    '$$minErr': minErr,
    '$$csp': csp
  });

  angularModule = setupModuleLoader(window);
  try {
    angularModule('ngLocale');
  } catch (e) {
    angularModule('ngLocale', []).provider('$locale', $LocaleProvider);
  }

  angularModule('ng', ['ngLocale'], ['$provide',
    function ngModule($provide) {
      // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it.
      $provide.provider({
        $$sanitizeUri: $$SanitizeUriProvider
      });
      $provide.provider('$compile', $CompileProvider).
        directive({
            a: htmlAnchorDirective,
            input: inputDirective,
            textarea: inputDirective,
            form: formDirective,
            script: scriptDirective,
            select: selectDirective,
            style: styleDirective,
            option: optionDirective,
            ngBind: ngBindDirective,
            ngBindHtml: ngBindHtmlDirective,
            ngBindTemplate: ngBindTemplateDirective,
            ngClass: ngClassDirective,
            ngClassEven: ngClassEvenDirective,
            ngClassOdd: ngClassOddDirective,
            ngCloak: ngCloakDirective,
            ngController: ngControllerDirective,
            ngForm: ngFormDirective,
            ngHide: ngHideDirective,
            ngIf: ngIfDirective,
            ngInclude: ngIncludeDirective,
            ngInit: ngInitDirective,
            ngNonBindable: ngNonBindableDirective,
            ngPluralize: ngPluralizeDirective,
            ngRepeat: ngRepeatDirective,
            ngShow: ngShowDirective,
            ngStyle: ngStyleDirective,
            ngSwitch: ngSwitchDirective,
            ngSwitchWhen: ngSwitchWhenDirective,
            ngSwitchDefault: ngSwitchDefaultDirective,
            ngOptions: ngOptionsDirective,
            ngTransclude: ngTranscludeDirective,
            ngModel: ngModelDirective,
            ngList: ngListDirective,
            ngChange: ngChangeDirective,
            required: requiredDirective,
            ngRequired: requiredDirective,
            ngValue: ngValueDirective
        }).
        directive({
          ngInclude: ngIncludeFillContentDirective
        }).
        directive(ngAttributeAliasDirectives).
        directive(ngEventDirectives);
      $provide.provider({
        $anchorScroll: $AnchorScrollProvider,
        $animate: $AnimateProvider,
        $browser: $BrowserProvider,
        $cacheFactory: $CacheFactoryProvider,
        $controller: $ControllerProvider,
        $document: $DocumentProvider,
        $exceptionHandler: $ExceptionHandlerProvider,
        $filter: $FilterProvider,
        $interpolate: $InterpolateProvider,
        $interval: $IntervalProvider,
        $http: $HttpProvider,
        $httpBackend: $HttpBackendProvider,
        $location: $LocationProvider,
        $log: $LogProvider,
        $parse: $ParseProvider,
        $rootScope: $RootScopeProvider,
        $q: $QProvider,
        $sce: $SceProvider,
        $sceDelegate: $SceDelegateProvider,
        $sniffer: $SnifferProvider,
        $templateCache: $TemplateCacheProvider,
        $timeout: $TimeoutProvider,
        $window: $WindowProvider,
        $$rAF: $$RAFProvider,
        $$asyncCallback : $$AsyncCallbackProvider
      });
    }
  ]);
}

/* global JQLitePrototype: true,
  addEventListenerFn: true,
  removeEventListenerFn: true,
  BOOLEAN_ATTR: true
*/

//////////////////////////////////
//JQLite
//////////////////////////////////

/**
 * @ngdoc function
 * @name angular.element
 * @module ng
 * @kind function
 *
 * @description
 * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element.
 *
 * If jQuery is available, `angular.element` is an alias for the
 * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element`
 * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or "jqLite."
 *
 * <div class="alert alert-success">jqLite is a tiny, API-compatible subset of jQuery that allows
 * Angular to manipulate the DOM in a cross-browser compatible way. **jqLite** implements only the most
 * commonly needed functionality with the goal of having a very small footprint.</div>
 *
 * To use jQuery, simply load it before `DOMContentLoaded` event fired.
 *
 * <div class="alert">**Note:** all element references in Angular are always wrapped with jQuery or
 * jqLite; they are never raw DOM references.</div>
 *
 * ## Angular's jqLite
 * jqLite provides only the following jQuery methods:
 *
 * - [`addClass()`](http://api.jquery.com/addClass/)
 * - [`after()`](http://api.jquery.com/after/)
 * - [`append()`](http://api.jquery.com/append/)
 * - [`attr()`](http://api.jquery.com/attr/)
 * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData
 * - [`children()`](http://api.jquery.com/children/) - Does not support selectors
 * - [`clone()`](http://api.jquery.com/clone/)
 * - [`contents()`](http://api.jquery.com/contents/)
 * - [`css()`](http://api.jquery.com/css/)
 * - [`data()`](http://api.jquery.com/data/)
 * - [`empty()`](http://api.jquery.com/empty/)
 * - [`eq()`](http://api.jquery.com/eq/)
 * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name
 * - [`hasClass()`](http://api.jquery.com/hasClass/)
 * - [`html()`](http://api.jquery.com/html/)
 * - [`next()`](http://api.jquery.com/next/) - Does not support selectors
 * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData
 * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces or selectors
 * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors
 * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors
 * - [`prepend()`](http://api.jquery.com/prepend/)
 * - [`prop()`](http://api.jquery.com/prop/)
 * - [`ready()`](http://api.jquery.com/ready/)
 * - [`remove()`](http://api.jquery.com/remove/)
 * - [`removeAttr()`](http://api.jquery.com/removeAttr/)
 * - [`removeClass()`](http://api.jquery.com/removeClass/)
 * - [`removeData()`](http://api.jquery.com/removeData/)
 * - [`replaceWith()`](http://api.jquery.com/replaceWith/)
 * - [`text()`](http://api.jquery.com/text/)
 * - [`toggleClass()`](http://api.jquery.com/toggleClass/)
 * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers.
 * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces
 * - [`val()`](http://api.jquery.com/val/)
 * - [`wrap()`](http://api.jquery.com/wrap/)
 *
 * ## jQuery/jqLite Extras
 * Angular also provides the following additional methods and events to both jQuery and jqLite:
 *
 * ### Events
 * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event
 *    on all DOM nodes being removed.  This can be used to clean up any 3rd party bindings to the DOM
 *    element before it is removed.
 *
 * ### Methods
 * - `controller(name)` - retrieves the controller of the current element or its parent. By default
 *   retrieves controller associated with the `ngController` directive. If `name` is provided as
 *   camelCase directive name, then the controller for this directive will be retrieved (e.g.
 *   `'ngModel'`).
 * - `injector()` - retrieves the injector of the current element or its parent.
 * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current
 *   element or its parent.
 * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the
 *   current element. This getter should be used only on elements that contain a directive which starts a new isolate
 *   scope. Calling `scope()` on this element always returns the original non-isolate scope.
 * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top
 *   parent element is reached.
 *
 * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery.
 * @returns {Object} jQuery object.
 */

JQLite.expando = 'ng339';

var jqCache = JQLite.cache = {},
    jqId = 1,
    addEventListenerFn = (window.document.addEventListener
      ? function(element, type, fn) {element.addEventListener(type, fn, false);}
      : function(element, type, fn) {element.attachEvent('on' + type, fn);}),
    removeEventListenerFn = (window.document.removeEventListener
      ? function(element, type, fn) {element.removeEventListener(type, fn, false); }
      : function(element, type, fn) {element.detachEvent('on' + type, fn); });

/*
 * !!! This is an undocumented "private" function !!!
 */
var jqData = JQLite._data = function(node) {
  //jQuery always returns an object on cache miss
  return this.cache[node[this.expando]] || {};
};

function jqNextId() { return ++jqId; }


var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g;
var MOZ_HACK_REGEXP = /^moz([A-Z])/;
var jqLiteMinErr = minErr('jqLite');

/**
 * Converts snake_case to camelCase.
 * Also there is special case for Moz prefix starting with upper case letter.
 * @param name Name to normalize
 */
function camelCase(name) {
  return name.
    replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {
      return offset ? letter.toUpperCase() : letter;
    }).
    replace(MOZ_HACK_REGEXP, 'Moz$1');
}

/////////////////////////////////////////////
// jQuery mutation patch
//
// In conjunction with bindJQuery intercepts all jQuery's DOM destruction apis and fires a
// $destroy event on all DOM nodes being removed.
//
/////////////////////////////////////////////

function jqLitePatchJQueryRemove(name, dispatchThis, filterElems, getterIfNoArguments) {
  var originalJqFn = jQuery.fn[name];
  originalJqFn = originalJqFn.$original || originalJqFn;
  removePatch.$original = originalJqFn;
  jQuery.fn[name] = removePatch;

  function removePatch(param) {
    // jshint -W040
    var list = filterElems && param ? [this.filter(param)] : [this],
        fireEvent = dispatchThis,
        set, setIndex, setLength,
        element, childIndex, childLength, children;

    if (!getterIfNoArguments || param != null) {
      while(list.length) {
        set = list.shift();
        for(setIndex = 0, setLength = set.length; setIndex < setLength; setIndex++) {
          element = jqLite(set[setIndex]);
          if (fireEvent) {
            element.triggerHandler('$destroy');
          } else {
            fireEvent = !fireEvent;
          }
          for(childIndex = 0, childLength = (children = element.children()).length;
              childIndex < childLength;
              childIndex++) {
            list.push(jQuery(children[childIndex]));
          }
        }
      }
    }
    return originalJqFn.apply(this, arguments);
  }
}

var SINGLE_TAG_REGEXP = /^<(\w+)\s*\/?>(?:<\/\1>|)$/;
var HTML_REGEXP = /<|&#?\w+;/;
var TAG_NAME_REGEXP = /<([\w:]+)/;
var XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi;

var wrapMap = {
  'option': [1, '<select multiple="multiple">', '</select>'],

  'thead': [1, '<table>', '</table>'],
  'col': [2, '<table><colgroup>', '</colgroup></table>'],
  'tr': [2, '<table><tbody>', '</tbody></table>'],
  'td': [3, '<table><tbody><tr>', '</tr></tbody></table>'],
  '_default': [0, "", ""]
};

wrapMap.optgroup = wrapMap.option;
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td;

function jqLiteIsTextNode(html) {
  return !HTML_REGEXP.test(html);
}

function jqLiteBuildFragment(html, context) {
  var elem, tmp, tag, wrap,
      fragment = context.createDocumentFragment(),
      nodes = [], i, j, jj;

  if (jqLiteIsTextNode(html)) {
    // Convert non-html into a text node
    nodes.push(context.createTextNode(html));
  } else {
    tmp = fragment.appendChild(context.createElement('div'));
    // Convert html into DOM nodes
    tag = (TAG_NAME_REGEXP.exec(html) || ["", ""])[1].toLowerCase();
    wrap = wrapMap[tag] || wrapMap._default;
    tmp.innerHTML = '<div>&#160;</div>' +
      wrap[1] + html.replace(XHTML_TAG_REGEXP, "<$1></$2>") + wrap[2];
    tmp.removeChild(tmp.firstChild);

    // Descend through wrappers to the right content
    i = wrap[0];
    while (i--) {
      tmp = tmp.lastChild;
    }

    for (j=0, jj=tmp.childNodes.length; j<jj; ++j) nodes.push(tmp.childNodes[j]);

    tmp = fragment.firstChild;
    tmp.textContent = "";
  }

  // Remove wrapper from fragment
  fragment.textContent = "";
  fragment.innerHTML = ""; // Clear inner HTML
  return nodes;
}

function jqLiteParseHTML(html, context) {
  context = context || document;
  var parsed;

  if ((parsed = SINGLE_TAG_REGEXP.exec(html))) {
    return [context.createElement(parsed[1])];
  }

  return jqLiteBuildFragment(html, context);
}

/////////////////////////////////////////////
function JQLite(element) {
  if (element instanceof JQLite) {
    return element;
  }
  if (isString(element)) {
    element = trim(element);
  }
  if (!(this instanceof JQLite)) {
    if (isString(element) && element.charAt(0) != '<') {
      throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element');
    }
    return new JQLite(element);
  }

  if (isString(element)) {
    jqLiteAddNodes(this, jqLiteParseHTML(element));
    var fragment = jqLite(document.createDocumentFragment());
    fragment.append(this);
  } else {
    jqLiteAddNodes(this, element);
  }
}

function jqLiteClone(element) {
  return element.cloneNode(true);
}

function jqLiteDealoc(element){
  jqLiteRemoveData(element);
  for ( var i = 0, children = element.childNodes || []; i < children.length; i++) {
    jqLiteDealoc(children[i]);
  }
}

function jqLiteOff(element, type, fn, unsupported) {
  if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument');

  var events = jqLiteExpandoStore(element, 'events'),
      handle = jqLiteExpandoStore(element, 'handle');

  if (!handle) return; //no listeners registered

  if (isUndefined(type)) {
    forEach(events, function(eventHandler, type) {
      removeEventListenerFn(element, type, eventHandler);
      delete events[type];
    });
  } else {
    forEach(type.split(' '), function(type) {
      if (isUndefined(fn)) {
        removeEventListenerFn(element, type, events[type]);
        delete events[type];
      } else {
        arrayRemove(events[type] || [], fn);
      }
    });
  }
}

function jqLiteRemoveData(element, name) {
  var expandoId = element.ng339,
      expandoStore = jqCache[expandoId];

  if (expandoStore) {
    if (name) {
      delete jqCache[expandoId].data[name];
      return;
    }

    if (expandoStore.handle) {
      expandoStore.events.$destroy && expandoStore.handle({}, '$destroy');
      jqLiteOff(element);
    }
    delete jqCache[expandoId];
    element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it
  }
}

function jqLiteExpandoStore(element, key, value) {
  var expandoId = element.ng339,
      expandoStore = jqCache[expandoId || -1];

  if (isDefined(value)) {
    if (!expandoStore) {
      element.ng339 = expandoId = jqNextId();
      expandoStore = jqCache[expandoId] = {};
    }
    expandoStore[key] = value;
  } else {
    return expandoStore && expandoStore[key];
  }
}

function jqLiteData(element, key, value) {
  var data = jqLiteExpandoStore(element, 'data'),
      isSetter = isDefined(value),
      keyDefined = !isSetter && isDefined(key),
      isSimpleGetter = keyDefined && !isObject(key);

  if (!data && !isSimpleGetter) {
    jqLiteExpandoStore(element, 'data', data = {});
  }

  if (isSetter) {
    data[key] = value;
  } else {
    if (keyDefined) {
      if (isSimpleGetter) {
        // don't create data in this case.
        return data && data[key];
      } else {
        extend(data, key);
      }
    } else {
      return data;
    }
  }
}

function jqLiteHasClass(element, selector) {
  if (!element.getAttribute) return false;
  return ((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " ").
      indexOf( " " + selector + " " ) > -1);
}

function jqLiteRemoveClass(element, cssClasses) {
  if (cssClasses && element.setAttribute) {
    forEach(cssClasses.split(' '), function(cssClass) {
      element.setAttribute('class', trim(
          (" " + (element.getAttribute('class') || '') + " ")
          .replace(/[\n\t]/g, " ")
          .replace(" " + trim(cssClass) + " ", " "))
      );
    });
  }
}

function jqLiteAddClass(element, cssClasses) {
  if (cssClasses && element.setAttribute) {
    var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ')
                            .replace(/[\n\t]/g, " ");

    forEach(cssClasses.split(' '), function(cssClass) {
      cssClass = trim(cssClass);
      if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) {
        existingClasses += cssClass + ' ';
      }
    });

    element.setAttribute('class', trim(existingClasses));
  }
}

function jqLiteAddNodes(root, elements) {
  if (elements) {
    elements = (!elements.nodeName && isDefined(elements.length) && !isWindow(elements))
      ? elements
      : [ elements ];
    for(var i=0; i < elements.length; i++) {
      root.push(elements[i]);
    }
  }
}

function jqLiteController(element, name) {
  return jqLiteInheritedData(element, '$' + (name || 'ngController' ) + 'Controller');
}

function jqLiteInheritedData(element, name, value) {
  // if element is the document object work with the html element instead
  // this makes $(document).scope() possible
  if(element.nodeType == 9) {
    element = element.documentElement;
  }
  var names = isArray(name) ? name : [name];

  while (element) {
    for (var i = 0, ii = names.length; i < ii; i++) {
      if ((value = jqLite.data(element, names[i])) !== undefined) return value;
    }

    // If dealing with a document fragment node with a host element, and no parent, use the host
    // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM
    // to lookup parent controllers.
    element = element.parentNode || (element.nodeType === 11 && element.host);
  }
}

function jqLiteEmpty(element) {
  for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) {
    jqLiteDealoc(childNodes[i]);
  }
  while (element.firstChild) {
    element.removeChild(element.firstChild);
  }
}

//////////////////////////////////////////
// Functions which are declared directly.
//////////////////////////////////////////
var JQLitePrototype = JQLite.prototype = {
  ready: function(fn) {
    var fired = false;

    function trigger() {
      if (fired) return;
      fired = true;
      fn();
    }

    // check if document already is loaded
    if (document.readyState === 'complete'){
      setTimeout(trigger);
    } else {
      this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9
      // we can not use jqLite since we are not done loading and jQuery could be loaded later.
      // jshint -W064
      JQLite(window).on('load', trigger); // fallback to window.onload for others
      // jshint +W064
    }
  },
  toString: function() {
    var value = [];
    forEach(this, function(e){ value.push('' + e);});
    return '[' + value.join(', ') + ']';
  },

  eq: function(index) {
      return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]);
  },

  length: 0,
  push: push,
  sort: [].sort,
  splice: [].splice
};

//////////////////////////////////////////
// Functions iterating getter/setters.
// these functions return self on setter and
// value on get.
//////////////////////////////////////////
var BOOLEAN_ATTR = {};
forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) {
  BOOLEAN_ATTR[lowercase(value)] = value;
});
var BOOLEAN_ELEMENTS = {};
forEach('input,select,option,textarea,button,form,details'.split(','), function(value) {
  BOOLEAN_ELEMENTS[uppercase(value)] = true;
});

function getBooleanAttrName(element, name) {
  // check dom last since we will most likely fail on name
  var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];

  // booleanAttr is here twice to minimize DOM access
  return booleanAttr && BOOLEAN_ELEMENTS[element.nodeName] && booleanAttr;
}

forEach({
  data: jqLiteData,
  removeData: jqLiteRemoveData
}, function(fn, name) {
  JQLite[name] = fn;
});

forEach({
  data: jqLiteData,
  inheritedData: jqLiteInheritedData,

  scope: function(element) {
    // Can't use jqLiteData here directly so we stay compatible with jQuery!
    return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']);
  },

  isolateScope: function(element) {
    // Can't use jqLiteData here directly so we stay compatible with jQuery!
    return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate');
  },

  controller: jqLiteController,

  injector: function(element) {
    return jqLiteInheritedData(element, '$injector');
  },

  removeAttr: function(element,name) {
    element.removeAttribute(name);
  },

  hasClass: jqLiteHasClass,

  css: function(element, name, value) {
    name = camelCase(name);

    if (isDefined(value)) {
      element.style[name] = value;
    } else {
      var val;

      if (msie <= 8) {
        // this is some IE specific weirdness that jQuery 1.6.4 does not sure why
        val = element.currentStyle && element.currentStyle[name];
        if (val === '') val = 'auto';
      }

      val = val || element.style[name];

      if (msie <= 8) {
        // jquery weirdness :-/
        val = (val === '') ? undefined : val;
      }

      return  val;
    }
  },

  attr: function(element, name, value){
    var lowercasedName = lowercase(name);
    if (BOOLEAN_ATTR[lowercasedName]) {
      if (isDefined(value)) {
        if (!!value) {
          element[name] = true;
          element.setAttribute(name, lowercasedName);
        } else {
          element[name] = false;
          element.removeAttribute(lowercasedName);
        }
      } else {
        return (element[name] ||
                 (element.attributes.getNamedItem(name)|| noop).specified)
               ? lowercasedName
               : undefined;
      }
    } else if (isDefined(value)) {
      element.setAttribute(name, value);
    } else if (element.getAttribute) {
      // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code
      // some elements (e.g. Document) don't have get attribute, so return undefined
      var ret = element.getAttribute(name, 2);
      // normalize non-existing attributes to undefined (as jQuery)
      return ret === null ? undefined : ret;
    }
  },

  prop: function(element, name, value) {
    if (isDefined(value)) {
      element[name] = value;
    } else {
      return element[name];
    }
  },

  text: (function() {
    var NODE_TYPE_TEXT_PROPERTY = [];
    if (msie < 9) {
      NODE_TYPE_TEXT_PROPERTY[1] = 'innerText';    /** Element **/
      NODE_TYPE_TEXT_PROPERTY[3] = 'nodeValue';    /** Text **/
    } else {
      NODE_TYPE_TEXT_PROPERTY[1] =                 /** Element **/
      NODE_TYPE_TEXT_PROPERTY[3] = 'textContent';  /** Text **/
    }
    getText.$dv = '';
    return getText;

    function getText(element, value) {
      var textProp = NODE_TYPE_TEXT_PROPERTY[element.nodeType];
      if (isUndefined(value)) {
        return textProp ? element[textProp] : '';
      }
      element[textProp] = value;
    }
  })(),

  val: function(element, value) {
    if (isUndefined(value)) {
      if (nodeName_(element) === 'SELECT' && element.multiple) {
        var result = [];
        forEach(element.options, function (option) {
          if (option.selected) {
            result.push(option.value || option.text);
          }
        });
        return result.length === 0 ? null : result;
      }
      return element.value;
    }
    element.value = value;
  },

  html: function(element, value) {
    if (isUndefined(value)) {
      return element.innerHTML;
    }
    for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) {
      jqLiteDealoc(childNodes[i]);
    }
    element.innerHTML = value;
  },

  empty: jqLiteEmpty
}, function(fn, name){
  /**
   * Properties: writes return selection, reads return first value
   */
  JQLite.prototype[name] = function(arg1, arg2) {
    var i, key;
    var nodeCount = this.length;

    // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it
    // in a way that survives minification.
    // jqLiteEmpty takes no arguments but is a setter.
    if (fn !== jqLiteEmpty &&
        (((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2) === undefined)) {
      if (isObject(arg1)) {

        // we are a write, but the object properties are the key/values
        for (i = 0; i < nodeCount; i++) {
          if (fn === jqLiteData) {
            // data() takes the whole object in jQuery
            fn(this[i], arg1);
          } else {
            for (key in arg1) {
              fn(this[i], key, arg1[key]);
            }
          }
        }
        // return self for chaining
        return this;
      } else {
        // we are a read, so read the first child.
        // TODO: do we still need this?
        var value = fn.$dv;
        // Only if we have $dv do we iterate over all, otherwise it is just the first element.
        var jj = (value === undefined) ? Math.min(nodeCount, 1) : nodeCount;
        for (var j = 0; j < jj; j++) {
          var nodeValue = fn(this[j], arg1, arg2);
          value = value ? value + nodeValue : nodeValue;
        }
        return value;
      }
    } else {
      // we are a write, so apply to all children
      for (i = 0; i < nodeCount; i++) {
        fn(this[i], arg1, arg2);
      }
      // return self for chaining
      return this;
    }
  };
});

function createEventHandler(element, events) {
  var eventHandler = function (event, type) {
    if (!event.preventDefault) {
      event.preventDefault = function() {
        event.returnValue = false; //ie
      };
    }

    if (!event.stopPropagation) {
      event.stopPropagation = function() {
        event.cancelBubble = true; //ie
      };
    }

    if (!event.target) {
      event.target = event.srcElement || document;
    }

    if (isUndefined(event.defaultPrevented)) {
      var prevent = event.preventDefault;
      event.preventDefault = function() {
        event.defaultPrevented = true;
        prevent.call(event);
      };
      event.defaultPrevented = false;
    }

    event.isDefaultPrevented = function() {
      return event.defaultPrevented || event.returnValue === false;
    };

    // Copy event handlers in case event handlers array is modified during execution.
    var eventHandlersCopy = shallowCopy(events[type || event.type] || []);

    forEach(eventHandlersCopy, function(fn) {
      fn.call(element, event);
    });

    // Remove monkey-patched methods (IE),
    // as they would cause memory leaks in IE8.
    if (msie <= 8) {
      // IE7/8 does not allow to delete property on native object
      event.preventDefault = null;
      event.stopPropagation = null;
      event.isDefaultPrevented = null;
    } else {
      // It shouldn't affect normal browsers (native methods are defined on prototype).
      delete event.preventDefault;
      delete event.stopPropagation;
      delete event.isDefaultPrevented;
    }
  };
  eventHandler.elem = element;
  return eventHandler;
}

//////////////////////////////////////////
// Functions iterating traversal.
// These functions chain results into a single
// selector.
//////////////////////////////////////////
forEach({
  removeData: jqLiteRemoveData,

  dealoc: jqLiteDealoc,

  on: function onFn(element, type, fn, unsupported){
    if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters');

    var events = jqLiteExpandoStore(element, 'events'),
        handle = jqLiteExpandoStore(element, 'handle');

    if (!events) jqLiteExpandoStore(element, 'events', events = {});
    if (!handle) jqLiteExpandoStore(element, 'handle', handle = createEventHandler(element, events));

    forEach(type.split(' '), function(type){
      var eventFns = events[type];

      if (!eventFns) {
        if (type == 'mouseenter' || type == 'mouseleave') {
          var contains = document.body.contains || document.body.compareDocumentPosition ?
          function( a, b ) {
            // jshint bitwise: false
            var adown = a.nodeType === 9 ? a.documentElement : a,
            bup = b && b.parentNode;
            return a === bup || !!( bup && bup.nodeType === 1 && (
              adown.contains ?
              adown.contains( bup ) :
              a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
              ));
            } :
            function( a, b ) {
              if ( b ) {
                while ( (b = b.parentNode) ) {
                  if ( b === a ) {
                    return true;
                  }
                }
              }
              return false;
            };

          events[type] = [];

          // Refer to jQuery's implementation of mouseenter & mouseleave
          // Read about mouseenter and mouseleave:
          // http://www.quirksmode.org/js/events_mouse.html#link8
          var eventmap = { mouseleave : "mouseout", mouseenter : "mouseover"};

          onFn(element, eventmap[type], function(event) {
            var target = this, related = event.relatedTarget;
            // For mousenter/leave call the handler if related is outside the target.
            // NB: No relatedTarget if the mouse left/entered the browser window
            if ( !related || (related !== target && !contains(target, related)) ){
              handle(event, type);
            }
          });

        } else {
          addEventListenerFn(element, type, handle);
          events[type] = [];
        }
        eventFns = events[type];
      }
      eventFns.push(fn);
    });
  },

  off: jqLiteOff,

  one: function(element, type, fn) {
    element = jqLite(element);

    //add the listener twice so that when it is called
    //you can remove the original function and still be
    //able to call element.off(ev, fn) normally
    element.on(type, function onFn() {
      element.off(type, fn);
      element.off(type, onFn);
    });
    element.on(type, fn);
  },

  replaceWith: function(element, replaceNode) {
    var index, parent = element.parentNode;
    jqLiteDealoc(element);
    forEach(new JQLite(replaceNode), function(node){
      if (index) {
        parent.insertBefore(node, index.nextSibling);
      } else {
        parent.replaceChild(node, element);
      }
      index = node;
    });
  },

  children: function(element) {
    var children = [];
    forEach(element.childNodes, function(element){
      if (element.nodeType === 1)
        children.push(element);
    });
    return children;
  },

  contents: function(element) {
    return element.contentDocument || element.childNodes || [];
  },

  append: function(element, node) {
    forEach(new JQLite(node), function(child){
      if (element.nodeType === 1 || element.nodeType === 11) {
        element.appendChild(child);
      }
    });
  },

  prepend: function(element, node) {
    if (element.nodeType === 1) {
      var index = element.firstChild;
      forEach(new JQLite(node), function(child){
        element.insertBefore(child, index);
      });
    }
  },

  wrap: function(element, wrapNode) {
    wrapNode = jqLite(wrapNode)[0];
    var parent = element.parentNode;
    if (parent) {
      parent.replaceChild(wrapNode, element);
    }
    wrapNode.appendChild(element);
  },

  remove: function(element) {
    jqLiteDealoc(element);
    var parent = element.parentNode;
    if (parent) parent.removeChild(element);
  },

  after: function(element, newElement) {
    var index = element, parent = element.parentNode;
    forEach(new JQLite(newElement), function(node){
      parent.insertBefore(node, index.nextSibling);
      index = node;
    });
  },

  addClass: jqLiteAddClass,
  removeClass: jqLiteRemoveClass,

  toggleClass: function(element, selector, condition) {
    if (selector) {
      forEach(selector.split(' '), function(className){
        var classCondition = condition;
        if (isUndefined(classCondition)) {
          classCondition = !jqLiteHasClass(element, className);
        }
        (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className);
      });
    }
  },

  parent: function(element) {
    var parent = element.parentNode;
    return parent && parent.nodeType !== 11 ? parent : null;
  },

  next: function(element) {
    if (element.nextElementSibling) {
      return element.nextElementSibling;
    }

    // IE8 doesn't have nextElementSibling
    var elm = element.nextSibling;
    while (elm != null && elm.nodeType !== 1) {
      elm = elm.nextSibling;
    }
    return elm;
  },

  find: function(element, selector) {
    if (element.getElementsByTagName) {
      return element.getElementsByTagName(selector);
    } else {
      return [];
    }
  },

  clone: jqLiteClone,

  triggerHandler: function(element, event, extraParameters) {

    var dummyEvent, eventFnsCopy, handlerArgs;
    var eventName = event.type || event;
    var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName];

    if (eventFns) {

      // Create a dummy event to pass to the handlers
      dummyEvent = {
        preventDefault: function() { this.defaultPrevented = true; },
        isDefaultPrevented: function() { return this.defaultPrevented === true; },
        stopPropagation: noop,
        type: eventName,
        target: element
      };

      // If a custom event was provided then extend our dummy event with it
      if (event.type) {
        dummyEvent = extend(dummyEvent, event);
      }

      // Copy event handlers in case event handlers array is modified during execution.
      eventFnsCopy = shallowCopy(eventFns);
      handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent];

      forEach(eventFnsCopy, function(fn) {
        fn.apply(element, handlerArgs);
      });

    }
  }
}, function(fn, name){
  /**
   * chaining functions
   */
  JQLite.prototype[name] = function(arg1, arg2, arg3) {
    var value;
    for(var i=0; i < this.length; i++) {
      if (isUndefined(value)) {
        value = fn(this[i], arg1, arg2, arg3);
        if (isDefined(value)) {
          // any function which returns a value needs to be wrapped
          value = jqLite(value);
        }
      } else {
        jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3));
      }
    }
    return isDefined(value) ? value : this;
  };

  // bind legacy bind/unbind to on/off
  JQLite.prototype.bind = JQLite.prototype.on;
  JQLite.prototype.unbind = JQLite.prototype.off;
});

/**
 * Computes a hash of an 'obj'.
 * Hash of a:
 *  string is string
 *  number is number as string
 *  object is either result of calling $$hashKey function on the object or uniquely generated id,
 *         that is also assigned to the $$hashKey property of the object.
 *
 * @param obj
 * @returns {string} hash string such that the same input will have the same hash string.
 *         The resulting string key is in 'type:hashKey' format.
 */
function hashKey(obj, nextUidFn) {
  var objType = typeof obj,
      key;

  if (objType == 'function' || (objType == 'object' && obj !== null)) {
    if (typeof (key = obj.$$hashKey) == 'function') {
      // must invoke on object to keep the right this
      key = obj.$$hashKey();
    } else if (key === undefined) {
      key = obj.$$hashKey = (nextUidFn || nextUid)();
    }
  } else {
    key = obj;
  }

  return objType + ':' + key;
}

/**
 * HashMap which can use objects as keys
 */
function HashMap(array, isolatedUid) {
  if (isolatedUid) {
    var uid = 0;
    this.nextUid = function() {
      return ++uid;
    };
  }
  forEach(array, this.put, this);
}
HashMap.prototype = {
  /**
   * Store key value pair
   * @param key key to store can be any type
   * @param value value to store can be any type
   */
  put: function(key, value) {
    this[hashKey(key, this.nextUid)] = value;
  },

  /**
   * @param key
   * @returns {Object} the value for the key
   */
  get: function(key) {
    return this[hashKey(key, this.nextUid)];
  },

  /**
   * Remove the key/value pair
   * @param key
   */
  remove: function(key) {
    var value = this[key = hashKey(key, this.nextUid)];
    delete this[key];
    return value;
  }
};

/**
 * @ngdoc function
 * @module ng
 * @name angular.injector
 * @kind function
 *
 * @description
 * Creates an injector function that can be used for retrieving services as well as for
 * dependency injection (see {@link guide/di dependency injection}).
 *

 * @param {Array.<string|Function>} modules A list of module functions or their aliases. See
 *        {@link angular.module}. The `ng` module must be explicitly added.
 * @returns {function()} Injector function. See {@link auto.$injector $injector}.
 *
 * @example
 * Typical usage
 * ```js
 *   // create an injector
 *   var $injector = angular.injector(['ng']);
 *
 *   // use the injector to kick off your application
 *   // use the type inference to auto inject arguments, or use implicit injection
 *   $injector.invoke(function($rootScope, $compile, $document){
 *     $compile($document)($rootScope);
 *     $rootScope.$digest();
 *   });
 * ```
 *
 * Sometimes you want to get access to the injector of a currently running Angular app
 * from outside Angular. Perhaps, you want to inject and compile some markup after the
 * application has been bootstrapped. You can do this using the extra `injector()` added
 * to JQuery/jqLite elements. See {@link angular.element}.
 *
 * *This is fairly rare but could be the case if a third party library is injecting the
 * markup.*
 *
 * In the following example a new block of HTML containing a `ng-controller`
 * directive is added to the end of the document body by JQuery. We then compile and link
 * it into the current AngularJS scope.
 *
 * ```js
 * var $div = $('<div ng-controller="MyCtrl">{{content.label}}</div>');
 * $(document.body).append($div);
 *
 * angular.element(document).injector().invoke(function($compile) {
 *   var scope = angular.element($div).scope();
 *   $compile($div)(scope);
 * });
 * ```
 */


/**
 * @ngdoc module
 * @name auto
 * @description
 *
 * Implicit module which gets automatically added to each {@link auto.$injector $injector}.
 */

var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
var FN_ARG_SPLIT = /,/;
var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/;
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
var $injectorMinErr = minErr('$injector');
function annotate(fn) {
  var $inject,
      fnText,
      argDecl,
      last;

  if (typeof fn === 'function') {
    if (!($inject = fn.$inject)) {
      $inject = [];
      if (fn.length) {
        fnText = fn.toString().replace(STRIP_COMMENTS, '');
        argDecl = fnText.match(FN_ARGS);
        forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){
          arg.replace(FN_ARG, function(all, underscore, name){
            $inject.push(name);
          });
        });
      }
      fn.$inject = $inject;
    }
  } else if (isArray(fn)) {
    last = fn.length - 1;
    assertArgFn(fn[last], 'fn');
    $inject = fn.slice(0, last);
  } else {
    assertArgFn(fn, 'fn', true);
  }
  return $inject;
}

///////////////////////////////////////

/**
 * @ngdoc service
 * @name $injector
 * @kind function
 *
 * @description
 *
 * `$injector` is used to retrieve object instances as defined by
 * {@link auto.$provide provider}, instantiate types, invoke methods,
 * and load modules.
 *
 * The following always holds true:
 *
 * ```js
 *   var $injector = angular.injector();
 *   expect($injector.get('$injector')).toBe($injector);
 *   expect($injector.invoke(function($injector){
 *     return $injector;
 *   }).toBe($injector);
 * ```
 *
 * # Injection Function Annotation
 *
 * JavaScript does not have annotations, and annotations are needed for dependency injection. The
 * following are all valid ways of annotating function with injection arguments and are equivalent.
 *
 * ```js
 *   // inferred (only works if code not minified/obfuscated)
 *   $injector.invoke(function(serviceA){});
 *
 *   // annotated
 *   function explicit(serviceA) {};
 *   explicit.$inject = ['serviceA'];
 *   $injector.invoke(explicit);
 *
 *   // inline
 *   $injector.invoke(['serviceA', function(serviceA){}]);
 * ```
 *
 * ## Inference
 *
 * In JavaScript calling `toString()` on a function returns the function definition. The definition
 * can then be parsed and the function arguments can be extracted. *NOTE:* This does not work with
 * minification, and obfuscation tools since these tools change the argument names.
 *
 * ## `$inject` Annotation
 * By adding an `$inject` property onto a function the injection parameters can be specified.
 *
 * ## Inline
 * As an array of injection names, where the last item in the array is the function to call.
 */

/**
 * @ngdoc method
 * @name $injector#get
 *
 * @description
 * Return an instance of the service.
 *
 * @param {string} name The name of the instance to retrieve.
 * @return {*} The instance.
 */

/**
 * @ngdoc method
 * @name $injector#invoke
 *
 * @description
 * Invoke the method and supply the method arguments from the `$injector`.
 *
 * @param {!Function} fn The function to invoke. Function parameters are injected according to the
 *   {@link guide/di $inject Annotation} rules.
 * @param {Object=} self The `this` for the invoked method.
 * @param {Object=} locals Optional object. If preset then any argument names are read from this
 *                         object first, before the `$injector` is consulted.
 * @returns {*} the value returned by the invoked `fn` function.
 */

/**
 * @ngdoc method
 * @name $injector#has
 *
 * @description
 * Allows the user to query if the particular service exists.
 *
 * @param {string} Name of the service to query.
 * @returns {boolean} returns true if injector has given service.
 */

/**
 * @ngdoc method
 * @name $injector#instantiate
 * @description
 * Create a new instance of JS type. The method takes a constructor function, invokes the new
 * operator, and supplies all of the arguments to the constructor function as specified by the
 * constructor annotation.
 *
 * @param {Function} Type Annotated constructor function.
 * @param {Object=} locals Optional object. If preset then any argument names are read from this
 * object first, before the `$injector` is consulted.
 * @returns {Object} new instance of `Type`.
 */

/**
 * @ngdoc method
 * @name $injector#annotate
 *
 * @description
 * Returns an array of service names which the function is requesting for injection. This API is
 * used by the injector to determine which services need to be injected into the function when the
 * function is invoked. There are three ways in which the function can be annotated with the needed
 * dependencies.
 *
 * # Argument names
 *
 * The simplest form is to extract the dependencies from the arguments of the function. This is done
 * by converting the function into a string using `toString()` method and extracting the argument
 * names.
 * ```js
 *   // Given
 *   function MyController($scope, $route) {
 *     // ...
 *   }
 *
 *   // Then
 *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
 * ```
 *
 * This method does not work with code minification / obfuscation. For this reason the following
 * annotation strategies are supported.
 *
 * # The `$inject` property
 *
 * If a function has an `$inject` property and its value is an array of strings, then the strings
 * represent names of services to be injected into the function.
 * ```js
 *   // Given
 *   var MyController = function(obfuscatedScope, obfuscatedRoute) {
 *     // ...
 *   }
 *   // Define function dependencies
 *   MyController['$inject'] = ['$scope', '$route'];
 *
 *   // Then
 *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
 * ```
 *
 * # The array notation
 *
 * It is often desirable to inline Injected functions and that's when setting the `$inject` property
 * is very inconvenient. In these situations using the array notation to specify the dependencies in
 * a way that survives minification is a better choice:
 *
 * ```js
 *   // We wish to write this (not minification / obfuscation safe)
 *   injector.invoke(function($compile, $rootScope) {
 *     // ...
 *   });
 *
 *   // We are forced to write break inlining
 *   var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {
 *     // ...
 *   };
 *   tmpFn.$inject = ['$compile', '$rootScope'];
 *   injector.invoke(tmpFn);
 *
 *   // To better support inline function the inline annotation is supported
 *   injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {
 *     // ...
 *   }]);
 *
 *   // Therefore
 *   expect(injector.annotate(
 *      ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])
 *    ).toEqual(['$compile', '$rootScope']);
 * ```
 *
 * @param {Function|Array.<string|Function>} fn Function for which dependent service names need to
 * be retrieved as described above.
 *
 * @returns {Array.<string>} The names of the services which the function requires.
 */




/**
 * @ngdoc service
 * @name $provide
 *
 * @description
 *
 * The {@link auto.$provide $provide} service has a number of methods for registering components
 * with the {@link auto.$injector $injector}. Many of these functions are also exposed on
 * {@link angular.Module}.
 *
 * An Angular **service** is a singleton object created by a **service factory**.  These **service
 * factories** are functions which, in turn, are created by a **service provider**.
 * The **service providers** are constructor functions. When instantiated they must contain a
 * property called `$get`, which holds the **service factory** function.
 *
 * When you request a service, the {@link auto.$injector $injector} is responsible for finding the
 * correct **service provider**, instantiating it and then calling its `$get` **service factory**
 * function to get the instance of the **service**.
 *
 * Often services have no configuration options and there is no need to add methods to the service
 * provider.  The provider will be no more than a constructor function with a `$get` property. For
 * these cases the {@link auto.$provide $provide} service has additional helper methods to register
 * services without specifying a provider.
 *
 * * {@link auto.$provide#provider provider(provider)} - registers a **service provider** with the
 *     {@link auto.$injector $injector}
 * * {@link auto.$provide#constant constant(obj)} - registers a value/object that can be accessed by
 *     providers and services.
 * * {@link auto.$provide#value value(obj)} - registers a value/object that can only be accessed by
 *     services, not providers.
 * * {@link auto.$provide#factory factory(fn)} - registers a service **factory function**, `fn`,
 *     that will be wrapped in a **service provider** object, whose `$get` property will contain the
 *     given factory function.
 * * {@link auto.$provide#service service(class)} - registers a **constructor function**, `class`
 *     that will be wrapped in a **service provider** object, whose `$get` property will instantiate
 *      a new object using the given constructor function.
 *
 * See the individual methods for more information and examples.
 */

/**
 * @ngdoc method
 * @name $provide#provider
 * @description
 *
 * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions
 * are constructor functions, whose instances are responsible for "providing" a factory for a
 * service.
 *
 * Service provider names start with the name of the service they provide followed by `Provider`.
 * For example, the {@link ng.$log $log} service has a provider called
 * {@link ng.$logProvider $logProvider}.
 *
 * Service provider objects can have additional methods which allow configuration of the provider
 * and its service. Importantly, you can configure what kind of service is created by the `$get`
 * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a
 * method {@link ng.$logProvider#debugEnabled debugEnabled}
 * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the
 * console or not.
 *
 * @param {string} name The name of the instance. NOTE: the provider will be available under `name +
                        'Provider'` key.
 * @param {(Object|function())} provider If the provider is:
 *
 *   - `Object`: then it should have a `$get` method. The `$get` method will be invoked using
 *     {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created.
 *   - `Constructor`: a new instance of the provider will be created using
 *     {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`.
 *
 * @returns {Object} registered provider instance

 * @example
 *
 * The following example shows how to create a simple event tracking service and register it using
 * {@link auto.$provide#provider $provide.provider()}.
 *
 * ```js
 *  // Define the eventTracker provider
 *  function EventTrackerProvider() {
 *    var trackingUrl = '/track';
 *
 *    // A provider method for configuring where the tracked events should been saved
 *    this.setTrackingUrl = function(url) {
 *      trackingUrl = url;
 *    };
 *
 *    // The service factory function
 *    this.$get = ['$http', function($http) {
 *      var trackedEvents = {};
 *      return {
 *        // Call this to track an event
 *        event: function(event) {
 *          var count = trackedEvents[event] || 0;
 *          count += 1;
 *          trackedEvents[event] = count;
 *          return count;
 *        },
 *        // Call this to save the tracked events to the trackingUrl
 *        save: function() {
 *          $http.post(trackingUrl, trackedEvents);
 *        }
 *      };
 *    }];
 *  }
 *
 *  describe('eventTracker', function() {
 *    var postSpy;
 *
 *    beforeEach(module(function($provide) {
 *      // Register the eventTracker provider
 *      $provide.provider('eventTracker', EventTrackerProvider);
 *    }));
 *
 *    beforeEach(module(function(eventTrackerProvider) {
 *      // Configure eventTracker provider
 *      eventTrackerProvider.setTrackingUrl('/custom-track');
 *    }));
 *
 *    it('tracks events', inject(function(eventTracker) {
 *      expect(eventTracker.event('login')).toEqual(1);
 *      expect(eventTracker.event('login')).toEqual(2);
 *    }));
 *
 *    it('saves to the tracking url', inject(function(eventTracker, $http) {
 *      postSpy = spyOn($http, 'post');
 *      eventTracker.event('login');
 *      eventTracker.save();
 *      expect(postSpy).toHaveBeenCalled();
 *      expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track');
 *      expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track');
 *      expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 });
 *    }));
 *  });
 * ```
 */

/**
 * @ngdoc method
 * @name $provide#factory
 * @description
 *
 * Register a **service factory**, which will be called to return the service instance.
 * This is short for registering a service where its provider consists of only a `$get` property,
 * which is the given service factory function.
 * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to
 * configure your service in a provider.
 *
 * @param {string} name The name of the instance.
 * @param {function()} $getFn The $getFn for the instance creation. Internally this is a short hand
 *                            for `$provide.provider(name, {$get: $getFn})`.
 * @returns {Object} registered provider instance
 *
 * @example
 * Here is an example of registering a service
 * ```js
 *   $provide.factory('ping', ['$http', function($http) {
 *     return function ping() {
 *       return $http.send('/ping');
 *     };
 *   }]);
 * ```
 * You would then inject and use this service like this:
 * ```js
 *   someModule.controller('Ctrl', ['ping', function(ping) {
 *     ping();
 *   }]);
 * ```
 */


/**
 * @ngdoc method
 * @name $provide#service
 * @description
 *
 * Register a **service constructor**, which will be invoked with `new` to create the service
 * instance.
 * This is short for registering a service where its provider's `$get` property is the service
 * constructor function that will be used to instantiate the service instance.
 *
 * You should use {@link auto.$provide#service $provide.service(class)} if you define your service
 * as a type/class.
 *
 * @param {string} name The name of the instance.
 * @param {Function} constructor A class (constructor function) that will be instantiated.
 * @returns {Object} registered provider instance
 *
 * @example
 * Here is an example of registering a service using
 * {@link auto.$provide#service $provide.service(class)}.
 * ```js
 *   var Ping = function($http) {
 *     this.$http = $http;
 *   };
 *
 *   Ping.$inject = ['$http'];
 *
 *   Ping.prototype.send = function() {
 *     return this.$http.get('/ping');
 *   };
 *   $provide.service('ping', Ping);
 * ```
 * You would then inject and use this service like this:
 * ```js
 *   someModule.controller('Ctrl', ['ping', function(ping) {
 *     ping.send();
 *   }]);
 * ```
 */


/**
 * @ngdoc method
 * @name $provide#value
 * @description
 *
 * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a
 * number, an array, an object or a function.  This is short for registering a service where its
 * provider's `$get` property is a factory function that takes no arguments and returns the **value
 * service**.
 *
 * Value services are similar to constant services, except that they cannot be injected into a
 * module configuration function (see {@link angular.Module#config}) but they can be overridden by
 * an Angular
 * {@link auto.$provide#decorator decorator}.
 *
 * @param {string} name The name of the instance.
 * @param {*} value The value.
 * @returns {Object} registered provider instance
 *
 * @example
 * Here are some examples of creating value services.
 * ```js
 *   $provide.value('ADMIN_USER', 'admin');
 *
 *   $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 });
 *
 *   $provide.value('halfOf', function(value) {
 *     return value / 2;
 *   });
 * ```
 */


/**
 * @ngdoc method
 * @name $provide#constant
 * @description
 *
 * Register a **constant service**, such as a string, a number, an array, an object or a function,
 * with the {@link auto.$injector $injector}. Unlike {@link auto.$provide#value value} it can be
 * injected into a module configuration function (see {@link angular.Module#config}) and it cannot
 * be overridden by an Angular {@link auto.$provide#decorator decorator}.
 *
 * @param {string} name The name of the constant.
 * @param {*} value The constant value.
 * @returns {Object} registered instance
 *
 * @example
 * Here a some examples of creating constants:
 * ```js
 *   $provide.constant('SHARD_HEIGHT', 306);
 *
 *   $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']);
 *
 *   $provide.constant('double', function(value) {
 *     return value * 2;
 *   });
 * ```
 */


/**
 * @ngdoc method
 * @name $provide#decorator
 * @description
 *
 * Register a **service decorator** with the {@link auto.$injector $injector}. A service decorator
 * intercepts the creation of a service, allowing it to override or modify the behaviour of the
 * service. The object returned by the decorator may be the original service, or a new service
 * object which replaces or wraps and delegates to the original service.
 *
 * @param {string} name The name of the service to decorate.
 * @param {function()} decorator This function will be invoked when the service needs to be
 *    instantiated and should return the decorated service instance. The function is called using
 *    the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable.
 *    Local injection arguments:
 *
 *    * `$delegate` - The original service instance, which can be monkey patched, configured,
 *      decorated or delegated to.
 *
 * @example
 * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting
 * calls to {@link ng.$log#error $log.warn()}.
 * ```js
 *   $provide.decorator('$log', ['$delegate', function($delegate) {
 *     $delegate.warn = $delegate.error;
 *     return $delegate;
 *   }]);
 * ```
 */


function createInjector(modulesToLoad) {
  var INSTANTIATING = {},
      providerSuffix = 'Provider',
      path = [],
      loadedModules = new HashMap([], true),
      providerCache = {
        $provide: {
            provider: supportObject(provider),
            factory: supportObject(factory),
            service: supportObject(service),
            value: supportObject(value),
            constant: supportObject(constant),
            decorator: decorator
          }
      },
      providerInjector = (providerCache.$injector =
          createInternalInjector(providerCache, function() {
            throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- '));
          })),
      instanceCache = {},
      instanceInjector = (instanceCache.$injector =
          createInternalInjector(instanceCache, function(servicename) {
            var provider = providerInjector.get(servicename + providerSuffix);
            return instanceInjector.invoke(provider.$get, provider);
          }));


  forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); });

  return instanceInjector;

  ////////////////////////////////////
  // $provider
  ////////////////////////////////////

  function supportObject(delegate) {
    return function(key, value) {
      if (isObject(key)) {
        forEach(key, reverseParams(delegate));
      } else {
        return delegate(key, value);
      }
    };
  }

  function provider(name, provider_) {
    assertNotHasOwnProperty(name, 'service');
    if (isFunction(provider_) || isArray(provider_)) {
      provider_ = providerInjector.instantiate(provider_);
    }
    if (!provider_.$get) {
      throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name);
    }
    return providerCache[name + providerSuffix] = provider_;
  }

  function factory(name, factoryFn) { return provider(name, { $get: factoryFn }); }

  function service(name, constructor) {
    return factory(name, ['$injector', function($injector) {
      return $injector.instantiate(constructor);
    }]);
  }

  function value(name, val) { return factory(name, valueFn(val)); }

  function constant(name, value) {
    assertNotHasOwnProperty(name, 'constant');
    providerCache[name] = value;
    instanceCache[name] = value;
  }

  function decorator(serviceName, decorFn) {
    var origProvider = providerInjector.get(serviceName + providerSuffix),
        orig$get = origProvider.$get;

    origProvider.$get = function() {
      var origInstance = instanceInjector.invoke(orig$get, origProvider);
      return instanceInjector.invoke(decorFn, null, {$delegate: origInstance});
    };
  }

  ////////////////////////////////////
  // Module Loading
  ////////////////////////////////////
  function loadModules(modulesToLoad){
    var runBlocks = [], moduleFn, invokeQueue, i, ii;
    forEach(modulesToLoad, function(module) {
      if (loadedModules.get(module)) return;
      loadedModules.put(module, true);

      try {
        if (isString(module)) {
          moduleFn = angularModule(module);
          runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks);

          for(invokeQueue = moduleFn._invokeQueue, i = 0, ii = invokeQueue.length; i < ii; i++) {
            var invokeArgs = invokeQueue[i],
                provider = providerInjector.get(invokeArgs[0]);

            provider[invokeArgs[1]].apply(provider, invokeArgs[2]);
          }
        } else if (isFunction(module)) {
            runBlocks.push(providerInjector.invoke(module));
        } else if (isArray(module)) {
            runBlocks.push(providerInjector.invoke(module));
        } else {
          assertArgFn(module, 'module');
        }
      } catch (e) {
        if (isArray(module)) {
          module = module[module.length - 1];
        }
        if (e.message && e.stack && e.stack.indexOf(e.message) == -1) {
          // Safari & FF's stack traces don't contain error.message content
          // unlike those of Chrome and IE
          // So if stack doesn't contain message, we create a new string that contains both.
          // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here.
          /* jshint -W022 */
          e = e.message + '\n' + e.stack;
        }
        throw $injectorMinErr('modulerr', "Failed to instantiate module {0} due to:\n{1}",
                  module, e.stack || e.message || e);
      }
    });
    return runBlocks;
  }

  ////////////////////////////////////
  // internal Injector
  ////////////////////////////////////

  function createInternalInjector(cache, factory) {

    function getService(serviceName) {
      if (cache.hasOwnProperty(serviceName)) {
        if (cache[serviceName] === INSTANTIATING) {
          throw $injectorMinErr('cdep', 'Circular dependency found: {0}',
                    serviceName + ' <- ' + path.join(' <- '));
        }
        return cache[serviceName];
      } else {
        try {
          path.unshift(serviceName);
          cache[serviceName] = INSTANTIATING;
          return cache[serviceName] = factory(serviceName);
        } catch (err) {
          if (cache[serviceName] === INSTANTIATING) {
            delete cache[serviceName];
          }
          throw err;
        } finally {
          path.shift();
        }
      }
    }

    function invoke(fn, self, locals){
      var args = [],
          $inject = annotate(fn),
          length, i,
          key;

      for(i = 0, length = $inject.length; i < length; i++) {
        key = $inject[i];
        if (typeof key !== 'string') {
          throw $injectorMinErr('itkn',
                  'Incorrect injection token! Expected service name as string, got {0}', key);
        }
        args.push(
          locals && locals.hasOwnProperty(key)
          ? locals[key]
          : getService(key)
        );
      }
      if (isArray(fn)) {
        fn = fn[length];
      }

      // http://jsperf.com/angularjs-invoke-apply-vs-switch
      // #5388
      return fn.apply(self, args);
    }

    function instantiate(Type, locals) {
      var Constructor = function() {},
          instance, returnedValue;

      // Check if Type is annotated and use just the given function at n-1 as parameter
      // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]);
      Constructor.prototype = (isArray(Type) ? Type[Type.length - 1] : Type).prototype;
      instance = new Constructor();
      returnedValue = invoke(Type, instance, locals);

      return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance;
    }

    return {
      invoke: invoke,
      instantiate: instantiate,
      get: getService,
      annotate: annotate,
      has: function(name) {
        return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name);
      }
    };
  }
}

/**
 * @ngdoc service
 * @name $anchorScroll
 * @kind function
 * @requires $window
 * @requires $location
 * @requires $rootScope
 *
 * @description
 * When called, it checks current value of `$location.hash()` and scrolls to the related element,
 * according to rules specified in
 * [Html5 spec](http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document).
 *
 * It also watches the `$location.hash()` and scrolls whenever it changes to match any anchor.
 * This can be disabled by calling `$anchorScrollProvider.disableAutoScrolling()`.
 *
 * @example
   <example>
     <file name="index.html">
       <div id="scrollArea" ng-controller="ScrollCtrl">
         <a ng-click="gotoBottom()">Go to bottom</a>
         <a id="bottom"></a> You're at the bottom!
       </div>
     </file>
     <file name="script.js">
       function ScrollCtrl($scope, $location, $anchorScroll) {
         $scope.gotoBottom = function (){
           // set the location.hash to the id of
           // the element you wish to scroll to.
           $location.hash('bottom');

           // call $anchorScroll()
           $anchorScroll();
         };
       }
     </file>
     <file name="style.css">
       #scrollArea {
         height: 350px;
         overflow: auto;
       }

       #bottom {
         display: block;
         margin-top: 2000px;
       }
     </file>
   </example>
 */
function $AnchorScrollProvider() {

  var autoScrollingEnabled = true;

  this.disableAutoScrolling = function() {
    autoScrollingEnabled = false;
  };

  this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) {
    var document = $window.document;

    // helper function to get first anchor from a NodeList
    // can't use filter.filter, as it accepts only instances of Array
    // and IE can't convert NodeList to an array using [].slice
    // TODO(vojta): use filter if we change it to accept lists as well
    function getFirstAnchor(list) {
      var result = null;
      forEach(list, function(element) {
        if (!result && lowercase(element.nodeName) === 'a') result = element;
      });
      return result;
    }

    function scroll() {
      var hash = $location.hash(), elm;

      // empty hash, scroll to the top of the page
      if (!hash) $window.scrollTo(0, 0);

      // element with given id
      else if ((elm = document.getElementById(hash))) elm.scrollIntoView();

      // first anchor with given name :-D
      else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) elm.scrollIntoView();

      // no element and hash == 'top', scroll to the top of the page
      else if (hash === 'top') $window.scrollTo(0, 0);
    }

    // does not scroll when user clicks on anchor link that is currently on
    // (no url change, no $location.hash() change), browser native does scroll
    if (autoScrollingEnabled) {
      $rootScope.$watch(function autoScrollWatch() {return $location.hash();},
        function autoScrollWatchAction() {
          $rootScope.$evalAsync(scroll);
        });
    }

    return scroll;
  }];
}

var $animateMinErr = minErr('$animate');

/**
 * @ngdoc provider
 * @name $animateProvider
 *
 * @description
 * Default implementation of $animate that doesn't perform any animations, instead just
 * synchronously performs DOM
 * updates and calls done() callbacks.
 *
 * In order to enable animations the ngAnimate module has to be loaded.
 *
 * To see the functional implementation check out src/ngAnimate/animate.js
 */
var $AnimateProvider = ['$provide', function($provide) {


  this.$$selectors = {};


  /**
   * @ngdoc method
   * @name $animateProvider#register
   *
   * @description
   * Registers a new injectable animation factory function. The factory function produces the
   * animation object which contains callback functions for each event that is expected to be
   * animated.
   *
   *   * `eventFn`: `function(Element, doneFunction)` The element to animate, the `doneFunction`
   *   must be called once the element animation is complete. If a function is returned then the
   *   animation service will use this function to cancel the animation whenever a cancel event is
   *   triggered.
   *
   *
   * ```js
   *   return {
     *     eventFn : function(element, done) {
     *       //code to run the animation
     *       //once complete, then run done()
     *       return function cancellationFunction() {
     *         //code to cancel the animation
     *       }
     *     }
     *   }
   * ```
   *
   * @param {string} name The name of the animation.
   * @param {Function} factory The factory function that will be executed to return the animation
   *                           object.
   */
  this.register = function(name, factory) {
    var key = name + '-animation';
    if (name && name.charAt(0) != '.') throw $animateMinErr('notcsel',
        "Expecting class selector starting with '.' got '{0}'.", name);
    this.$$selectors[name.substr(1)] = key;
    $provide.factory(key, factory);
  };

  /**
   * @ngdoc method
   * @name $animateProvider#classNameFilter
   *
   * @description
   * Sets and/or returns the CSS class regular expression that is checked when performing
   * an animation. Upon bootstrap the classNameFilter value is not set at all and will
   * therefore enable $animate to attempt to perform an animation on any element.
   * When setting the classNameFilter value, animations will only be performed on elements
   * that successfully match the filter expression. This in turn can boost performance
   * for low-powered devices as well as applications containing a lot of structural operations.
   * @param {RegExp=} expression The className expression which will be checked against all animations
   * @return {RegExp} The current CSS className expression value. If null then there is no expression value
   */
  this.classNameFilter = function(expression) {
    if(arguments.length === 1) {
      this.$$classNameFilter = (expression instanceof RegExp) ? expression : null;
    }
    return this.$$classNameFilter;
  };

  this.$get = ['$timeout', '$$asyncCallback', function($timeout, $$asyncCallback) {

    function async(fn) {
      fn && $$asyncCallback(fn);
    }

    /**
     *
     * @ngdoc service
     * @name $animate
     * @description The $animate service provides rudimentary DOM manipulation functions to
     * insert, remove and move elements within the DOM, as well as adding and removing classes.
     * This service is the core service used by the ngAnimate $animator service which provides
     * high-level animation hooks for CSS and JavaScript.
     *
     * $animate is available in the AngularJS core, however, the ngAnimate module must be included
     * to enable full out animation support. Otherwise, $animate will only perform simple DOM
     * manipulation operations.
     *
     * To learn more about enabling animation support, click here to visit the {@link ngAnimate
     * ngAnimate module page} as well as the {@link ngAnimate.$animate ngAnimate $animate service
     * page}.
     */
    return {

      /**
       *
       * @ngdoc method
       * @name $animate#enter
       * @kind function
       * @description Inserts the element into the DOM either after the `after` element or within
       *   the `parent` element. Once complete, the done() callback will be fired (if provided).
       * @param {DOMElement} element the element which will be inserted into the DOM
       * @param {DOMElement} parent the parent element which will append the element as
       *   a child (if the after element is not present)
       * @param {DOMElement} after the sibling element which will append the element
       *   after itself
       * @param {Function=} done callback function that will be called after the element has been
       *   inserted into the DOM
       */
      enter : function(element, parent, after, done) {
        if (after) {
          after.after(element);
        } else {
          if (!parent || !parent[0]) {
            parent = after.parent();
          }
          parent.append(element);
        }
        async(done);
      },

      /**
       *
       * @ngdoc method
       * @name $animate#leave
       * @kind function
       * @description Removes the element from the DOM. Once complete, the done() callback will be
       *   fired (if provided).
       * @param {DOMElement} element the element which will be removed from the DOM
       * @param {Function=} done callback function that will be called after the element has been
       *   removed from the DOM
       */
      leave : function(element, done) {
        element.remove();
        async(done);
      },

      /**
       *
       * @ngdoc method
       * @name $animate#move
       * @kind function
       * @description Moves the position of the provided element within the DOM to be placed
       * either after the `after` element or inside of the `parent` element. Once complete, the
       * done() callback will be fired (if provided).
       *
       * @param {DOMElement} element the element which will be moved around within the
       *   DOM
       * @param {DOMElement} parent the parent element where the element will be
       *   inserted into (if the after element is not present)
       * @param {DOMElement} after the sibling element where the element will be
       *   positioned next to
       * @param {Function=} done the callback function (if provided) that will be fired after the
       *   element has been moved to its new position
       */
      move : function(element, parent, after, done) {
        // Do not remove element before insert. Removing will cause data associated with the
        // element to be dropped. Insert will implicitly do the remove.
        this.enter(element, parent, after, done);
      },

      /**
       *
       * @ngdoc method
       * @name $animate#addClass
       * @kind function
       * @description Adds the provided className CSS class value to the provided element. Once
       * complete, the done() callback will be fired (if provided).
       * @param {DOMElement} element the element which will have the className value
       *   added to it
       * @param {string} className the CSS class which will be added to the element
       * @param {Function=} done the callback function (if provided) that will be fired after the
       *   className value has been added to the element
       */
      addClass : function(element, className, done) {
        className = isString(className) ?
                      className :
                      isArray(className) ? className.join(' ') : '';
        forEach(element, function (element) {
          jqLiteAddClass(element, className);
        });
        async(done);
      },

      /**
       *
       * @ngdoc method
       * @name $animate#removeClass
       * @kind function
       * @description Removes the provided className CSS class value from the provided element.
       * Once complete, the done() callback will be fired (if provided).
       * @param {DOMElement} element the element which will have the className value
       *   removed from it
       * @param {string} className the CSS class which will be removed from the element
       * @param {Function=} done the callback function (if provided) that will be fired after the
       *   className value has been removed from the element
       */
      removeClass : function(element, className, done) {
        className = isString(className) ?
                      className :
                      isArray(className) ? className.join(' ') : '';
        forEach(element, function (element) {
          jqLiteRemoveClass(element, className);
        });
        async(done);
      },

      /**
       *
       * @ngdoc method
       * @name $animate#setClass
       * @kind function
       * @description Adds and/or removes the given CSS classes to and from the element.
       * Once complete, the done() callback will be fired (if provided).
       * @param {DOMElement} element the element which will have its CSS classes changed
       *   removed from it
       * @param {string} add the CSS classes which will be added to the element
       * @param {string} remove the CSS class which will be removed from the element
       * @param {Function=} done the callback function (if provided) that will be fired after the
       *   CSS classes have been set on the element
       */
      setClass : function(element, add, remove, done) {
        forEach(element, function (element) {
          jqLiteAddClass(element, add);
          jqLiteRemoveClass(element, remove);
        });
        async(done);
      },

      enabled : noop
    };
  }];
}];

function $$AsyncCallbackProvider(){
  this.$get = ['$$rAF', '$timeout', function($$rAF, $timeout) {
    return $$rAF.supported
      ? function(fn) { return $$rAF(fn); }
      : function(fn) {
        return $timeout(fn, 0, false);
      };
  }];
}

/**
 * ! This is a private undocumented service !
 *
 * @name $browser
 * @requires $log
 * @description
 * This object has two goals:
 *
 * - hide all the global state in the browser caused by the window object
 * - abstract away all the browser specific features and inconsistencies
 *
 * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser`
 * service, which can be used for convenient testing of the application without the interaction with
 * the real browser apis.
 */
/**
 * @param {object} window The global window object.
 * @param {object} document jQuery wrapped document.
 * @param {function()} XHR XMLHttpRequest constructor.
 * @param {object} $log console.log or an object with the same interface.
 * @param {object} $sniffer $sniffer service
 */
function Browser(window, document, $log, $sniffer) {
  var self = this,
      rawDocument = document[0],
      location = window.location,
      history = window.history,
      setTimeout = window.setTimeout,
      clearTimeout = window.clearTimeout,
      pendingDeferIds = {};

  self.isMock = false;

  var outstandingRequestCount = 0;
  var outstandingRequestCallbacks = [];

  // TODO(vojta): remove this temporary api
  self.$$completeOutstandingRequest = completeOutstandingRequest;
  self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; };

  /**
   * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks`
   * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed.
   */
  function completeOutstandingRequest(fn) {
    try {
      fn.apply(null, sliceArgs(arguments, 1));
    } finally {
      outstandingRequestCount--;
      if (outstandingRequestCount === 0) {
        while(outstandingRequestCallbacks.length) {
          try {
            outstandingRequestCallbacks.pop()();
          } catch (e) {
            $log.error(e);
          }
        }
      }
    }
  }

  /**
   * @private
   * Note: this method is used only by scenario runner
   * TODO(vojta): prefix this method with $$ ?
   * @param {function()} callback Function that will be called when no outstanding request
   */
  self.notifyWhenNoOutstandingRequests = function(callback) {
    // force browser to execute all pollFns - this is needed so that cookies and other pollers fire
    // at some deterministic time in respect to the test runner's actions. Leaving things up to the
    // regular poller would result in flaky tests.
    forEach(pollFns, function(pollFn){ pollFn(); });

    if (outstandingRequestCount === 0) {
      callback();
    } else {
      outstandingRequestCallbacks.push(callback);
    }
  };

  //////////////////////////////////////////////////////////////
  // Poll Watcher API
  //////////////////////////////////////////////////////////////
  var pollFns = [],
      pollTimeout;

  /**
   * @name $browser#addPollFn
   *
   * @param {function()} fn Poll function to add
   *
   * @description
   * Adds a function to the list of functions that poller periodically executes,
   * and starts polling if not started yet.
   *
   * @returns {function()} the added function
   */
  self.addPollFn = function(fn) {
    if (isUndefined(pollTimeout)) startPoller(100, setTimeout);
    pollFns.push(fn);
    return fn;
  };

  /**
   * @param {number} interval How often should browser call poll functions (ms)
   * @param {function()} setTimeout Reference to a real or fake `setTimeout` function.
   *
   * @description
   * Configures the poller to run in the specified intervals, using the specified
   * setTimeout fn and kicks it off.
   */
  function startPoller(interval, setTimeout) {
    (function check() {
      forEach(pollFns, function(pollFn){ pollFn(); });
      pollTimeout = setTimeout(check, interval);
    })();
  }

  //////////////////////////////////////////////////////////////
  // URL API
  //////////////////////////////////////////////////////////////

  var lastBrowserUrl = location.href,
      baseElement = document.find('base'),
      newLocation = null;

  /**
   * @name $browser#url
   *
   * @description
   * GETTER:
   * Without any argument, this method just returns current value of location.href.
   *
   * SETTER:
   * With at least one argument, this method sets url to new value.
   * If html5 history api supported, pushState/replaceState is used, otherwise
   * location.href/location.replace is used.
   * Returns its own instance to allow chaining
   *
   * NOTE: this api is intended for use only by the $location service. Please use the
   * {@link ng.$location $location service} to change url.
   *
   * @param {string} url New url (when used as setter)
   * @param {boolean=} replace Should new url replace current history record ?
   */
  self.url = function(url, replace) {
    // Android Browser BFCache causes location, history reference to become stale.
    if (location !== window.location) location = window.location;
    if (history !== window.history) history = window.history;

    // setter
    if (url) {
      if (lastBrowserUrl == url) return;
      lastBrowserUrl = url;
      if ($sniffer.history) {
        if (replace) history.replaceState(null, '', url);
        else {
          history.pushState(null, '', url);
          // Crazy Opera Bug: http://my.opera.com/community/forums/topic.dml?id=1185462
          baseElement.attr('href', baseElement.attr('href'));
        }
      } else {
        newLocation = url;
        if (replace) {
          location.replace(url);
        } else {
          location.href = url;
        }
      }
      return self;
    // getter
    } else {
      // - newLocation is a workaround for an IE7-9 issue with location.replace and location.href
      //   methods not updating location.href synchronously.
      // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172
      return newLocation || location.href.replace(/%27/g,"'");
    }
  };

  var urlChangeListeners = [],
      urlChangeInit = false;

  function fireUrlChange() {
    newLocation = null;
    if (lastBrowserUrl == self.url()) return;

    lastBrowserUrl = self.url();
    forEach(urlChangeListeners, function(listener) {
      listener(self.url());
    });
  }

  /**
   * @name $browser#onUrlChange
   *
   * @description
   * Register callback function that will be called, when url changes.
   *
   * It's only called when the url is changed from outside of angular:
   * - user types different url into address bar
   * - user clicks on history (forward/back) button
   * - user clicks on a link
   *
   * It's not called when url is changed by $browser.url() method
   *
   * The listener gets called with new url as parameter.
   *
   * NOTE: this api is intended for use only by the $location service. Please use the
   * {@link ng.$location $location service} to monitor url changes in angular apps.
   *
   * @param {function(string)} listener Listener function to be called when url changes.
   * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous.
   */
  self.onUrlChange = function(callback) {
    // TODO(vojta): refactor to use node's syntax for events
    if (!urlChangeInit) {
      // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera)
      // don't fire popstate when user change the address bar and don't fire hashchange when url
      // changed by push/replaceState

      // html5 history api - popstate event
      if ($sniffer.history) jqLite(window).on('popstate', fireUrlChange);
      // hashchange event
      if ($sniffer.hashchange) jqLite(window).on('hashchange', fireUrlChange);
      // polling
      else self.addPollFn(fireUrlChange);

      urlChangeInit = true;
    }

    urlChangeListeners.push(callback);
    return callback;
  };

  /**
   * Checks whether the url has changed outside of Angular.
   * Needs to be exported to be able to check for changes that have been done in sync,
   * as hashchange/popstate events fire in async.
   */
  self.$$checkUrlChange = fireUrlChange;

  //////////////////////////////////////////////////////////////
  // Misc API
  //////////////////////////////////////////////////////////////

  /**
   * @name $browser#baseHref
   *
   * @description
   * Returns current <base href>
   * (always relative - without domain)
   *
   * @returns {string} The current base href
   */
  self.baseHref = function() {
    var href = baseElement.attr('href');
    return href ? href.replace(/^(https?\:)?\/\/[^\/]*/, '') : '';
  };

  //////////////////////////////////////////////////////////////
  // Cookies API
  //////////////////////////////////////////////////////////////
  var lastCookies = {};
  var lastCookieString = '';
  var cookiePath = self.baseHref();

  /**
   * @name $browser#cookies
   *
   * @param {string=} name Cookie name
   * @param {string=} value Cookie value
   *
   * @description
   * The cookies method provides a 'private' low level access to browser cookies.
   * It is not meant to be used directly, use the $cookie service instead.
   *
   * The return values vary depending on the arguments that the method was called with as follows:
   *
   * - cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify
   *   it
   * - cookies(name, value) -> set name to value, if value is undefined delete the cookie
   * - cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that
   *   way)
   *
   * @returns {Object} Hash of all cookies (if called without any parameter)
   */
  self.cookies = function(name, value) {
    /* global escape: false, unescape: false */
    var cookieLength, cookieArray, cookie, i, index;

    if (name) {
      if (value === undefined) {
        rawDocument.cookie = escape(name) + "=;path=" + cookiePath +
                                ";expires=Thu, 01 Jan 1970 00:00:00 GMT";
      } else {
        if (isString(value)) {
          cookieLength = (rawDocument.cookie = escape(name) + '=' + escape(value) +
                                ';path=' + cookiePath).length + 1;

          // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum:
          // - 300 cookies
          // - 20 cookies per unique domain
          // - 4096 bytes per cookie
          if (cookieLength > 4096) {
            $log.warn("Cookie '"+ name +
              "' possibly not set or overflowed because it was too large ("+
              cookieLength + " > 4096 bytes)!");
          }
        }
      }
    } else {
      if (rawDocument.cookie !== lastCookieString) {
        lastCookieString = rawDocument.cookie;
        cookieArray = lastCookieString.split("; ");
        lastCookies = {};

        for (i = 0; i < cookieArray.length; i++) {
          cookie = cookieArray[i];
          index = cookie.indexOf('=');
          if (index > 0) { //ignore nameless cookies
            name = unescape(cookie.substring(0, index));
            // the first value that is seen for a cookie is the most
            // specific one.  values for the same cookie name that
            // follow are for less specific paths.
            if (lastCookies[name] === undefined) {
              lastCookies[name] = unescape(cookie.substring(index + 1));
            }
          }
        }
      }
      return lastCookies;
    }
  };


  /**
   * @name $browser#defer
   * @param {function()} fn A function, who's execution should be deferred.
   * @param {number=} [delay=0] of milliseconds to defer the function execution.
   * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`.
   *
   * @description
   * Executes a fn asynchronously via `setTimeout(fn, delay)`.
   *
   * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using
   * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed
   * via `$browser.defer.flush()`.
   *
   */
  self.defer = function(fn, delay) {
    var timeoutId;
    outstandingRequestCount++;
    timeoutId = setTimeout(function() {
      delete pendingDeferIds[timeoutId];
      completeOutstandingRequest(fn);
    }, delay || 0);
    pendingDeferIds[timeoutId] = true;
    return timeoutId;
  };


  /**
   * @name $browser#defer.cancel
   *
   * @description
   * Cancels a deferred task identified with `deferId`.
   *
   * @param {*} deferId Token returned by the `$browser.defer` function.
   * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully
   *                    canceled.
   */
  self.defer.cancel = function(deferId) {
    if (pendingDeferIds[deferId]) {
      delete pendingDeferIds[deferId];
      clearTimeout(deferId);
      completeOutstandingRequest(noop);
      return true;
    }
    return false;
  };

}

function $BrowserProvider(){
  this.$get = ['$window', '$log', '$sniffer', '$document',
      function( $window,   $log,   $sniffer,   $document){
        return new Browser($window, $document, $log, $sniffer);
      }];
}

/**
 * @ngdoc service
 * @name $cacheFactory
 *
 * @description
 * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to
 * them.
 *
 * ```js
 *
 *  var cache = $cacheFactory('cacheId');
 *  expect($cacheFactory.get('cacheId')).toBe(cache);
 *  expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined();
 *
 *  cache.put("key", "value");
 *  cache.put("another key", "another value");
 *
 *  // We've specified no options on creation
 *  expect(cache.info()).toEqual({id: 'cacheId', size: 2});
 *
 * ```
 *
 *
 * @param {string} cacheId Name or id of the newly created cache.
 * @param {object=} options Options object that specifies the cache behavior. Properties:
 *
 *   - `{number=}` `capacity` — turns the cache into LRU cache.
 *
 * @returns {object} Newly created cache object with the following set of methods:
 *
 * - `{object}` `info()` — Returns id, size, and options of cache.
 * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns
 *   it.
 * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss.
 * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache.
 * - `{void}` `removeAll()` — Removes all cached values.
 * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory.
 *
 * @example
   <example module="cacheExampleApp">
     <file name="index.html">
       <div ng-controller="CacheController">
         <input ng-model="newCacheKey" placeholder="Key">
         <input ng-model="newCacheValue" placeholder="Value">
         <button ng-click="put(newCacheKey, newCacheValue)">Cache</button>

         <p ng-if="keys.length">Cached Values</p>
         <div ng-repeat="key in keys">
           <span ng-bind="key"></span>
           <span>: </span>
           <b ng-bind="cache.get(key)"></b>
         </div>

         <p>Cache Info</p>
         <div ng-repeat="(key, value) in cache.info()">
           <span ng-bind="key"></span>
           <span>: </span>
           <b ng-bind="value"></b>
         </div>
       </div>
     </file>
     <file name="script.js">
       angular.module('cacheExampleApp', []).
         controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) {
           $scope.keys = [];
           $scope.cache = $cacheFactory('cacheId');
           $scope.put = function(key, value) {
             if ($scope.cache.get(key) === undefined) {
               $scope.keys.push(key);
             }
             $scope.cache.put(key, value === undefined ? null : value);
           };
         }]);
     </file>
     <file name="style.css">
       p {
         margin: 10px 0 3px;
       }
     </file>
   </example>
 */
function $CacheFactoryProvider() {

  this.$get = function() {
    var caches = {};

    function cacheFactory(cacheId, options) {
      if (cacheId in caches) {
        throw minErr('$cacheFactory')('iid', "CacheId '{0}' is already taken!", cacheId);
      }

      var size = 0,
          stats = extend({}, options, {id: cacheId}),
          data = {},
          capacity = (options && options.capacity) || Number.MAX_VALUE,
          lruHash = {},
          freshEnd = null,
          staleEnd = null;

      /**
       * @ngdoc type
       * @name $cacheFactory.Cache
       *
       * @description
       * A cache object used to store and retrieve data, primarily used by
       * {@link $http $http} and the {@link ng.directive:script script} directive to cache
       * templates and other data.
       *
       * ```js
       *  angular.module('superCache')
       *    .factory('superCache', ['$cacheFactory', function($cacheFactory) {
       *      return $cacheFactory('super-cache');
       *    }]);
       * ```
       *
       * Example test:
       *
       * ```js
       *  it('should behave like a cache', inject(function(superCache) {
       *    superCache.put('key', 'value');
       *    superCache.put('another key', 'another value');
       *
       *    expect(superCache.info()).toEqual({
       *      id: 'super-cache',
       *      size: 2
       *    });
       *
       *    superCache.remove('another key');
       *    expect(superCache.get('another key')).toBeUndefined();
       *
       *    superCache.removeAll();
       *    expect(superCache.info()).toEqual({
       *      id: 'super-cache',
       *      size: 0
       *    });
       *  }));
       * ```
       */
      return caches[cacheId] = {

        /**
         * @ngdoc method
         * @name $cacheFactory.Cache#put
         * @kind function
         *
         * @description
         * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be
         * retrieved later, and incrementing the size of the cache if the key was not already
         * present in the cache. If behaving like an LRU cache, it will also remove stale
         * entries from the set.
         *
         * It will not insert undefined values into the cache.
         *
         * @param {string} key the key under which the cached data is stored.
         * @param {*} value the value to store alongside the key. If it is undefined, the key
         *    will not be stored.
         * @returns {*} the value stored.
         */
        put: function(key, value) {
          if (capacity < Number.MAX_VALUE) {
            var lruEntry = lruHash[key] || (lruHash[key] = {key: key});

            refresh(lruEntry);
          }

          if (isUndefined(value)) return;
          if (!(key in data)) size++;
          data[key] = value;

          if (size > capacity) {
            this.remove(staleEnd.key);
          }

          return value;
        },

        /**
         * @ngdoc method
         * @name $cacheFactory.Cache#get
         * @kind function
         *
         * @description
         * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object.
         *
         * @param {string} key the key of the data to be retrieved
         * @returns {*} the value stored.
         */
        get: function(key) {
          if (capacity < Number.MAX_VALUE) {
            var lruEntry = lruHash[key];

            if (!lruEntry) return;

            refresh(lruEntry);
          }

          return data[key];
        },


        /**
         * @ngdoc method
         * @name $cacheFactory.Cache#remove
         * @kind function
         *
         * @description
         * Removes an entry from the {@link $cacheFactory.Cache Cache} object.
         *
         * @param {string} key the key of the entry to be removed
         */
        remove: function(key) {
          if (capacity < Number.MAX_VALUE) {
            var lruEntry = lruHash[key];

            if (!lruEntry) return;

            if (lruEntry == freshEnd) freshEnd = lruEntry.p;
            if (lruEntry == staleEnd) staleEnd = lruEntry.n;
            link(lruEntry.n,lruEntry.p);

            delete lruHash[key];
          }

          delete data[key];
          size--;
        },


        /**
         * @ngdoc method
         * @name $cacheFactory.Cache#removeAll
         * @kind function
         *
         * @description
         * Clears the cache object of any entries.
         */
        removeAll: function() {
          data = {};
          size = 0;
          lruHash = {};
          freshEnd = staleEnd = null;
        },


        /**
         * @ngdoc method
         * @name $cacheFactory.Cache#destroy
         * @kind function
         *
         * @description
         * Destroys the {@link $cacheFactory.Cache Cache} object entirely,
         * removing it from the {@link $cacheFactory $cacheFactory} set.
         */
        destroy: function() {
          data = null;
          stats = null;
          lruHash = null;
          delete caches[cacheId];
        },


        /**
         * @ngdoc method
         * @name $cacheFactory.Cache#info
         * @kind function
         *
         * @description
         * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}.
         *
         * @returns {object} an object with the following properties:
         *   <ul>
         *     <li>**id**: the id of the cache instance</li>
         *     <li>**size**: the number of entries kept in the cache instance</li>
         *     <li>**...**: any additional properties from the options object when creating the
         *       cache.</li>
         *   </ul>
         */
        info: function() {
          return extend({}, stats, {size: size});
        }
      };


      /**
       * makes the `entry` the freshEnd of the LRU linked list
       */
      function refresh(entry) {
        if (entry != freshEnd) {
          if (!staleEnd) {
            staleEnd = entry;
          } else if (staleEnd == entry) {
            staleEnd = entry.n;
          }

          link(entry.n, entry.p);
          link(entry, freshEnd);
          freshEnd = entry;
          freshEnd.n = null;
        }
      }


      /**
       * bidirectionally links two entries of the LRU linked list
       */
      function link(nextEntry, prevEntry) {
        if (nextEntry != prevEntry) {
          if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify
          if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify
        }
      }
    }


  /**
   * @ngdoc method
   * @name $cacheFactory#info
   *
   * @description
   * Get information about all the caches that have been created
   *
   * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info`
   */
    cacheFactory.info = function() {
      var info = {};
      forEach(caches, function(cache, cacheId) {
        info[cacheId] = cache.info();
      });
      return info;
    };


  /**
   * @ngdoc method
   * @name $cacheFactory#get
   *
   * @description
   * Get access to a cache object by the `cacheId` used when it was created.
   *
   * @param {string} cacheId Name or id of a cache to access.
   * @returns {object} Cache object identified by the cacheId or undefined if no such cache.
   */
    cacheFactory.get = function(cacheId) {
      return caches[cacheId];
    };


    return cacheFactory;
  };
}

/**
 * @ngdoc service
 * @name $templateCache
 *
 * @description
 * The first time a template is used, it is loaded in the template cache for quick retrieval. You
 * can load templates directly into the cache in a `script` tag, or by consuming the
 * `$templateCache` service directly.
 *
 * Adding via the `script` tag:
 *
 * ```html
 *   <script type="text/ng-template" id="templateId.html">
 *     <p>This is the content of the template</p>
 *   </script>
 * ```
 *
 * **Note:** the `script` tag containing the template does not need to be included in the `head` of
 * the document, but it must be below the `ng-app` definition.
 *
 * Adding via the $templateCache service:
 *
 * ```js
 * var myApp = angular.module('myApp', []);
 * myApp.run(function($templateCache) {
 *   $templateCache.put('templateId.html', 'This is the content of the template');
 * });
 * ```
 *
 * To retrieve the template later, simply use it in your HTML:
 * ```html
 * <div ng-include=" 'templateId.html' "></div>
 * ```
 *
 * or get it via Javascript:
 * ```js
 * $templateCache.get('templateId.html')
 * ```
 *
 * See {@link ng.$cacheFactory $cacheFactory}.
 *
 */
function $TemplateCacheProvider() {
  this.$get = ['$cacheFactory', function($cacheFactory) {
    return $cacheFactory('templates');
  }];
}

/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE!
 *
 * DOM-related variables:
 *
 * - "node" - DOM Node
 * - "element" - DOM Element or Node
 * - "$node" or "$element" - jqLite-wrapped node or element
 *
 *
 * Compiler related stuff:
 *
 * - "linkFn" - linking fn of a single directive
 * - "nodeLinkFn" - function that aggregates all linking fns for a particular node
 * - "childLinkFn" -  function that aggregates all linking fns for child nodes of a particular node
 * - "compositeLinkFn" - function that aggregates all linking fns for a compilation root (nodeList)
 */


/**
 * @ngdoc service
 * @name $compile
 * @kind function
 *
 * @description
 * Compiles an HTML string or DOM into a template and produces a template function, which
 * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together.
 *
 * The compilation is a process of walking the DOM tree and matching DOM elements to
 * {@link ng.$compileProvider#directive directives}.
 *
 * <div class="alert alert-warning">
 * **Note:** This document is an in-depth reference of all directive options.
 * For a gentle introduction to directives with examples of common use cases,
 * see the {@link guide/directive directive guide}.
 * </div>
 *
 * ## Comprehensive Directive API
 *
 * There are many different options for a directive.
 *
 * The difference resides in the return value of the factory function.
 * You can either return a "Directive Definition Object" (see below) that defines the directive properties,
 * or just the `postLink` function (all other properties will have the default values).
 *
 * <div class="alert alert-success">
 * **Best Practice:** It's recommended to use the "directive definition object" form.
 * </div>
 *
 * Here's an example directive declared with a Directive Definition Object:
 *
 * ```js
 *   var myModule = angular.module(...);
 *
 *   myModule.directive('directiveName', function factory(injectables) {
 *     var directiveDefinitionObject = {
 *       priority: 0,
 *       template: '<div></div>', // or // function(tElement, tAttrs) { ... },
 *       // or
 *       // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... },
 *       transclude: false,
 *       restrict: 'A',
 *       scope: false,
 *       controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... },
 *       controllerAs: 'stringAlias',
 *       require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'],
 *       compile: function compile(tElement, tAttrs, transclude) {
 *         return {
 *           pre: function preLink(scope, iElement, iAttrs, controller) { ... },
 *           post: function postLink(scope, iElement, iAttrs, controller) { ... }
 *         }
 *         // or
 *         // return function postLink( ... ) { ... }
 *       },
 *       // or
 *       // link: {
 *       //  pre: function preLink(scope, iElement, iAttrs, controller) { ... },
 *       //  post: function postLink(scope, iElement, iAttrs, controller) { ... }
 *       // }
 *       // or
 *       // link: function postLink( ... ) { ... }
 *     };
 *     return directiveDefinitionObject;
 *   });
 * ```
 *
 * <div class="alert alert-warning">
 * **Note:** Any unspecified options will use the default value. You can see the default values below.
 * </div>
 *
 * Therefore the above can be simplified as:
 *
 * ```js
 *   var myModule = angular.module(...);
 *
 *   myModule.directive('directiveName', function factory(injectables) {
 *     var directiveDefinitionObject = {
 *       link: function postLink(scope, iElement, iAttrs) { ... }
 *     };
 *     return directiveDefinitionObject;
 *     // or
 *     // return function postLink(scope, iElement, iAttrs) { ... }
 *   });
 * ```
 *
 *
 *
 * ### Directive Definition Object
 *
 * The directive definition object provides instructions to the {@link ng.$compile
 * compiler}. The attributes are:
 *
 * #### `priority`
 * When there are multiple directives defined on a single DOM element, sometimes it
 * is necessary to specify the order in which the directives are applied. The `priority` is used
 * to sort the directives before their `compile` functions get called. Priority is defined as a
 * number. Directives with greater numerical `priority` are compiled first. Pre-link functions
 * are also run in priority order, but post-link functions are run in reverse order. The order
 * of directives with the same priority is undefined. The default priority is `0`.
 *
 * #### `terminal`
 * If set to true then the current `priority` will be the last set of directives
 * which will execute (any directives at the current priority will still execute
 * as the order of execution on same `priority` is undefined).
 *
 * #### `scope`
 * **If set to `true`,** then a new scope will be created for this directive. If multiple directives on the
 * same element request a new scope, only one new scope is created. The new scope rule does not
 * apply for the root of the template since the root of the template always gets a new scope.
 *
 * **If set to `{}` (object hash),** then a new "isolate" scope is created. The 'isolate' scope differs from
 * normal scope in that it does not prototypically inherit from the parent scope. This is useful
 * when creating reusable components, which should not accidentally read or modify data in the
 * parent scope.
 *
 * The 'isolate' scope takes an object hash which defines a set of local scope properties
 * derived from the parent scope. These local properties are useful for aliasing values for
 * templates. Locals definition is a hash of local scope property to its source:
 *
 * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is
 *   always a string since DOM attributes are strings. If no `attr` name is specified  then the
 *   attribute name is assumed to be the same as the local name.
 *   Given `<widget my-attr="hello {{name}}">` and widget definition
 *   of `scope: { localName:'@myAttr' }`, then widget scope property `localName` will reflect
 *   the interpolated value of `hello {{name}}`. As the `name` attribute changes so will the
 *   `localName` property on the widget scope. The `name` is read from the parent scope (not
 *   component scope).
 *
 * * `=` or `=attr` - set up bi-directional binding between a local scope property and the
 *   parent scope property of name defined via the value of the `attr` attribute. If no `attr`
 *   name is specified then the attribute name is assumed to be the same as the local name.
 *   Given `<widget my-attr="parentModel">` and widget definition of
 *   `scope: { localModel:'=myAttr' }`, then widget scope property `localModel` will reflect the
 *   value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected
 *   in `localModel` and any changes in `localModel` will reflect in `parentModel`. If the parent
 *   scope property doesn't exist, it will throw a NON_ASSIGNABLE_MODEL_EXPRESSION exception. You
 *   can avoid this behavior using `=?` or `=?attr` in order to flag the property as optional.
 *
 * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope.
 *   If no `attr` name is specified then the attribute name is assumed to be the same as the
 *   local name. Given `<widget my-attr="count = count + value">` and widget definition of
 *   `scope: { localFn:'&myAttr' }`, then isolate scope property `localFn` will point to
 *   a function wrapper for the `count = count + value` expression. Often it's desirable to
 *   pass data from the isolated scope via an expression to the parent scope, this can be
 *   done by passing a map of local variable names and values into the expression wrapper fn.
 *   For example, if the expression is `increment(amount)` then we can specify the amount value
 *   by calling the `localFn` as `localFn({amount: 22})`.
 *
 *
 *
 * #### `controller`
 * Controller constructor function. The controller is instantiated before the
 * pre-linking phase and it is shared with other directives (see
 * `require` attribute). This allows the directives to communicate with each other and augment
 * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals:
 *
 * * `$scope` - Current scope associated with the element
 * * `$element` - Current element
 * * `$attrs` - Current attributes object for the element
 * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope.
 *    The scope can be overridden by an optional first argument.
 *   `function([scope], cloneLinkingFn)`.
 *
 *
 * #### `require`
 * Require another directive and inject its controller as the fourth argument to the linking function. The
 * `require` takes a string name (or array of strings) of the directive(s) to pass in. If an array is used, the
 * injected argument will be an array in corresponding order. If no such directive can be
 * found, or if the directive does not have a controller, then an error is raised. The name can be prefixed with:
 *
 * * (no prefix) - Locate the required controller on the current element. Throw an error if not found.
 * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found.
 * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found.
 * * `?^` - Atte
Download .txt
gitextract_hwmsr4en/

├── .bowerrc
├── .gitignore
├── LICENSE
├── README.md
├── bower.json
├── config.xml
├── gulpfile.js
├── hooks/
│   ├── README.md
│   └── after_prepare/
│       └── 010_add_platform_class.js
├── ionic.project
├── package.json
├── scss/
│   └── ionic.app.scss
└── www/
    ├── api/
    │   └── data.json
    ├── css/
    │   └── style.css
    ├── index.html
    ├── js/
    │   └── app.js
    ├── lib/
    │   ├── angular/
    │   │   ├── .bower.json
    │   │   ├── README.md
    │   │   ├── angular-csp.css
    │   │   ├── angular.js
    │   │   ├── angular.min.js.gzip
    │   │   └── bower.json
    │   ├── angular-animate/
    │   │   ├── .bower.json
    │   │   ├── README.md
    │   │   ├── angular-animate.js
    │   │   └── bower.json
    │   ├── angular-sanitize/
    │   │   ├── .bower.json
    │   │   ├── README.md
    │   │   ├── angular-sanitize.js
    │   │   └── bower.json
    │   ├── angular-ui-router/
    │   │   ├── .bower.json
    │   │   ├── CHANGELOG.md
    │   │   ├── LICENSE
    │   │   ├── README.md
    │   │   ├── bower.json
    │   │   ├── release/
    │   │   │   └── angular-ui-router.js
    │   │   └── src/
    │   │       ├── common.js
    │   │       ├── compat.js
    │   │       ├── resolve.js
    │   │       ├── state.js
    │   │       ├── stateDirectives.js
    │   │       ├── stateFilters.js
    │   │       ├── templateFactory.js
    │   │       ├── urlMatcherFactory.js
    │   │       ├── urlRouter.js
    │   │       ├── view.js
    │   │       ├── viewDirective.js
    │   │       └── viewScroll.js
    │   ├── angularfire/
    │   │   ├── .bower.json
    │   │   ├── README.md
    │   │   ├── bower.json
    │   │   └── dist/
    │   │       └── angularfire.js
    │   ├── collide/
    │   │   ├── .bower.json
    │   │   ├── .gitignore
    │   │   ├── README.md
    │   │   ├── bower.json
    │   │   ├── collide.js
    │   │   ├── package.json
    │   │   ├── test/
    │   │   │   ├── animator.spec.js
    │   │   │   ├── core/
    │   │   │   │   └── timeline.spec.js
    │   │   │   └── util/
    │   │   │       └── simple-emitter.spec.js
    │   │   └── test.html
    │   ├── firebase/
    │   │   ├── .bower.json
    │   │   ├── LICENSE
    │   │   ├── README.md
    │   │   ├── bower.json
    │   │   ├── firebase-debug.js
    │   │   └── firebase.js
    │   ├── firebase-simple-login/
    │   │   ├── .bower.json
    │   │   ├── CHANGELOG.md
    │   │   ├── LICENSE
    │   │   ├── README.md
    │   │   ├── firebase-simple-login-debug.js
    │   │   └── firebase-simple-login.js
    │   ├── ionic/
    │   │   ├── .bower.json
    │   │   ├── README.md
    │   │   ├── bower.json
    │   │   ├── css/
    │   │   │   └── ionic.css
    │   │   ├── js/
    │   │   │   ├── ionic-angular.js
    │   │   │   ├── ionic.bundle.js
    │   │   │   └── ionic.js
    │   │   └── scss/
    │   │       ├── _action-sheet.scss
    │   │       ├── _animations.scss
    │   │       ├── _backdrop.scss
    │   │       ├── _badge.scss
    │   │       ├── _bar.scss
    │   │       ├── _button-bar.scss
    │   │       ├── _button.scss
    │   │       ├── _checkbox.scss
    │   │       ├── _form.scss
    │   │       ├── _grid.scss
    │   │       ├── _items.scss
    │   │       ├── _list.scss
    │   │       ├── _loading.scss
    │   │       ├── _menu.scss
    │   │       ├── _mixins.scss
    │   │       ├── _modal.scss
    │   │       ├── _platform.scss
    │   │       ├── _popover.scss
    │   │       ├── _popup.scss
    │   │       ├── _progress.scss
    │   │       ├── _radio.scss
    │   │       ├── _range.scss
    │   │       ├── _reset.scss
    │   │       ├── _scaffolding.scss
    │   │       ├── _select.scss
    │   │       ├── _slide-box.scss
    │   │       ├── _split-pane.scss
    │   │       ├── _tabs.scss
    │   │       ├── _toggle.scss
    │   │       ├── _type.scss
    │   │       ├── _util.scss
    │   │       ├── _variables.scss
    │   │       ├── ionic.scss
    │   │       └── ionicons/
    │   │           ├── _ionicons-animation.scss
    │   │           ├── _ionicons-font.scss
    │   │           ├── _ionicons-icons.scss
    │   │           ├── _ionicons-variables.scss
    │   │           └── ionicons.scss
    │   └── mockfirebase/
    │       ├── .bower.json
    │       ├── CONTRIBUTING.md
    │       ├── MAINTAINING.md
    │       ├── README.md
    │       ├── bower.json
    │       └── dist/
    │           └── mockfirebase.js
    └── views/
        ├── about/
        │   └── about.html
        ├── events/
        │   ├── events.html
        │   └── events.js
        ├── food/
        │   ├── food.html
        │   ├── food.js
        │   └── preview.html
        ├── home/
        │   ├── comments.html
        │   ├── home.html
        │   └── home.js
        ├── local/
        │   ├── beaches.html
        │   ├── food.html
        │   ├── local.html
        │   └── sights.html
        ├── reservation/
        │   ├── reservation.html
        │   └── reservation.js
        ├── tour/
        │   ├── tour.html
        │   └── tour.js
        └── weather/
            ├── weather.html
            └── weather.js
Download .txt
SYMBOL INDEX (1272 symbols across 28 files)

FILE: hooks/after_prepare/010_add_platform_class.js
  function addPlatformBodyTag (line 16) | function addPlatformBodyTag(indexPath, platform) {
  function findBodyTag (line 54) | function findBodyTag(html) {
  function findClassAttr (line 61) | function findClassAttr(bodyTag) {

FILE: www/lib/angular-animate/angular-animate.js
  function extractElementNode (line 317) | function extractElementNode(element) {
  function prepareElement (line 326) | function prepareElement(element) {
  function stripCommentsFromElement (line 330) | function stripCommentsFromElement(element) {
  function isMatchingElement (line 334) | function isMatchingElement(elm1, elm2) {
  function blockElementAnimations (line 363) | function blockElementAnimations(element) {
  function lookup (line 369) | function lookup(name) {
  function animationRunner (line 399) | function animationRunner(element, animationEvent, className) {
  function performAnimation (line 825) | function performAnimation(animationEvent, className, element, parentElem...
  function cancelChildAnimations (line 1032) | function cancelChildAnimations(element) {
  function cleanup (line 1050) | function cleanup(element, className) {
  function animationsDisabled (line 1072) | function animationsDisabled(element, parentElement) {
  function afterReflow (line 1165) | function afterReflow(element, callback) {
  function animationCloseHandler (line 1184) | function animationCloseHandler(element, totalTime) {
  function closeAllAnimations (line 1208) | function closeAllAnimations(elements) {
  function getElementAnimationDetails (line 1217) | function getElementAnimationDetails(element, cacheKey) {
  function parseMaxTime (line 1275) | function parseMaxTime(str) {
  function getCacheKey (line 1286) | function getCacheKey(element) {
  function animateSetup (line 1296) | function animateSetup(animationEvent, element, className, calculationDec...
  function isStructuralAnimation (line 1362) | function isStructuralAnimation(className) {
  function blockTransitions (line 1366) | function blockTransitions(element, className, isAnimating) {
  function blockKeyframeAnimations (line 1374) | function blockKeyframeAnimations(element) {
  function unblockTransitions (line 1378) | function unblockTransitions(element, className) {
  function unblockKeyframeAnimations (line 1387) | function unblockKeyframeAnimations(element) {
  function animateRun (line 1395) | function animateRun(animationEvent, element, className, activeAnimationC...
  function prepareStaggerDelay (line 1502) | function prepareStaggerDelay(delayStyle, staggerDelay, index) {
  function animateBefore (line 1511) | function animateBefore(animationEvent, element, className, calculationDe...
  function animateAfter (line 1519) | function animateAfter(animationEvent, element, className, afterAnimation...
  function animate (line 1528) | function animate(animationEvent, element, className, animationComplete) {
  function animateClose (line 1558) | function animateClose(element, className) {
  function suffixClasses (line 1675) | function suffixClasses(classes, suffix) {

FILE: www/lib/angular-sanitize/angular-sanitize.js
  function $SanitizeProvider (line 140) | function $SanitizeProvider() {
  function sanitizeText (line 152) | function sanitizeText(chars) {
  function makeMap (line 220) | function makeMap(str) {
  function htmlParser (line 239) | function htmlParser( html, handler ) {
  function decodeEntities (line 393) | function decodeEntities(value) {
  function encodeEntities (line 421) | function encodeEntities(value) {
  function htmlSanitizeWriter (line 446) | function htmlSanitizeWriter(buf, uriValidator){
  function addText (line 623) | function addText(text) {
  function addLink (line 630) | function addLink(url, text) {

FILE: www/lib/angular-ui-router/release/angular-ui-router.js
  function inherit (line 27) | function inherit(parent, extra) {
  function merge (line 31) | function merge(dst) {
  function ancestors (line 49) | function ancestors(first, second) {
  function keys (line 65) | function keys(object) {
  function arraySearch (line 84) | function arraySearch(array, value) {
  function inheritParams (line 108) | function inheritParams(currentParams, newParams, $current, $to) {
  function normalize (line 131) | function normalize(keys, values) {
  function equalForKeys (line 150) | function equalForKeys(a, b, keys) {
  function filterByKeys (line 170) | function filterByKeys(keys, values) {
  function $Resolve (line 272) | function $Resolve(  $q,    $injector) {
  function $TemplateFactory (line 516) | function $TemplateFactory(  $http,   $templateCache,   $injector) {
  function UrlMatcher (line 672) | function UrlMatcher(pattern) {
  function $UrlMatcherFactory (line 878) | function $UrlMatcherFactory() {
  function $UrlRouterProvider (line 935) | function $UrlRouterProvider(  $urlMatcherFactory) {
  function $StateProvider (line 1216) | function $StateProvider(   $urlRouterProvider,   $urlMatcherFactory,    ...
  function $ViewProvider (line 2400) | function $ViewProvider() {
  function $ViewScrollProvider (line 2477) | function $ViewScrollProvider() {
  function $ViewDirective (line 2637) | function $ViewDirective(   $state,   $injector,   $uiViewScroll) {
  function $ViewDirectiveFill (line 2767) | function $ViewDirectiveFill ($compile, $controller, $state) {
  function parseStateRef (line 2814) | function parseStateRef(ref) {
  function stateContext (line 2820) | function stateContext(el) {
  function $StateRefDirective (line 2891) | function $StateRefDirective($state, $timeout) {
  function $StateActiveDirective (line 3003) | function $StateActiveDirective($state, $stateParams, $interpolate) {
  function $IsStateFilter (line 3051) | function $IsStateFilter($state) {
  function $IncludedByStateFilter (line 3067) | function $IncludedByStateFilter($state) {
  function $RouteProvider (line 3096) | function $RouteProvider(  $stateProvider,    $urlRouterProvider) {

FILE: www/lib/angular-ui-router/src/common.js
  function inherit (line 14) | function inherit(parent, extra) {
  function merge (line 18) | function merge(dst) {
  function ancestors (line 36) | function ancestors(first, second) {
  function keys (line 52) | function keys(object) {
  function arraySearch (line 71) | function arraySearch(array, value) {
  function inheritParams (line 95) | function inheritParams(currentParams, newParams, $current, $to) {
  function normalize (line 118) | function normalize(keys, values) {
  function equalForKeys (line 137) | function equalForKeys(a, b, keys) {
  function filterByKeys (line 157) | function filterByKeys(keys, values) {

FILE: www/lib/angular-ui-router/src/compat.js
  function $RouteProvider (line 20) | function $RouteProvider(  $stateProvider,    $urlRouterProvider) {

FILE: www/lib/angular-ui-router/src/resolve.js
  function $Resolve (line 12) | function $Resolve(  $q,    $injector) {

FILE: www/lib/angular-ui-router/src/state.js
  function $StateProvider (line 24) | function $StateProvider(   $urlRouterProvider,   $urlMatcherFactory,    ...

FILE: www/lib/angular-ui-router/src/stateDirectives.js
  function parseStateRef (line 1) | function parseStateRef(ref) {
  function stateContext (line 7) | function stateContext(el) {
  function $StateRefDirective (line 78) | function $StateRefDirective($state, $timeout) {
  function $StateActiveDirective (line 190) | function $StateActiveDirective($state, $stateParams, $interpolate) {

FILE: www/lib/angular-ui-router/src/stateFilters.js
  function $IsStateFilter (line 11) | function $IsStateFilter($state) {
  function $IncludedByStateFilter (line 27) | function $IncludedByStateFilter($state) {

FILE: www/lib/angular-ui-router/src/templateFactory.js
  function $TemplateFactory (line 13) | function $TemplateFactory(  $http,   $templateCache,   $injector) {

FILE: www/lib/angular-ui-router/src/urlMatcherFactory.js
  function UrlMatcher (line 59) | function UrlMatcher(pattern, caseInsensitiveMatch) {
  function $UrlMatcherFactory (line 270) | function $UrlMatcherFactory() {

FILE: www/lib/angular-ui-router/src/urlRouter.js
  function $UrlRouterProvider (line 17) | function $UrlRouterProvider(  $urlMatcherFactory) {

FILE: www/lib/angular-ui-router/src/view.js
  function $ViewProvider (line 3) | function $ViewProvider() {

FILE: www/lib/angular-ui-router/src/viewDirective.js
  function $ViewDirective (line 115) | function $ViewDirective(   $state,   $injector,   $uiViewScroll) {
  function $ViewDirectiveFill (line 245) | function $ViewDirectiveFill ($compile, $controller, $state) {

FILE: www/lib/angular-ui-router/src/viewScroll.js
  function $ViewScrollProvider (line 8) | function $ViewScrollProvider() {

FILE: www/lib/angular/angular.js
  function minErr (line 36) | function minErr(module) {
  function isArrayLike (line 268) | function isArrayLike(obj) {
  function forEach (line 312) | function forEach(obj, iterator, context) {
  function sortedKeys (line 340) | function sortedKeys(obj) {
  function forEachSorted (line 350) | function forEachSorted(obj, iterator, context) {
  function reverseParams (line 364) | function reverseParams(iteratorFn) {
  function nextUid (line 376) | function nextUid() {
  function setHashKey (line 404) | function setHashKey(obj, h) {
  function extend (line 427) | function extend(dst) {
  function int (line 441) | function int(str) {
  function inherit (line 446) | function inherit(parent, extra) {
  function noop (line 466) | function noop() {}
  function identity (line 486) | function identity($) {return $;}
  function valueFn (line 490) | function valueFn(value) {return function() {return value;};}
  function isUndefined (line 504) | function isUndefined(value){return typeof value === 'undefined';}
  function isDefined (line 519) | function isDefined(value){return typeof value !== 'undefined';}
  function isObject (line 535) | function isObject(value){return value != null && typeof value === 'objec...
  function isString (line 550) | function isString(value){return typeof value === 'string';}
  function isNumber (line 565) | function isNumber(value){return typeof value === 'number';}
  function isDate (line 580) | function isDate(value) {
  function isFunction (line 618) | function isFunction(value){return typeof value === 'function';}
  function isRegExp (line 628) | function isRegExp(value) {
  function isWindow (line 640) | function isWindow(obj) {
  function isScope (line 645) | function isScope(obj) {
  function isFile (line 650) | function isFile(obj) {
  function isBlob (line 655) | function isBlob(obj) {
  function isBoolean (line 660) | function isBoolean(value) {
  function isPromiseLike (line 665) | function isPromiseLike(obj) {
  function isElement (line 697) | function isElement(node) {
  function makeMap (line 707) | function makeMap(str) {
  function map (line 728) | function map(obj, iterator, context) {
  function size (line 749) | function size(obj, ownPropsOnly) {
  function includes (line 764) | function includes(array, obj) {
  function indexOf (line 768) | function indexOf(array, obj) {
  function arrayRemove (line 777) | function arrayRemove(array, value) {
  function isLeafNode (line 784) | function isLeafNode (node) {
  function copy (line 854) | function copy(source, destination, stackSource, stackDest) {
  function shallowCopy (line 927) | function shallowCopy(src, dst) {
  function equals (line 977) | function equals(o1, o2) {
  function concat (line 1039) | function concat(array1, array2, index) {
  function sliceArgs (line 1043) | function sliceArgs(args, startIndex) {
  function bind (line 1067) | function bind(self, fn) {
  function toJsonReplacer (line 1088) | function toJsonReplacer(key, value) {
  function toJson (line 1119) | function toJson(obj, pretty) {
  function fromJson (line 1137) | function fromJson(json) {
  function toBoolean (line 1144) | function toBoolean(value) {
  function startingTag (line 1159) | function startingTag(element) {
  function tryDecodeURIComponent (line 1191) | function tryDecodeURIComponent(value) {
  function parseKeyValue (line 1204) | function parseKeyValue(/**string*/keyValue) {
  function toKeyValue (line 1225) | function toKeyValue(obj) {
  function encodeUriSegment (line 1253) | function encodeUriSegment(val) {
  function encodeUriQuery (line 1272) | function encodeUriQuery(val, pctEncodeSpaces) {
  function angularInit (line 1328) | function angularInit(element, bootstrap) {
  function bootstrap (line 1426) | function bootstrap(element, modules) {
  function snake_case (line 1472) | function snake_case(name, separator) {
  function bindJQuery (line 1479) | function bindJQuery() {
  function assertArg (line 1507) | function assertArg(arg, name, reason) {
  function assertArgFn (line 1514) | function assertArgFn(arg, name, acceptArrayAnnotation) {
  function assertNotHasOwnProperty (line 1529) | function assertNotHasOwnProperty(name, context) {
  function getter (line 1543) | function getter(obj, path, bindFnToScope) {
  function getBlockElements (line 1567) | function getBlockElements(nodes) {
  function setupModuleLoader (line 1595) | function setupModuleLoader(window) {
  function publishExternalAPI (line 1998) | function publishExternalAPI(angular){
  function jqNextId (line 2233) | function jqNextId() { return ++jqId; }
  function camelCase (line 2245) | function camelCase(name) {
  function jqLitePatchJQueryRemove (line 2261) | function jqLitePatchJQueryRemove(name, dispatchThis, filterElems, getter...
  function jqLiteIsTextNode (line 2315) | function jqLiteIsTextNode(html) {
  function jqLiteBuildFragment (line 2319) | function jqLiteBuildFragment(html, context) {
  function jqLiteParseHTML (line 2354) | function jqLiteParseHTML(html, context) {
  function JQLite (line 2366) | function JQLite(element) {
  function jqLiteClone (line 2389) | function jqLiteClone(element) {
  function jqLiteDealoc (line 2393) | function jqLiteDealoc(element){
  function jqLiteOff (line 2400) | function jqLiteOff(element, type, fn, unsupported) {
  function jqLiteRemoveData (line 2425) | function jqLiteRemoveData(element, name) {
  function jqLiteExpandoStore (line 2444) | function jqLiteExpandoStore(element, key, value) {
  function jqLiteData (line 2459) | function jqLiteData(element, key, value) {
  function jqLiteHasClass (line 2485) | function jqLiteHasClass(element, selector) {
  function jqLiteRemoveClass (line 2491) | function jqLiteRemoveClass(element, cssClasses) {
  function jqLiteAddClass (line 2503) | function jqLiteAddClass(element, cssClasses) {
  function jqLiteAddNodes (line 2519) | function jqLiteAddNodes(root, elements) {
  function jqLiteController (line 2530) | function jqLiteController(element, name) {
  function jqLiteInheritedData (line 2534) | function jqLiteInheritedData(element, name, value) {
  function jqLiteEmpty (line 2554) | function jqLiteEmpty(element) {
  function trigger (line 2570) | function trigger() {
  function getBooleanAttrName (line 2617) | function getBooleanAttrName(element, name) {
  function getText (line 2731) | function getText(element, value) {
  function createEventHandler (line 2818) | function createEventHandler(element, events) {
  function hashKey (line 3139) | function hashKey(obj, nextUidFn) {
  function HashMap (line 3160) | function HashMap(array, isolatedUid) {
  function annotate (line 3264) | function annotate(fn) {
  function createInjector (line 3785) | function createInjector(modulesToLoad) {
  function $AnchorScrollProvider (line 4043) | function $AnchorScrollProvider() {
  function async (line 4178) | function async(fn) {
  function $$AsyncCallbackProvider (line 4341) | function $$AsyncCallbackProvider(){
  function Browser (line 4373) | function Browser(window, document, $log, $sniffer) {
  function $BrowserProvider (line 4734) | function $BrowserProvider(){
  function $CacheFactoryProvider (line 4822) | function $CacheFactoryProvider() {
  function $TemplateCacheProvider (line 5134) | function $TemplateCacheProvider() {
  function $CompileProvider (line 5653) | function $CompileProvider($provide, $$sanitizeUriProvider) {
  function directiveNormalize (line 7130) | function directiveNormalize(name) {
  function nodesetLinkingFn (line 7179) | function nodesetLinkingFn(
  function directiveLinkingFn (line 7186) | function directiveLinkingFn(
  function tokenDifference (line 7194) | function tokenDifference(str1, str2) {
  function $ControllerProvider (line 7220) | function $ControllerProvider() {
  function $DocumentProvider (line 7323) | function $DocumentProvider(){
  function $ExceptionHandlerProvider (line 7361) | function $ExceptionHandlerProvider() {
  function parseHeaders (line 7375) | function parseHeaders(headers) {
  function headersGetter (line 7406) | function headersGetter(headers) {
  function transformData (line 7431) | function transformData(data, headers, fns) {
  function isSuccess (line 7443) | function isSuccess(status) {
  function $HttpProvider (line 7454) | function $HttpProvider() {
  function createXhr (line 8433) | function createXhr(method) {
  function $HttpBackendProvider (line 8463) | function $HttpBackendProvider() {
  function createHttpBackend (line 8469) | function createHttpBackend($browser, createXhr, $browserDefer, callbacks...
  function $InterpolateProvider (line 8684) | function $InterpolateProvider() {
  function $IntervalProvider (line 8896) | function $IntervalProvider() {
  function $LocaleProvider (line 9091) | function $LocaleProvider(){
  function encodePath (line 9164) | function encodePath(path) {
  function parseAbsoluteUrl (line 9175) | function parseAbsoluteUrl(absoluteUrl, locationObj, appBase) {
  function parseAppUrl (line 9184) | function parseAppUrl(relativeUrl, locationObj, appBase) {
  function beginsWith (line 9209) | function beginsWith(begin, whole) {
  function stripHash (line 9216) | function stripHash(url) {
  function stripFile (line 9222) | function stripFile(url) {
  function serverBase (line 9227) | function serverBase(url) {
  function LocationHtml5Url (line 9240) | function LocationHtml5Url(appBase, basePrefix) {
  function LocationHashbangUrl (line 9308) | function LocationHashbangUrl(appBase, hashPrefix) {
  function LocationHashbangInHtml5Url (line 9401) | function LocationHashbangInHtml5Url(appBase, hashPrefix) {
  function locationGetter (line 9658) | function locationGetter(property) {
  function locationGetterSetter (line 9665) | function locationGetterSetter(property, preprocess) {
  function $LocationProvider (line 9710) | function $LocationProvider(){
  function $LogProvider (line 9965) | function $LogProvider(){
  function ensureSafeMemberName (line 10110) | function ensureSafeMemberName(name, fullExpression) {
  function ensureSafeObject (line 10121) | function ensureSafeObject(obj, fullExpression) {
  function ensureSafeFunction (line 10152) | function ensureSafeFunction(obj, fullExpression) {
  function setter (line 10924) | function setter(obj, path, setValue, fullExp, options) {
  function cspSafeGetterFn (line 10965) | function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) {
  function getterFn (line 11069) | function getterFn(path, options, fullExp) {
  function $ParseProvider (line 11192) | function $ParseProvider() {
  function $QProvider (line 11489) | function $QProvider() {
  function qFactory (line 11507) | function qFactory(nextTick, exceptionHandler) {
  function $$RAFProvider (line 11845) | function $$RAFProvider(){ //rAF
  function $RootScopeProvider (line 11944) | function $RootScopeProvider(){
  function $$SanitizeUriProvider (line 13047) | function $$SanitizeUriProvider() {
  function escapeForRegexp (line 13133) | function escapeForRegexp(s) {
  function adjustMatcher (line 13139) | function adjustMatcher(matcher) {
  function adjustMatchers (line 13167) | function adjustMatchers(matchers) {
  function $SceDelegateProvider (line 13245) | function $SceDelegateProvider() {
  function $SceProvider (line 13775) | function $SceProvider() {
  function $SnifferProvider (line 14188) | function $SnifferProvider() {
  function $TimeoutProvider (line 14265) | function $TimeoutProvider() {
  function urlResolve (line 14411) | function urlResolve(url, base) {
  function urlIsSameOrigin (line 14445) | function urlIsSameOrigin(requestUrl) {
  function $WindowProvider (line 14492) | function $WindowProvider(){
  function $FilterProvider (line 14589) | function $FilterProvider($provide) {
  function filterFilter (line 14759) | function filterFilter() {
  function currencyFilter (line 14914) | function currencyFilter($locale) {
  function numberFilter (line 14975) | function numberFilter($locale) {
  function formatNumber (line 14984) | function formatNumber(number, pattern, groupSep, decimalSep, fractionSiz...
  function padNumber (line 15066) | function padNumber(num, digits, trim) {
  function dateGetter (line 15080) | function dateGetter(name, size, offset, trim) {
  function dateStrGetter (line 15091) | function dateStrGetter(name, shortForm) {
  function timeZoneGetter (line 15100) | function timeZoneGetter(date) {
  function ampmGetter (line 15110) | function ampmGetter(date, formats) {
  function dateFilter (line 15230) | function dateFilter($locale) {
  function jsonFilter (line 15329) | function jsonFilter() {
  function limitToFilter (line 15427) | function limitToFilter(){
  function orderByFilter (line 15584) | function orderByFilter($parse){
  function ngDirective (line 15645) | function ngDirective(directive) {
  function FormController (line 16150) | function FormController(element, attrs, $scope, $animate) {
  function validate (line 16968) | function validate(ctrl, validatorName, validity, value){
  function testFlags (line 16973) | function testFlags(validity, flags) {
  function addNativeHtml5Validators (line 16987) | function addNativeHtml5Validators(ctrl, validatorName, badFlags, ignoreF...
  function textInputType (line 17005) | function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function numberInputType (line 17159) | function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function urlInputType (line 17204) | function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function emailInputType (line 17215) | function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function radioInputType (line 17226) | function radioInputType(scope, element, attr, ctrl) {
  function checkboxInputType (line 17248) | function checkboxInputType(scope, element, attr, ctrl) {
  function toggleValidCss (line 17644) | function toggleValidCss(isValid, validationErrorKey) {
  function getStringValue (line 18360) | function getStringValue() {
  function classDirective (line 18372) | function classDirective(name, selector) {
  function getBlockStart (line 20643) | function getBlockStart(block) {
  function getBlockEnd (line 20647) | function getBlockEnd(block) {
  function setupAsSingle (line 21586) | function setupAsSingle(scope, selectElement, ngModelCtrl, selectCtrl) {
  function setupAsMultiple (line 21611) | function setupAsMultiple(scope, selectElement, ctrl) {
  function setupAsOptions (line 21642) | function setupAsOptions(scope, selectElement, ctrl) {

FILE: www/lib/angularfire/dist/angularfire.js
  function FirebaseArray (line 78) | function FirebaseArray($firebase, destroyFn, readyPromise) {
  function FirebaseObject (line 586) | function FirebaseObject($firebase, destroyFn, readyPromise) {
  function ThreeWayBinding (line 823) | function ThreeWayBinding(rec) {
  function _bind (line 842) | function _bind(self) {
  function AngularFire (line 964) | function AngularFire(ref, config) {
  function SyncArray (line 1128) | function SyncArray($inst, ArrayFactory) {
  function SyncObject (line 1188) | function SyncObject($inst, ObjectFactory) {
  function createBatchFn (line 1697) | function createBatchFn(fn, context) {
  function resetTimer (line 1710) | function resetTimer() {
  function runNow (line 1725) | function runNow() {
  function resetTimer (line 1763) | function resetTimer() {
  function runNow (line 1778) | function runNow() {
  function debounced (line 1784) | function debounced() {
  function stripDollarPrefixedKeys (line 2023) | function stripDollarPrefixedKeys(data) {

FILE: www/lib/collide/collide.js
  function s (line 1) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function clamp (line 122) | function clamp(min, n, max) { return Math.max(min, Math.min(n, max)); }
  function Animator (line 126) | function Animator(opts) {
  function figureOutEasing (line 334) | function figureOutEasing(easing) {
  function B1 (line 490) | function B1(t) { return t*t*t; }
  function B2 (line 491) | function B2(t) { return 3*t*t*(1-t); }
  function B3 (line 492) | function B3(t) { return 3*t*(1-t)*(1-t); }
  function B4 (line 493) | function B4(t) { return (1-t)*(1-t)*(1-t); }
  function solveEpsilon (line 512) | function solveEpsilon(duration) {
  function unitBezier (line 524) | function unitBezier(p1x, p1y, p2x, p2y) {
  function dynamicsSpring (line 697) | function dynamicsSpring(opts) {
  function dynamicsGravity (line 742) | function dynamicsGravity(opts) {
  function step (line 906) | function step() {
  function SimpleEventEmitter (line 964) | function SimpleEventEmitter() {
  function onceFn (line 976) | function onceFn() {
  function noop (line 1099) | function noop() {}

FILE: www/lib/collide/test/core/timeline.spec.js
  function mockRaf (line 4) | function mockRaf(cb) {
  function mockTime (line 11) | function mockTime() {

FILE: www/lib/firebase-simple-login/firebase-simple-login-debug.js
  function visitNode (line 204) | function visitNode(path) {
  function tempCtor (line 485) | function tempCtor() {
  function addListener (line 829) | function addListener(w, event, cb) {
  function removeListener (line 838) | function removeListener(w, event, cb) {
  function extractOrigin (line 847) | function extractOrigin(url) {
  function findRelay (line 857) | function findRelay() {
  function cleanup (line 946) | function cleanup() {
  function onMessage (line 966) | function onMessage(e) {
  function doPost (line 1011) | function doPost(msg) {
  function onMessage (line 1019) | function onMessage(e) {
  function onDie (line 1040) | function onDie(e) {
  function e (line 1139) | function e(a) {
  function d (line 1169) | function d(a) {
  function e (line 1172) | function e(a) {
  function c (line 1178) | function c(a) {
  function i (line 1183) | function i(a) {
  function j (line 1188) | function j(a, c) {
  function b (line 1209) | function b() {
  function c (line 1214) | function c() {
  function d (line 1220) | function d() {
  function e (line 1225) | function e() {
  function c (line 1239) | function c(a, b) {
  function b (line 1253) | function b(a, b) {
  function c (line 1261) | function c(a) {
  function d (line 1300) | function d(a) {
  function e (line 1303) | function e(a) {
  function c (line 1309) | function c(a) {
  function i (line 1314) | function i(a) {
  function j (line 1319) | function j(a, c) {
  function g (line 1335) | function g(a) {
  function h (line 1340) | function h(a) {
  function c (line 1379) | function c() {
  function k (line 1418) | function k() {
  function l (line 1420) | function l(a, b) {
  function m (line 1429) | function m(a, b) {
  function n (line 1442) | function n(a, b, c, d) {
  function o (line 1446) | function o(a, b) {
  function p (line 1454) | function p(a, b, c, d) {
  function q (line 1467) | function q(a, b) {
  function r (line 1485) | function r(a, b) {
  function s (line 1488) | function s(a, b) {
  function t (line 1491) | function t(a, b) {
  function u (line 1494) | function u(a) {
  function v (line 1497) | function v(a) {
  function g (line 1537) | function g(a) {
  function h (line 1542) | function h(a) {
  function h (line 1569) | function h(a) {
  function i (line 1572) | function i(a) {
  function b (line 1622) | function b(a) {
  function c (line 1625) | function c(a) {
  function d (line 1628) | function d(a) {
  function r (line 1651) | function r(a, b) {
  function s (line 1654) | function s() {
  function t (line 1657) | function t() {
  function asyncInvokeCallback (line 2644) | function asyncInvokeCallback(func, error, user) {

FILE: www/lib/firebase-simple-login/firebase-simple-login.js
  function a (line 9) | function a(g){if(!(g in f.written)){if(!(g in f.visited)&&(f.visited[g]=...
  function e (line 20) | function e(){}
  function addListener (line 33) | function addListener(a,d,e){a.attachEvent?a.attachEvent("on"+d,e):a.addE...
  function removeListener (line 33) | function removeListener(a,d,e){a.detachEvent?a.detachEvent("on"+d,e):a.r...
  function extractOrigin (line 33) | function extractOrigin(a){/^https?:\/\//.test(a)||(a=window.location.hre...
  function findRelay (line 34) | function findRelay(){for(var a=window.location,d=window.opener.frames,a=...
  function f (line 36) | function f(){k&&document.body.removeChild(k);k=void 0;s&&(s=clearInterva...
  function g (line 36) | function g(a){if(a.origin===l)try{var d=fb.simplelogin.util.json.parse(a...
  function d (line 40) | function d(a){a=fb.simplelogin.util.json.stringify(a);isInternetExplorer...
  function e (line 40) | function e(f){var h;try{h=fb.simplelogin.util.json.parse(f.data)}catch(n...
  function f (line 40) | function f(a){if(k&&a.data===CLOSE_CMD)try{window.close()}catch(d){}}
  function f (line 45) | function f(a){if("."!==a.charAt(0))return a;a=a.split("/");for(var d=e.s...
  function e (line 46) | function e(a){return function(d){m(a,{state:"fulfilled",value:d})}}
  function l (line 46) | function l(a){return function(d){m(a,{state:"rejected",reason:d})}}
  function m (line 46) | function m(a,e){u[a]=e;0===--r&&d(u)}
  function d (line 48) | function d(){return function(){process.nextTick(g)}}
  function e (line 48) | function e(){var a=0,d=new k(g),e=document.createTextNode("");return d.o...
  function f (line 48) | function f(){return function(){setTimeout(g,1)}}
  function g (line 48) | function g(){for(var a=0;a<l.length;a++){var d=l[a];(0,d[0])(d[1])}l.len...
  function d (line 50) | function d(a,d){for(var e=0,k=a.length;k>e;e++)if(a[e]===d)return e;retu...
  function e (line 50) | function e(a){var d=a._promiseCallbacks;return d||(d=a._promiseCallbacks...
  function e (line 53) | function e(a){return function(d){s(a,{state:"fulfilled",value:d})}}
  function q (line 53) | function q(a){return function(d){s(a,{state:"rejected",reason:d})}}
  function s (line 53) | function s(a,e){r[a]=e;0===--v&&d(r)}
  function q (line 54) | function q(a){return function(e){r[a]=e;0===--v&&d(r)}}
  function s (line 54) | function s(a){v=0;e(a)}
  function e (line 57) | function e(){for(var g=arguments.length,m=Array(g),l=0;g>l;l++)m[l]=argu...
  function s (line 59) | function s(){}
  function m (line 59) | function m(a,d){if(!B(a))throw new TypeError("You must pass a resolver f...
  function p (line 60) | function p(a,d){function e(a){y(d,a)}function f(a){x(d,a)}try{a(e,f)}cat...
  function r (line 60) | function r(a,d,e,f){a=a._subscribers;var g=a.length;a[g]=d;a[g+A]=e;a[g+...
  function u (line 60) | function u(a,d){var e,f,g=a._subscribers,h=a._detail;z.instrument&&C(d==...
  function v (line 60) | function v(a,d,e,f){var g,h,k,l,m=B(e);if(m)try{g=e(f),k=!0}catch(n){l=!...
  function t (line 61) | function t(a,d){var e,f=null;try{if(a===d)throw new TypeError("A promise...
  function y (line 61) | function y(a,d){a===d?w(a,d):t(a,d)||w(a,d)}
  function w (line 61) | function w(a,d){a._state===E&&(a._state=
  function x (line 62) | function x(a,d){a._state===E&&(a._state=F,a._detail=d,z.async(J,a))}
  function G (line 62) | function G(a){u(a,a._state=A)}
  function J (line 62) | function J(a){a._onerror&&a._onerror(a._detail);u(a,a._state=D)}
  function q (line 65) | function q(a){return function(e){r[a]=e;0===--p&&d(r)}}
  function s (line 65) | function s(a){p=0;h(a)}
  function s (line 67) | function s(a){p&&(p=!1,d(a))}
  function m (line 67) | function m(a){p&&(p=!1,h(a))}
  function d (line 70) | function d(a){return"function"==typeof a||"object"==typeof a&&null!==a}
  function y (line 71) | function y(){w.on.apply(w,arguments)}
  function g (line 120) | function g(a,d,e){setTimeout(function(){a(d,e)},0)}

FILE: www/lib/firebase/firebase-debug.js
  function visitNode (line 213) | function visitNode(path) {
  function tempCtor (line 491) | function tempCtor() {
  function n (line 1907) | function n(a, b) {
  function stableCompareFn (line 2876) | function stableCompareFn(obj1, obj2) {
  function writeAfterEnd (line 4561) | function writeAfterEnd(stream, state, cb) {
  function validChunk (line 4568) | function validChunk(stream, state, chunk, cb) {
  function writeOrBuffer (line 4580) | function writeOrBuffer(stream, state, chunk, encoding, cb) {
  function decodeChunk (line 4598) | function decodeChunk(state, chunk, encoding) {
  function WriteReq (line 4604) | function WriteReq(chunk, encoding, cb) {
  function doWrite (line 4609) | function doWrite(stream, state, len, chunk, encoding, cb) {
  function FirebaseIFrameScriptHolder (line 5385) | function FirebaseIFrameScriptHolder(commandCB, onMessageCB, onDisconnect...

FILE: www/lib/firebase/firebase.js
  function n (line 1) | function n(a){return void 0!==a}
  function ba (line 1) | function ba(){}
  function ca (line 1) | function ca(a){a.sb=function(){return a.md?a.md:a.md=new a}}
  function da (line 2) | function da(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array...
  function ea (line 3) | function ea(a){return"array"==da(a)}
  function fa (line 3) | function fa(a){var b=da(a);return"array"==b||"object"==b&&"number"==type...
  function q (line 3) | function q(a){return"string"==typeof a}
  function ga (line 3) | function ga(a){return"number"==typeof a}
  function ha (line 3) | function ha(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}
  function ia (line 3) | function ia(a,b,c){return a.call.apply(a.bind,arguments)}
  function ja (line 4) | function ja(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Arra...
  function r (line 4) | function r(a,b,c){r=Function.prototype.bind&&-1!=Function.prototype.bind...
  function ka (line 5) | function ka(a,b){function c(){}c.prototype=b.prototype;a.me=b.prototype;...
  function la (line 5) | function la(a){a=String(a);if(/^\s*$/.test(a)?0:/^[\],:{}\s\u2028\u2029]...
  function ma (line 5) | function ma(){this.pc=void 0}
  function na (line 6) | function na(a,b,c){switch(typeof b){case "string":oa(b,c);break;case "nu...
  function oa (line 8) | function oa(a,b){b.push('"',a.replace(qa,function(a){if(a in pa)return p...
  function ra (line 8) | function ra(a){return"undefined"!==typeof JSON&&n(JSON.parse)?JSON.parse...
  function u (line 8) | function u(a){if("undefined"!==typeof JSON&&n(JSON.stringify))a=JSON.str...
  function sa (line 8) | function sa(a){for(var b=[],c=0,d=0;d<a.length;d++){var e=a.charCodeAt(d...
  function x (line 8) | function x(a,b,c,d){var e;d<b?e="at least "+b:d>c&&(e=0===c?"none":"no m...
  function y (line 9) | function y(a,b,c){var d="";switch(b){case 1:d=c?"first":"First";break;ca...
  function z (line 9) | function z(a,b,c,d){if((!d||n(c))&&"function"!=da(c))throw Error(y(a,b,d...
  function va (line 10) | function va(a,b,c){if(n(c)&&(!ha(c)||null===c))throw Error(y(a,b,!0)+"mu...
  function A (line 10) | function A(a,b){return Object.prototype.hasOwnProperty.call(a,b)}
  function wa (line 10) | function wa(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]}
  function za (line 10) | function za(a){return q(a)&&0!==a.length&&!xa.test(a)}
  function Aa (line 10) | function Aa(a,b,c){c&&!n(b)||Ba(y(a,1,c),b)}
  function Ba (line 11) | function Ba(a,b,c,d){c||(c=0);d=d||[];if(!n(b))throw Error(a+"contains u...
  function Ca (line 12) | function Ca(a){return 0==a.length?"":" in property '"+a.join(".")+"'"}
  function Ea (line 12) | function Ea(a,b){if(!ha(b)||ea(b))throw Error(y(a,1,!1)+" must be an Obj...
  function Fa (line 13) | function Fa(a,b,c,d){if(!(d&&!n(c)||null===c||ga(c)||q(c)||ha(c)&&A(c,"....
  function Ga (line 13) | function Ga(a,b,c){if(!c||n(b))switch(b){case "value":case "child_added"...
  function Ha (line 14) | function Ha(a,b){if(n(b)&&!za(b))throw Error(y(a,2,!0)+'was an invalid k...
  function Ia (line 14) | function Ia(a,b){if(!q(b)||0===b.length||ya.test(b))throw Error(y(a,1,!1...
  function B (line 14) | function B(a,b){if(".info"===C(b))throw Error(a+" failed: Can't modify d...
  function D (line 14) | function D(a,b,c,d,e,f,g){this.m=a;this.path=b;this.Ca=c;this.da=d;this....
  function c (line 16) | function c(g){f&&(f=!1,e.zb(a,c),b.call(d.Y,g))}
  function Ka (line 19) | function Ka(a){var b={};n(a.da)&&(b.sp=a.da);n(a.wa)&&(b.sn=a.wa);n(a.Aa...
  function Ja (line 20) | function Ja(a,b,c){var d={};if(b&&c)d.cancel=b,z(a,3,d.cancel,!0),d.Y=c,...
  function F (line 20) | function F(a,b){if(1==arguments.length){this.o=a.split("/");for(var c=0,...
  function C (line 20) | function C(a){return a.U>=a.o.length?null:a.o[a.U]}
  function Ma (line 20) | function Ma(a){var b=a.U;b<a.o.length&&b++;return new F(a.o,b)}
  function Na (line 20) | function Na(a){return a.U<a.o.length?a.o[a.o.length-1]:null}
  function Oa (line 22) | function Oa(a,b){var c=C(a);if(null===c)return b;if(c===C(b))return Oa(M...
  function Pa (line 22) | function Pa(){this.children={};this.Ac=0;this.value=null}
  function Qa (line 22) | function Qa(a,b,c){this.Da=a?a:"";this.Fb=b?b:null;this.C=c?c:new Pa}
  function I (line 22) | function I(a,b){for(var c=b instanceof F?b:new F(b),d=a,e;null!==(e=C(c)...
  function J (line 22) | function J(a,b){v("undefined"!==typeof b,"Cannot set value to undefined"...
  function Sa (line 23) | function Sa(a,b,c,d){c&&!d&&b(a);a.A(function(a){Sa(a,b,!0,d)});c&&d&&b(a)}
  function Ta (line 23) | function Ta(a,b,c){for(a=c?a:a.parent();null!==a;){if(b(a))return!0;a=a....
  function Ra (line 24) | function Ra(a){if(null!==a.Fb){var b=a.Fb,c=a.Da,d=a.f(),e=A(b.C.childre...
  function Ua (line 24) | function Ua(a,b){this.Va=a?a:Va;this.ca=b?b:Wa}
  function Va (line 24) | function Va(a,b){return a<b?-1:a>b?1:0}
  function Xa (line 25) | function Xa(a,b){for(var c,d=a.ca,e=null;!d.f();){c=a.Va(b,d.key);if(0==...
  function Ya (line 26) | function Ya(a,b){this.vd=b;for(this.cc=[];!a.f();)this.cc.push(a),a=a.left}
  function Za (line 26) | function Za(a){if(0===a.cc.length)return null;var b=a.cc.pop(),c;c=a.vd?...
  function $a (line 26) | function $a(a,b,c,d,e){this.key=a;this.value=b;this.color=null!=c?c:!0;t...
  function cb (line 27) | function cb(a){return a.left.f()?a:cb(a.left)}
  function eb (line 28) | function eb(a){if(a.left.f())return Wa;a.left.P()||a.left.left.P()||(a=f...
  function db (line 30) | function db(a){a.right.P()&&!a.left.P()&&(a=ib(a));a.left.P()&&a.left.le...
  function fb (line 30) | function fb(a){a=hb(a);a.right.left.P()&&(a=a.J(null,null,null,null,gb(a...
  function ib (line 30) | function ib(a){return a.right.J(null,null,a.color,a.J(null,null,!0,null,...
  function gb (line 30) | function gb(a){return a.left.J(null,null,a.color,null,a.J(null,null,!0,a...
  function hb (line 31) | function hb(a){return a.J(null,null,!a.color,a.left.J(null,null,!a.left....
  function jb (line 31) | function jb(){}
  function kb (line 31) | function kb(a){this.Xb=a;this.kc="firebase:"}
  function lb (line 31) | function lb(){this.ob={}}
  function mb (line 31) | function mb(a){try{if("undefined"!==typeof window&&"undefined"!==typeof ...
  function pb (line 31) | function pb(a,b,c,d){this.host=a.toLowerCase();this.domain=this.host.sub...
  function qb (line 31) | function qb(a,b){b!==a.ga&&(a.ga=b,"s-"===a.ga.substr(0,2)&&nb.set("host...
  function rb (line 31) | function rb(a,b){if(0===a.length||0===b.length)return a.concat(b);var c=...
  function tb (line 32) | function tb(a){var b=a.length;return 0===b?0:32*(b-1)+(Math.round(a[b-1]...
  function sb (line 32) | function sb(a,b,c){return 32===a?b:(c?b|0:b<<32-a)+1099511627776*a}
  function ub (line 32) | function ub(a){var b,c="",d=0,e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm...
  function vb (line 33) | function vb(a){a?(this.Tb=a.Tb.slice(0),this.nb=a.nb.slice(0),this.Ua=a....
  function wb (line 33) | function wb(a){a=(new vb).update(a);var b,c=a.nb,d=a.Tb,c=rb(c,[sb(1,1)]...
  function xb (line 35) | function xb(a,b){var c,d,e,f,g,k,l,m=b.slice(0),p=a.Tb;e=p[0];f=p[1];g=p...
  function Db (line 36) | function Db(a,b){var c;a:{c=a.length;for(var d=q(a)?a.split(""):a,e=0;e<...
  function Hb (line 36) | function Hb(a){return-1!=Eb.indexOf(a)}
  function v (line 36) | function v(a,b){if(!a)throw Error("Firebase INTERNAL ASSERT FAILED:"+b);}
  function Pb (line 36) | function Pb(a){for(var b="",c=0;c<arguments.length;c++)b=fa(arguments[c]...
  function K (line 36) | function K(a){!0===Rb&&(Rb=!1,null===Qb&&!0===ob.get("logging_enabled")&...
  function Tb (line 37) | function Tb(a){return function(){K(a,arguments)}}
  function Ub (line 37) | function Ub(a){if("undefined"!==typeof console){var b="FIREBASE INTERNAL...
  function Vb (line 37) | function Vb(a){var b=Pb.apply(null,arguments);throw Error("FIREBASE FATA...
  function L (line 37) | function L(a){if("undefined"!==typeof console){var b="FIREBASE WARNING: ...
  function Da (line 38) | function Da(a){return ga(a)&&(a!=a||a==Number.POSITIVE_INFINITY||a==Numb...
  function Wb (line 38) | function Wb(a){if("complete"===document.readyState)a();else{var b=!1,c=f...
  function Xb (line 39) | function Xb(a,b){return a!==b?null===a?-1:null===b?1:typeof a!==typeof b...
  function Yb (line 39) | function Yb(a,b){if(a===b)return 0;var c=Zb(a),d=Zb(b);return null!==c?n...
  function $b (line 39) | function $b(a,b){if(b&&a in b)return b[a];throw Error("Missing required ...
  function La (line 40) | function La(a){if("object"!==typeof a||null===a)return u(a);var b=[],c;f...
  function ac (line 40) | function ac(a,b){if(a.length<=b)return[a];for(var c=[],d=0;d<a.length;d+...
  function bc (line 40) | function bc(a,b){if(ea(a))for(var c=0;c<a.length;++c)b(c,a[c]);else cc(a...
  function dc (line 40) | function dc(a,b){return b?r(a,b):a}
  function ec (line 41) | function ec(a){v(!Da(a),"Invalid JSON number");var b,c,d,e;0===a?(d=c=0,...
  function fc (line 42) | function fc(a){var b="Unknown Error";"too_big"===a?b="The data requested...
  function Zb (line 42) | function Zb(a){return gc.test(a)&&(a=Number(a),-2147483648<=a&&214748364...
  function ic (line 43) | function ic(a){try{a()}catch(b){setTimeout(function(){throw b;},Math.flo...
  function jc (line 43) | function jc(a,b){this.F=a;v(null!==this.F,"LeafNode shouldn't be created...
  function lc (line 44) | function lc(a,b){return Xb(a.ja,b.ja)||Yb(a.name,b.name)}
  function mc (line 44) | function mc(a,b){return Yb(a.name,b.name)}
  function nc (line 44) | function nc(a,b){return Yb(a,b)}
  function N (line 44) | function N(a,b){this.n=a||new Ua(nc);this.gb="undefined"!==typeof b?b:null}
  function oc (line 46) | function oc(a,b,c){N.call(this,a,c);null===b&&(b=new Ua(lc),a.Ba(functio...
  function O (line 47) | function O(a,b){if(null===a)return M;var c=null;"object"===typeof a&&".p...
  function sc (line 48) | function sc(a){this.count=parseInt(Math.log(a+1)/rc,10);this.ed=this.cou...
  function tc (line 48) | function tc(a){var b=!(a.Hd&1<<a.ed);a.ed--;return b}
  function qc (line 49) | function qc(a,b,c){function d(e,f){var l=f-e;if(0==l)return null;if(1==l...
  function kc (line 50) | function kc(a){return"number"===typeof a?"number:"+ec(a):"string:"+a}
  function P (line 50) | function P(a,b){this.C=a;this.nc=b}
  function uc (line 53) | function uc(a){v(ea(a)&&0<a.length,"Requires a non-empty array");this.Gd...
  function vc (line 54) | function vc(a,b){v(Db(a.Gd,function(a){return a===b}),"Unknown event: "+b)}
  function wc (line 54) | function wc(){uc.call(this,["visible"]);var a,b;"undefined"!==typeof doc...
  function xc (line 55) | function xc(){uc.call(this,["online"]);this.Db=!0;if("undefined"!==typeo...
  function cc (line 55) | function cc(a,b){for(var c in a)b.call(void 0,a[c],c,a)}
  function yc (line 55) | function yc(a){var b=[],c=0,d;for(d in a)b[c++]=d;return b}
  function zc (line 55) | function zc(a){var b={},c;for(c in a)b[c]=a[c];return b}
  function Ac (line 55) | function Ac(){this.pb={}}
  function Bc (line 55) | function Bc(a,b,c){n(c)||(c=1);A(a.pb,b)||(a.pb[b]=0);a.pb[b]+=c}
  function Cc (line 55) | function Cc(a){this.Id=a;this.Zb=null}
  function Dc (line 55) | function Dc(a,b){this.Zc={};this.tc=new Cc(a);this.u=b;var c=1E4+2E4*Mat...
  function Gc (line 55) | function Gc(a){a=a.toString();Ec[a]||(Ec[a]=new Ac);return Ec[a]}
  function Hc (line 55) | function Hc(a,b){var c=a.toString();Fc[c]||(Fc[c]=b());return Fc[c]}
  function Q (line 55) | function Q(a,b,c){this.Cc=a;this.e=Tb(this.Cc);this.frames=this.vb=null;...
  function Lc (line 58) | function Lc(a,b){a.frames.push(b);if(a.frames.length==a.ad){var c=a.fram...
  function Kc (line 59) | function Kc(a){clearInterval(a.vb);a.vb=setInterval(function(){a.W&&a.W....
  function Mc (line 59) | function Mc(a){this.Pc=a;this.jc=[];this.Xa=0;this.Bc=-1;this.Oa=null}
  function Nc (line 59) | function Nc(a,b,c){a.Bc=b;a.Oa=c;a.Bc<a.Xa&&(a.Oa(),a.Oa=null)}
  function Oc (line 59) | function Oc(a,b,c){for(a.jc[b]=c;a.jc[a.Xa];){var d=a.jc[a.Xa];delete a....
  function Pc (line 59) | function Pc(){this.set={}}
  function R (line 59) | function R(a,b){cc(a.set,function(a,d){b(d,a)})}
  function Qc (line 59) | function Qc(a,b,c){this.Cc=a;this.e=Tb(a);this.Ha=this.Ia=0;this.ea=Gc(b...
  function Uc (line 65) | function Uc(a,b){var c=u(b).length;a.Ha+=c;Bc(a.ea,"bytes_received",c)}
  function Tc (line 66) | function Tc(a,b,c,d){this.Rb=d;this.ia=c;this.Rc=new Pc;this.Hb=[];this....
  function Wc (line 69) | function Wc(a){if(a.xc&&a.rc&&a.Rc.count()<(0<a.Hb.length?2:1)){a.Dc++;v...
  function Zc (line 69) | function Zc(a,b,c){function d(){a.Rc.remove(c);Wc(a)}a.Rc.add(c);var e=s...
  function Vc (line 70) | function Vc(a,b,c){setTimeout(function(){try{if(a.rc){var d=a.Z.za.creat...
  function $c (line 70) | function $c(a){ad(this,a)}
  function ad (line 70) | function ad(a,b){var c=Q&&Q.isAvailable(),d=c&&!(nb.od||!0===nb.get("pre...
  function cd (line 70) | function cd(a){if(0<a.Ob.length)return a.Ob[0];throw Error("No transport...
  function dd (line 70) | function dd(a,b,c,d,e,f){this.id=a;this.e=Tb("c:"+this.id+":");this.Pc=c...
  function ed (line 71) | function ed(a){var b=cd(a.Cd);a.B=new b("c:"+a.id+":"+a.cd++,a.M);a.Tc=b...
  function gd (line 72) | function gd(a,b){return function(c){b===a.B?(a.B=null,c||0!==a.ma?1===a....
  function fd (line 73) | function fd(a,b){return function(c){if(2!=a.ma)if(b===a.Mb){var d=$b("t"...
  function jd (line 75) | function jd(a){a.Pb===a.w&&a.Mb===a.w&&(a.e("cleaning up and promoting a...
  function nd (line 76) | function nd(a){0>=a.xd?(a.e("Secondary connection is healthy."),a.Na=!0,...
  function ld (line 76) | function ld(a){a.Na||(a.Tc--,0>=a.Tc&&(a.e("Primary connection is health...
  function id (line 77) | function id(a,b){a.w=new b("c:"+a.id+":"+a.cd++,a.M,a.sc);a.xd=b.respons...
  function hd (line 77) | function hd(a,b,c){a.e("Realtime connection established.");a.B=b;a.ma=1;...
  function md (line 78) | function md(a){a.Na||1!==a.ma||(a.e("sending ping on primary."),od(a,{t:...
  function od (line 78) | function od(a,b){if(1!==a.ma)throw"Connection is not connected";a.Pb.sen...
  function kd (line 78) | function kd(a){a.e("Shutting down all connections");a.B&&(a.B.close(),a....
  function pd (line 78) | function pd(a,b,c,d,e,f){this.id=qd++;this.e=Tb("p:"+this.id+":");this.S...
  function td (line 79) | function td(a,b,c){var d=b.toString(),e=b.path().toString();a.ha[e]=a.ha...
  function ud (line 80) | function ud(a,b,c,d,e){a.e("Listen on "+b+" for "+c);var f={p:b};d=Ab(d,...
  function wd (line 82) | function wd(a){var b=a.Ka;a.R&&b&&a.Ea("auth",{cred:b.Jd},function(c){va...
  function xd (line 82) | function xd(a,b,c,d){b=b.toString();vd(a,b,c)&&a.R&&yd(a,b,c,d)}
  function yd (line 82) | function yd(a,b,c,d){a.e("Unlisten on "+b+" for "+c);b={p:b};d=Ab(d,func...
  function zd (line 83) | function zd(a,b,c,d){a.R?Ad(a,"o",b,c,d):a.Bb.push({Sc:b,action:"o",data...
  function Bd (line 83) | function Bd(a,b,c,d){a.R?Ad(a,"om",b,c,d):a.Bb.push({Sc:b,action:"om",da...
  function Ad (line 83) | function Ad(a,b,c,d,e){c={p:c,d:d};a.e("onDisconnect "+b,c);a.Ea(b,c,fun...
  function Dd (line 83) | function Dd(a,b,c,d){Cd(a,"m",b,c,d,void 0)}
  function Cd (line 84) | function Cd(a,b,c,d,e,f){c={p:c,d:d};n(f)&&(c.h=f);a.T.push({action:b,ud...
  function Ed (line 84) | function Ed(a,b){var c=a.T[b].action,d=a.T[b].ud,e=a.T[b].D;a.T[b].$d=a....
  function rd (line 87) | function rd(a,b){v(!a.ka,"Scheduling a connect when we're already connec...
  function Gd (line 90) | function Gd(a){if(a.Sa){a.e("Making a connection attempt");a.Lc=(new Dat...
  function Fd (line 91) | function Fd(a,b,c){c=c?Ab(c,function(a){return La(a)}).join("$"):"{}";(a...
  function vd (line 91) | function vd(a,b,c){b=(new F(b)).toString();c||(c="{}");var d=a.ha[b][c];...
  function Hd (line 91) | function Hd(){this.n=this.F=null}
  function Id (line 91) | function Id(a,b,c){if(b.f())a.F=c,a.n=null;else if(null!==a.F)a.F=a.F.ya...
  function Jd (line 91) | function Jd(a,b){if(b.f())return a.F=null,a.n=null,!0;if(null!==a.F){if(...
  function Kd (line 92) | function Kd(a,b,c){null!==a.F?c(b,a.F):a.A(function(a,e){var f=new F(b.t...
  function Ld (line 92) | function Ld(){this.$=M}
  function S (line 92) | function S(a,b){return a.$.K(b)}
  function T (line 92) | function T(a,b,c){a.$=a.$.ya(b,c)}
  function Md (line 92) | function Md(){this.ta=new Ld;this.L=new Ld;this.oa=new Ld;this.Gb=new Qa}
  function Nd (line 92) | function Nd(a,b,c){T(a.ta,b,c);return Od(a,b)}
  function Od (line 92) | function Od(a,b){for(var c=S(a.ta,b),d=S(a.L,b),e=I(a.Gb,b),f=!1,g=e;nul...
  function Pd (line 92) | function Pd(a,b,c){if(c.f())return a;if(null!==c.j())return b;a=a||M;c.A...
  function Qd (line 93) | function Qd(a,b){zb(b,function(b){var d=b.ee;b=I(a.Gb,b.path);var e=b.j(...
  function Rd (line 93) | function Rd(a,b){return a&&"object"===typeof a?(v(".sv"in a,"Unexpected ...
  function Sd (line 93) | function Sd(a,b){var c=new Hd;Kd(a,new F(""),function(a,e){Id(c,a,Td(e,b...
  function Td (line 93) | function Td(a,b){var c=Rd(a.k(),b),d;if(a.O()){var e=Rd(a.j(),b);return ...
  function Ud (line 93) | function Ud(){this.$a=[]}
  function Vd (line 93) | function Vd(a,b){if(0!==b.length)for(var c=0;c<b.length;c++)a.$a.push(b[...
  function Wd (line 93) | function Wd(a){var b=a.aa,c=a.zd,d=a.Ib;ic(function(){b(c,d)})}
  function U (line 93) | function U(a,b,c,d){this.type=a;this.ua=b;this.ba=c;this.Ib=d}
  function Xd (line 93) | function Xd(a){this.Q=a;this.pa=[];this.Ec=new Ud}
  function Yd (line 93) | function Yd(a,b,c,d,e){a.pa.push({type:b,aa:c,cancel:d,Y:e});d=[];var f=...
  function $d (line 94) | function $d(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d],f=e.type,g=...
  function Zd (line 95) | function Zd(a){var b=[];if(!a.O()){var c=null;a.A(function(a,e){b.push(n...
  function ae (line 95) | function ae(a){a.ub||(a.ub=!0,$d(a,[new U("value",a.i)]))}
  function be (line 95) | function be(a,b){Xd.call(this,a);this.i=b}
  function ce (line 95) | function ce(a,b){this.Wb=a;this.Mc=b}
  function de (line 95) | function de(a,b,c,d,e){var f=a.K(c),g=b.K(c);d=new ce(d,e);e=ee(d,c,f,g)...
  function ee (line 96) | function ee(a,b,c,d){var e,f=[];c===d?e=!1:c.O()&&d.O()?e=c.j()!==d.j():...
  function fe (line 97) | function fe(a,b,c,d,e){var f=!1,g=!a.Wb||!I(a.Wb,b).f(),k=[],l=[],m=[],p...
  function ge (line 99) | function ge(){this.X=this.xa=null;this.set={}}
  function he (line 99) | function he(a,b,c){a.add(b,c);a.X||(a.X=c.Q.path)}
  function ie (line 99) | function ie(a){var b=a.xa;a.xa=null;return b}
  function je (line 99) | function je(a){return a.contains("default")}
  function ke (line 99) | function ke(a){return null!=a.xa&&je(a)}
  function le (line 100) | function le(a,b){Xd.call(this,a);this.i=M;this.mc(b,Zd(b))}
  function me (line 104) | function me(a,b,c,d){if(a.O())return null;var e=null;(d?a.Fc:a.A).call(a...
  function ne (line 105) | function ne(a,b,c){for(var d=0;d<a.length;d++)if(!a[d](b,c.k()))return!1...
  function oe (line 106) | function oe(a,b){this.u=a;this.g=b;this.ec=b.$;this.na=new Qa}
  function re (line 107) | function re(a,b,c,d,e){var f=a.get(b),g;if(g=f){g=!1;for(var k=f.pa.leng...
  function se (line 107) | function se(a,b,c,d,e){b=b?b.Qa():null;var f=[];b&&"default"!==b?re(a,b,...
  function te (line 108) | function te(a,b,c,d,e,f){var g=b.path(),g=I(a.na,g);c=se(b,c,d,e,f);b.f(...
  function we (line 108) | function we(a,b,c){Sa(I(a.na,b),function(a){(a=a.j())&&R(a,function(a,b)...
  function W (line 109) | function W(a,b,c){function d(a){do{if(g[a.toString()])return!0;a=a.paren...
  function xe (line 109) | function xe(a,b){var c=I(a.na,b);Sa(c,function(a){(a=a.j())&&R(a,functio...
  function ue (line 110) | function ue(a){return Ta(a,function(a){return a.j()&&ke(a.j())})}
  function qe (line 110) | function qe(a,b,c,d,e){if(ke(c)||ue(b))he(c,d,e);else{var f,g;c.f()||(f=...
  function ve (line 111) | function ve(a,b){function c(b){var f=b.j();if(f&&je(f))d.push(f.path()),...
  function ye (line 112) | function ye(a,b){if(a.u){var c=a.u,d=b.path(),e=b.toString(),f=b.hb(),g,...
  function ze (line 112) | function ze(a,b,c){b&&(R(b,function(a,b){for(var f=0;f<b.pa.length;f++){...
  function pe (line 113) | function pe(a,b){return"default"===a.Qa()?new be(a,b):new le(a,b)}
  function e (line 113) | function e(a){cc(a,function(a,b){f[b]=3===a?3:(wa(f,b)||a)===a?a:3})}
  function Ae (line 113) | function Ae(a,b,c,d,e){var f=b.path();b=a.rb(f,b,d,e);var g=M,k=[];cc(b,...
  function Ce (line 114) | function Ce(a,b,c,d){var e;a:{var f=I(a.na,b);e=f.parent();for(var g=[];...
  function Be (line 115) | function Be(a,b,c,d){var e=c.j();if(null!==e)return je(e)?[{path:c.path(...
  function De (line 115) | function De(a){this.M=a;this.ea=Gc(a);this.u=new pd(this.M,r(this.hc,thi...
  function Fe (line 116) | function Fe(a){a=S(a.Jc,new F(".info/serverTimeOffset")).V()||0;return(n...
  function Ge (line 116) | function Ge(a){a=a={timestamp:Fe(a)};a.timestamp=a.timestamp||(new Date)...
  function Ee (line 118) | function Ee(a,b,c){b=new F("/.info/"+b);T(a.Jc,b,O(c));W(a.Kc,b,[b])}
  function Ie (line 123) | function Ie(a){a.e("onDisconnectEvents");var b=[],c=Ge(a);Kd(Sd(a.S,c),n...
  function Ke (line 123) | function Ke(a,b,c,d){var e=O(c);zd(a.u,b.toString(),e.V(!0),function(c,g...
  function Le (line 124) | function Le(a,b,c,d,e){var f=O(c,d);zd(a.u,b.toString(),f.V(!0),function...
  function Me (line 124) | function Me(a,b,c,d){var e=!0,f;for(f in c)e=!1;e?(K("onDisconnect().upd...
  function Ne (line 124) | function Ne(a){Bc(a.ea,"deprecated_on_disconnect");a.Bd.Zc.deprecated_on...
  function X (line 127) | function X(a,b,c){a&&ic(function(){if("ok"==b)a(null,c);else{var d=(b||"...
  function Oe (line 127) | function Oe(a,b,c,d,e){function f(){}a.e("transaction on "+b);var g=new ...
  function Qe (line 128) | function Qe(a,b){var c=b||a.Ta;b||Se(a,c);if(null!==c.j()){var d=Te(a,c)...
  function Ue (line 129) | function Ue(a,b,c){for(var d=0;d<c.length;d++)v(1===c[d].status,"tryToSe...
  function Ve (line 131) | function Ve(a){for(var b={},c=0;c<a.length;c++)a[c].yc&&(b[a[c].path.toS...
  function He (line 132) | function He(a,b){var c=We(a,b),d=c.path(),c=Te(a,c);T(a.g.oa,d,S(a.g.L,d...
  function We (line 133) | function We(a,b){for(var c,d=a.Ta;null!==(c=C(b))&&null===d.j();)d=I(d,c...
  function Te (line 134) | function Te(a,b){var c=[];Xe(a,b,c);c.sort(function(a,b){return a.rd-b.r...
  function Xe (line 134) | function Xe(a,b,c){var d=b.j();if(null!==d)for(var e=0;e<d.length;e++)c....
  function Se (line 134) | function Se(a,b){var c=b.j();if(c){for(var d=0,e=0;e<c.length;e++)3!==c[...
  function Je (line 134) | function Je(a,b){var c=We(a,b).path(),d=I(a.Ta,b);Ta(d,function(a){Ye(a)...
  function Ye (line 135) | function Ye(a){var b=a.j();if(null!==b){for(var c=[],d=-1,e=0;e<b.length...
  function Re (line 135) | function Re(a,b){var c=new E(a,b);return new P(S(a.Fa,b),c)}
  function Pe (line 136) | function Pe(a,b,c,d){if(d.f())return c;if(null!=d.j())return b;var e=c;d...
  function Y (line 136) | function Y(){this.ib={}}
  function $ (line 137) | function $(a,b,c){this.Kb=a;this.X=b;this.Da=c}
  function E (line 142) | function E(a,b){var c,d;if(a instanceof De)c=a,d=b;else{x("new Firebase"...
  function Sb (line 157) | function Sb(a,b){v(!b||!0===a||!1===a,"Can't turn on custom loggers pers...

FILE: www/lib/ionic/js/ionic-angular.js
  function actionSheet (line 162) | function actionSheet(opts) {
  function retain (line 380) | function retain() {
  function release (line 388) | function release() {
  function getElement (line 397) | function getElement() {
  function hideWithTransform (line 572) | function hideWithTransform(element) {
  function CollectionRepeatDataSource (line 576) | function CollectionRepeatDataSource(options) {
  function disconnectScope (line 722) | function disconnectScope(scope) {
  function reconnectScope (line 744) | function reconnectScope(scope) {
  function CollectionRepeatManager (line 773) | function CollectionRepeatManager(options) {
  function calculateSize (line 880) | function calculateSize(dim) {
  function doRender (line 1063) | function doRender(dataIndex, rect) {
  function delegateService (line 1106) | function delegateService(methodNames) {
  function getLoader (line 1409) | function getLoader() {
  function showLoader (line 1485) | function showLoader(options) {
  function hideLoader (line 1516) | function hideLoader() {
  function componentConfig (line 1934) | function componentConfig(defaults) {
  function positionView (line 2212) | function positionView(target, popoverEle) {
  function createPopup (line 2613) | function createPopup(options) {
  function onHardwareBackButton (line 2698) | function onHardwareBackButton(e) {
  function showPopup (line 2702) | function showPopup(options) {
  function focusInput (line 2763) | function focusInput(element) {
  function showAlert (line 2770) | function showAlert(opts) {
  function showConfirm (line 2782) | function showConfirm(opts) {
  function showPrompt (line 2796) | function showPrompt(opts) {
  function getStyle (line 2839) | function getStyle(el, cssprop) {
  function isStaticPositioned (line 2853) | function isStaticPositioned(element) {
  function $ionicTemplateCache (line 3477) | function $ionicTemplateCache(templates){
  function fetchTemplate (line 3561) | function fetchTemplate(url) {
  function loadAndCompile (line 3568) | function loadAndCompile(options) {
  function onHardwareBackButton (line 3683) | function onHardwareBackButton(e) {
  function createViewId (line 3747) | function createViewId(stateId) {
  function getParentAnimationClass (line 4051) | function getParentAnimationClass(el) {
  function setAnimationClass (line 4066) | function setAnimationClass() {
  function $LocationDecorator (line 4206) | function $LocationDecorator($location, $timeout) {
  function rerender (line 5562) | function rerender(value) {
  function rerenderOnResize (line 5591) | function rerenderOnResize() {
  function collectionRepeatSrcDirective (line 5620) | function collectionRepeatSrcDirective(ngAttrName, attrName) {
  function prelink (line 5703) | function prelink($scope, $element, $attr, navViewCtrl) {
  function checkAsideExpose (line 5833) | function checkAsideExpose() {
  function onResize (line 5839) | function onResize() {
  function gestureDirective (line 6098) | function gestureDirective(directiveName) {
  function tapScrollToTopDirective (line 6203) | function tapScrollToTopDirective() {
  function headerFooterBarDirective (line 6243) | function headerFooterBarDirective(isHeader) {
  function calculateMaxValue (line 6357) | function calculateMaxValue(distance, maximum, isPercent) {
  function checkInfiniteBounds (line 6422) | function checkInfiniteBounds() {
  function stopPropagation (line 6634) | function stopPropagation(e) {
  function onShow (line 6785) | function onShow(e) {
  function onHide (line 6799) | function onHide() {
  function keyboardAttachGetClientHeight (line 6821) | function keyboardAttachGetClientHeight(element) {
  function init (line 6922) | function init() {
  function prelink (line 7328) | function prelink($scope, $element, $attr, navBarCtrl) {
  function prelink (line 7478) | function prelink($scope, $element, $attrs) {
  function updateView (line 7647) | function updateView(doAnimate) {
  function eventStopPropagation (line 7753) | function eventStopPropagation(e) {
  function prelink (line 8036) | function prelink($scope, $element, $attr) {
  function prelink (line 8195) | function prelink($scope, $element, $attr, sideMenuCtrl) {
  function prelink (line 8420) | function prelink($scope) {
  function attrStr (line 8672) | function attrStr(k,v) {
  function selectIfMatchesState (line 8737) | function selectIfMatchesState() {
  function prelink (line 8901) | function prelink($scope, $element, $attr, tabsCtrl) {
  function s (line 9112) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function clamp (line 9233) | function clamp(min, n, max) { return Math.max(min, Math.min(n, max)); }
  function Animator (line 9237) | function Animator(opts) {
  function figureOutEasing (line 9445) | function figureOutEasing(easing) {
  function B1 (line 9601) | function B1(t) { return t*t*t; }
  function B2 (line 9602) | function B2(t) { return 3*t*t*(1-t); }
  function B3 (line 9603) | function B3(t) { return 3*t*(1-t)*(1-t); }
  function B4 (line 9604) | function B4(t) { return (1-t)*(1-t)*(1-t); }
  function solveEpsilon (line 9623) | function solveEpsilon(duration) {
  function unitBezier (line 9635) | function unitBezier(p1x, p1y, p2x, p2y) {
  function dynamicsSpring (line 9808) | function dynamicsSpring(opts) {
  function dynamicsGravity (line 9853) | function dynamicsGravity(opts) {
  function step (line 10017) | function step() {
  function SimpleEventEmitter (line 10075) | function SimpleEventEmitter() {
  function onceFn (line 10087) | function onceFn() {
  function noop (line 10210) | function noop() {}

FILE: www/lib/ionic/js/ionic.bundle.js
  function domReady (line 35) | function domReady() {
  function setup (line 525) | function setup() {
  function onWindowLoad (line 2208) | function onWindowLoad() {
  function onPlatformReady (line 2222) | function onPlatformReady() {
  function update (line 2276) | function update(fn) {
  function tapEventListener (line 2606) | function tapEventListener(type, enable, useCapture) {
  function tapClick (line 2614) | function tapClick(e) {
  function triggerMouseEvent (line 2630) | function triggerMouseEvent(type, ele, x, y) {
  function tapClickGateKeeper (line 2638) | function tapClickGateKeeper(e) {
  function tapMouseDown (line 2659) | function tapMouseDown(e) {
  function tapMouseUp (line 2684) | function tapMouseUp(e) {
  function tapMouseMove (line 2701) | function tapMouseMove(e) {
  function tapTouchStart (line 2712) | function tapTouchStart(e) {
  function tapTouchEnd (line 2737) | function tapTouchEnd(e) {
  function tapTouchMove (line 2753) | function tapTouchMove(e) {
  function tapTouchCancel (line 2762) | function tapTouchCancel(e) {
  function tapEnableTouchEvents (line 2768) | function tapEnableTouchEvents() {
  function tapIgnoreEvent (line 2776) | function tapIgnoreEvent(e) {
  function tapHandleFocus (line 2786) | function tapHandleFocus(ele) {
  function tapFocusOutActive (line 2821) | function tapFocusOutActive() {
  function tapFocusIn (line 2830) | function tapFocusIn(e) {
  function tapFocusOut (line 2851) | function tapFocusOut() {
  function tapActiveElement (line 2855) | function tapActiveElement(ele) {
  function tapHasPointerMoved (line 2862) | function tapHasPointerMoved(endEvent) {
  function tapContainingElement (line 2877) | function tapContainingElement(ele, allowSelf) {
  function tapTargetElement (line 2887) | function tapTargetElement(ele) {
  function clear (line 2974) | function clear() {
  function activateElements (line 2982) | function activateElements() {
  function deactivateElements (line 2993) | function deactivateElements() {
  function keyboardInit (line 3269) | function keyboardInit() {
  function keyboardNativeShow (line 3294) | function keyboardNativeShow(e) {
  function keyboardBrowserFocusIn (line 3299) | function keyboardBrowserFocusIn(e) {
  function keyboardSetShow (line 3312) | function keyboardSetShow(e) {
  function keyboardShow (line 3341) | function keyboardShow(element, elementTop, elementBottom, viewportHeight...
  function keyboardFocusOut (line 3381) | function keyboardFocusOut(e) {
  function keyboardHide (line 3387) | function keyboardHide() {
  function keyboardUpdateViewportHeight (line 3408) | function keyboardUpdateViewportHeight() {
  function keyboardOnKeyDown (line 3414) | function keyboardOnKeyDown(e) {
  function keyboardPreventDefault (line 3420) | function keyboardPreventDefault(e) {
  function keyboardOrientationChange (line 3426) | function keyboardOrientationChange() {
  function keyboardGetHeight (line 3457) | function keyboardGetHeight() {
  function getViewportHeight (line 3494) | function getViewportHeight() {
  function keyboardIsWithinScroll (line 3498) | function keyboardIsWithinScroll(ele) {
  function keyboardHasPlugin (line 3508) | function keyboardHasPlugin() {
  function viewportLoadTag (line 3542) | function viewportLoadTag() {
  function viewportUpdate (line 3565) | function viewportUpdate() {
  function viewportTagUpdate (line 3649) | function viewportTagUpdate() {
  function getEventTouches (line 4383) | function getEventTouches(e) {
  function setup (line 6856) | function setup() {
  function prev (line 6909) | function prev() {
  function next (line 6916) | function next() {
  function circle (line 6923) | function circle(index) {
  function slide (line 6930) | function slide(to, slideSpeed) {
  function move (line 6973) | function move(index, dist, speed) {
  function translate (line 6980) | function translate(index, dist, speed) {
  function animate (line 7000) | function animate(from, to, speed) {
  function begin (line 7039) | function begin() {
  function stop (line 7045) | function stop() {
  function minErr (line 7607) | function minErr(module) {
  function isArrayLike (line 7835) | function isArrayLike(obj) {
  function forEach (line 7879) | function forEach(obj, iterator, context) {
  function sortedKeys (line 7906) | function sortedKeys(obj) {
  function forEachSorted (line 7916) | function forEachSorted(obj, iterator, context) {
  function reverseParams (line 7930) | function reverseParams(iteratorFn) {
  function nextUid (line 7942) | function nextUid() {
  function setHashKey (line 7970) | function setHashKey(obj, h) {
  function extend (line 7993) | function extend(dst) {
  function int (line 8007) | function int(str) {
  function inherit (line 8012) | function inherit(parent, extra) {
  function noop (line 8032) | function noop() {}
  function identity (line 8052) | function identity($) {return $;}
  function valueFn (line 8056) | function valueFn(value) {return function() {return value;};}
  function isUndefined (line 8070) | function isUndefined(value){return typeof value === 'undefined';}
  function isDefined (line 8085) | function isDefined(value){return typeof value !== 'undefined';}
  function isObject (line 8101) | function isObject(value){return value != null && typeof value === 'objec...
  function isString (line 8116) | function isString(value){return typeof value === 'string';}
  function isNumber (line 8131) | function isNumber(value){return typeof value === 'number';}
  function isDate (line 8146) | function isDate(value) {
  function isArray (line 8163) | function isArray(value) {
  function isFunction (line 8180) | function isFunction(value){return typeof value === 'function';}
  function isRegExp (line 8190) | function isRegExp(value) {
  function isWindow (line 8202) | function isWindow(obj) {
  function isScope (line 8207) | function isScope(obj) {
  function isFile (line 8212) | function isFile(obj) {
  function isBlob (line 8217) | function isBlob(obj) {
  function isBoolean (line 8222) | function isBoolean(value) {
  function isElement (line 8254) | function isElement(node) {
  function makeMap (line 8264) | function makeMap(str) {
  function map (line 8285) | function map(obj, iterator, context) {
  function size (line 8306) | function size(obj, ownPropsOnly) {
  function includes (line 8321) | function includes(array, obj) {
  function indexOf (line 8325) | function indexOf(array, obj) {
  function arrayRemove (line 8334) | function arrayRemove(array, value) {
  function isLeafNode (line 8341) | function isLeafNode (node) {
  function copy (line 8410) | function copy(source, destination, stackSource, stackDest) {
  function shallowCopy (line 8478) | function shallowCopy(src, dst) {
  function equals (line 8528) | function equals(o1, o2) {
  function csp (line 8569) | function csp() {
  function concat (line 8576) | function concat(array1, array2, index) {
  function sliceArgs (line 8580) | function sliceArgs(args, startIndex) {
  function bind (line 8604) | function bind(self, fn) {
  function toJsonReplacer (line 8625) | function toJsonReplacer(key, value) {
  function toJson (line 8656) | function toJson(obj, pretty) {
  function fromJson (line 8674) | function fromJson(json) {
  function toBoolean (line 8681) | function toBoolean(value) {
  function startingTag (line 8696) | function startingTag(element) {
  function tryDecodeURIComponent (line 8728) | function tryDecodeURIComponent(value) {
  function parseKeyValue (line 8741) | function parseKeyValue(/**string*/keyValue) {
  function toKeyValue (line 8762) | function toKeyValue(obj) {
  function encodeUriSegment (line 8790) | function encodeUriSegment(val) {
  function encodeUriQuery (line 8809) | function encodeUriQuery(val, pctEncodeSpaces) {
  function angularInit (line 8865) | function angularInit(element, bootstrap) {
  function bootstrap (line 8963) | function bootstrap(element, modules) {
  function snake_case (line 9005) | function snake_case(name, separator) {
  function bindJQuery (line 9012) | function bindJQuery() {
  function assertArg (line 9040) | function assertArg(arg, name, reason) {
  function assertArgFn (line 9047) | function assertArgFn(arg, name, acceptArrayAnnotation) {
  function assertNotHasOwnProperty (line 9062) | function assertNotHasOwnProperty(name, context) {
  function getter (line 9076) | function getter(obj, path, bindFnToScope) {
  function getBlockElements (line 9100) | function getBlockElements(nodes) {
  function setupModuleLoader (line 9128) | function setupModuleLoader(window) {
  function publishExternalAPI (line 9531) | function publishExternalAPI(angular){
  function jqNextId (line 9767) | function jqNextId() { return ++jqId; }
  function camelCase (line 9779) | function camelCase(name) {
  function jqLitePatchJQueryRemove (line 9795) | function jqLitePatchJQueryRemove(name, dispatchThis, filterElems, getter...
  function jqLiteIsTextNode (line 9849) | function jqLiteIsTextNode(html) {
  function jqLiteBuildFragment (line 9853) | function jqLiteBuildFragment(html, context) {
  function jqLiteParseHTML (line 9888) | function jqLiteParseHTML(html, context) {
  function JQLite (line 9900) | function JQLite(element) {
  function jqLiteClone (line 9923) | function jqLiteClone(element) {
  function jqLiteDealoc (line 9927) | function jqLiteDealoc(element){
  function jqLiteOff (line 9934) | function jqLiteOff(element, type, fn, unsupported) {
  function jqLiteRemoveData (line 9959) | function jqLiteRemoveData(element, name) {
  function jqLiteExpandoStore (line 9978) | function jqLiteExpandoStore(element, key, value) {
  function jqLiteData (line 9993) | function jqLiteData(element, key, value) {
  function jqLiteHasClass (line 10019) | function jqLiteHasClass(element, selector) {
  function jqLiteRemoveClass (line 10025) | function jqLiteRemoveClass(element, cssClasses) {
  function jqLiteAddClass (line 10037) | function jqLiteAddClass(element, cssClasses) {
  function jqLiteAddNodes (line 10053) | function jqLiteAddNodes(root, elements) {
  function jqLiteController (line 10064) | function jqLiteController(element, name) {
  function jqLiteInheritedData (line 10068) | function jqLiteInheritedData(element, name, value) {
  function jqLiteEmpty (line 10091) | function jqLiteEmpty(element) {
  function trigger (line 10107) | function trigger() {
  function getBooleanAttrName (line 10154) | function getBooleanAttrName(element, name) {
  function getText (line 10261) | function getText(element, value) {
  function createEventHandler (line 10346) | function createEventHandler(element, events) {
  function hashKey (line 10649) | function hashKey(obj) {
  function HashMap (line 10670) | function HashMap(array){
  function annotate (line 10768) | function annotate(fn) {
  function createInjector (line 11289) | function createInjector(modulesToLoad) {
  function $AnchorScrollProvider (line 11547) | function $AnchorScrollProvider() {
  function async (line 11682) | function async(fn) {
  function $$AsyncCallbackProvider (line 11845) | function $$AsyncCallbackProvider(){
  function Browser (line 11877) | function Browser(window, document, $log, $sniffer) {
  function $BrowserProvider (line 12231) | function $BrowserProvider(){
  function $CacheFactoryProvider (line 12317) | function $CacheFactoryProvider() {
  function $TemplateCacheProvider (line 12629) | function $TemplateCacheProvider() {
  function $CompileProvider (line 13139) | function $CompileProvider($provide, $$sanitizeUriProvider) {
  function directiveNormalize (line 14586) | function directiveNormalize(name) {
  function nodesetLinkingFn (line 14633) | function nodesetLinkingFn(
  function directiveLinkingFn (line 14640) | function directiveLinkingFn(
  function tokenDifference (line 14648) | function tokenDifference(str1, str2) {
  function $ControllerProvider (line 14674) | function $ControllerProvider() {
  function $DocumentProvider (line 14776) | function $DocumentProvider(){
  function $ExceptionHandlerProvider (line 14814) | function $ExceptionHandlerProvider() {
  function parseHeaders (line 14828) | function parseHeaders(headers) {
  function headersGetter (line 14863) | function headersGetter(headers) {
  function transformData (line 14888) | function transformData(data, headers, fns) {
  function isSuccess (line 14900) | function isSuccess(status) {
  function $HttpProvider (line 14905) | function $HttpProvider() {
  function createXhr (line 15858) | function createXhr(method) {
  function $HttpBackendProvider (line 15888) | function $HttpBackendProvider() {
  function createHttpBackend (line 15894) | function createHttpBackend($browser, createXhr, $browserDefer, callbacks...
  function $InterpolateProvider (line 16102) | function $InterpolateProvider() {
  function $IntervalProvider (line 16314) | function $IntervalProvider() {
  function $LocaleProvider (line 16508) | function $LocaleProvider(){
  function encodePath (line 16581) | function encodePath(path) {
  function parseAbsoluteUrl (line 16592) | function parseAbsoluteUrl(absoluteUrl, locationObj, appBase) {
  function parseAppUrl (line 16601) | function parseAppUrl(relativeUrl, locationObj, appBase) {
  function beginsWith (line 16626) | function beginsWith(begin, whole) {
  function stripHash (line 16633) | function stripHash(url) {
  function stripFile (line 16639) | function stripFile(url) {
  function serverBase (line 16644) | function serverBase(url) {
  function LocationHtml5Url (line 16657) | function LocationHtml5Url(appBase, basePrefix) {
  function LocationHashbangUrl (line 16725) | function LocationHashbangUrl(appBase, hashPrefix) {
  function LocationHashbangInHtml5Url (line 16818) | function LocationHashbangInHtml5Url(appBase, hashPrefix) {
  function locationGetter (line 17064) | function locationGetter(property) {
  function locationGetterSetter (line 17071) | function locationGetterSetter(property, preprocess) {
  function $LocationProvider (line 17116) | function $LocationProvider(){
  function $LogProvider (line 17364) | function $LogProvider(){
  function ensureSafeMemberName (line 17516) | function ensureSafeMemberName(name, fullExpression) {
  function ensureSafeObject (line 17525) | function ensureSafeObject(obj, fullExpression) {
  function setter (line 18305) | function setter(obj, path, setValue, fullExp, options) {
  function cspSafeGetterFn (line 18343) | function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) {
  function simpleGetterFn1 (line 18447) | function simpleGetterFn1(key0, fullExp) {
  function simpleGetterFn2 (line 18456) | function simpleGetterFn2(key0, key1, fullExp) {
  function getterFn (line 18467) | function getterFn(path, options, fullExp) {
  function $ParseProvider (line 18595) | function $ParseProvider() {
  function $QProvider (line 18896) | function $QProvider() {
  function qFactory (line 18914) | function qFactory(nextTick, exceptionHandler) {
  function $$RAFProvider (line 19252) | function $$RAFProvider(){ //rAF
  function $RootScopeProvider (line 19351) | function $RootScopeProvider(){
  function $$SanitizeUriProvider (line 20435) | function $$SanitizeUriProvider() {
  function escapeForRegexp (line 20521) | function escapeForRegexp(s) {
  function adjustMatcher (line 20527) | function adjustMatcher(matcher) {
  function adjustMatchers (line 20555) | function adjustMatchers(matchers) {
  function $SceDelegateProvider (line 20631) | function $SceDelegateProvider() {
  function $SceProvider (line 21162) | function $SceProvider() {
  function $SnifferProvider (line 21575) | function $SnifferProvider() {
  function $TimeoutProvider (line 21652) | function $TimeoutProvider() {
  function urlResolve (line 21798) | function urlResolve(url, base) {
  function urlIsSameOrigin (line 21832) | function urlIsSameOrigin(requestUrl) {
  function $WindowProvider (line 21878) | function $WindowProvider(){
  function $FilterProvider (line 21974) | function $FilterProvider($provide) {
  function filterFilter (line 22142) | function filterFilter() {
  function currencyFilter (line 22296) | function currencyFilter($locale) {
  function numberFilter (line 22356) | function numberFilter($locale) {
  function formatNumber (line 22365) | function formatNumber(number, pattern, groupSep, decimalSep, fractionSiz...
  function padNumber (line 22439) | function padNumber(num, digits, trim) {
  function dateGetter (line 22453) | function dateGetter(name, size, offset, trim) {
  function dateStrGetter (line 22464) | function dateStrGetter(name, shortForm) {
  function timeZoneGetter (line 22473) | function timeZoneGetter(date) {
  function ampmGetter (line 22483) | function ampmGetter(date, formats) {
  function dateFilter (line 22599) | function dateFilter($locale) {
  function jsonFilter (line 22702) | function jsonFilter() {
  function limitToFilter (line 22799) | function limitToFilter(){
  function orderByFilter (line 22951) | function orderByFilter($parse){
  function ngDirective (line 23008) | function ngDirective(directive) {
  function FormController (line 23509) | function FormController(element, attrs, $scope, $animate) {
  function validate (line 24317) | function validate(ctrl, validatorName, validity, value){
  function addNativeHtml5Validators (line 24323) | function addNativeHtml5Validators(ctrl, validatorName, element) {
  function textInputType (line 24340) | function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function numberInputType (line 24490) | function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function urlInputType (line 24535) | function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function emailInputType (line 24546) | function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function radioInputType (line 24557) | function radioInputType(scope, element, attr, ctrl) {
  function checkboxInputType (line 24579) | function checkboxInputType(scope, element, attr, ctrl) {
  function toggleValidCss (line 24968) | function toggleValidCss(isValid, validationErrorKey) {
  function getStringValue (line 25669) | function getStringValue() { return (parsed(scope) || '').toString(); }
  function classDirective (line 25677) | function classDirective(name, selector) {
  function getBlockStart (line 27889) | function getBlockStart(block) {
  function getBlockEnd (line 27893) | function getBlockEnd(block) {
  function setupAsSingle (line 28831) | function setupAsSingle(scope, selectElement, ngModelCtrl, selectCtrl) {
  function setupAsMultiple (line 28856) | function setupAsMultiple(scope, selectElement, ctrl) {
  function setupAsOptions (line 28887) | function setupAsOptions(scope, selectElement, ctrl) {
  function extractElementNode (line 29541) | function extractElementNode(element) {
  function prepareElement (line 29550) | function prepareElement(element) {
  function stripCommentsFromElement (line 29554) | function stripCommentsFromElement(element) {
  function isMatchingElement (line 29558) | function isMatchingElement(elm1, elm2) {
  function lookup (line 29587) | function lookup(name) {
  function animationRunner (line 29617) | function animationRunner(element, animationEvent, className) {
  function performAnimation (line 30043) | function performAnimation(animationEvent, className, element, parentElem...
  function cancelChildAnimations (line 30247) | function cancelChildAnimations(element) {
  function cleanup (line 30265) | function cleanup(element, className) {
  function animationsDisabled (line 30287) | function animationsDisabled(element, parentElement) {
  function afterReflow (line 30361) | function afterReflow(element, callback) {
  function animationCloseHandler (line 30380) | function animationCloseHandler(element, totalTime) {
  function closeAllAnimations (line 30404) | function closeAllAnimations(elements) {
  function getElementAnimationDetails (line 30413) | function getElementAnimationDetails(element, cacheKey) {
  function parseMaxTime (line 30471) | function parseMaxTime(str) {
  function getCacheKey (line 30482) | function getCacheKey(element) {
  function animateSetup (line 30492) | function animateSetup(animationEvent, element, className, calculationDec...
  function isStructuralAnimation (line 30558) | function isStructuralAnimation(className) {
  function blockTransitions (line 30562) | function blockTransitions(element, className, isAnimating) {
  function blockKeyframeAnimations (line 30570) | function blockKeyframeAnimations(element) {
  function unblockTransitions (line 30574) | function unblockTransitions(element, className) {
  function unblockKeyframeAnimations (line 30583) | function unblockKeyframeAnimations(element) {
  function animateRun (line 30591) | function animateRun(animationEvent, element, className, activeAnimationC...
  function prepareStaggerDelay (line 30698) | function prepareStaggerDelay(delayStyle, staggerDelay, index) {
  function animateBefore (line 30707) | function animateBefore(animationEvent, element, className, calculationDe...
  function animateAfter (line 30715) | function animateAfter(animationEvent, element, className, afterAnimation...
  function animate (line 30724) | function animate(animationEvent, element, className, animationComplete) {
  function animateClose (line 30754) | function animateClose(element, className) {
  function suffixClasses (line 30871) | function suffixClasses(classes, suffix) {
  function $SanitizeProvider (line 31032) | function $SanitizeProvider() {
  function sanitizeText (line 31044) | function sanitizeText(chars) {
  function makeMap (line 31112) | function makeMap(str) {
  function htmlParser (line 31131) | function htmlParser( html, handler ) {
  function decodeEntities (line 31270) | function decodeEntities(value) {
  function encodeEntities (line 31298) | function encodeEntities(value) {
  function htmlSanitizeWriter (line 31323) | function htmlSanitizeWriter(buf, uriValidator){
  function addText (line 31499) | function addText(text) {
  function addLink (line 31506) | function addLink(url, text) {
  function inherit (line 31558) | function inherit(parent, extra) {
  function merge (line 31562) | function merge(dst) {
  function ancestors (line 31580) | function ancestors(first, second) {
  function keys (line 31596) | function keys(object) {
  function arraySearch (line 31615) | function arraySearch(array, value) {
  function inheritParams (line 31639) | function inheritParams(currentParams, newParams, $current, $to) {
  function normalize (line 31662) | function normalize(keys, values) {
  function equalForKeys (line 31681) | function equalForKeys(a, b, keys) {
  function filterByKeys (line 31701) | function filterByKeys(keys, values) {
  function $Resolve (line 31803) | function $Resolve(  $q,    $injector) {
  function $TemplateFactory (line 32047) | function $TemplateFactory(  $http,   $templateCache,   $injector) {
  function UrlMatcher (line 32203) | function UrlMatcher(pattern) {
  function $UrlMatcherFactory (line 32409) | function $UrlMatcherFactory() {
  function $UrlRouterProvider (line 32466) | function $UrlRouterProvider(  $urlMatcherFactory) {
  function $StateProvider (line 32747) | function $StateProvider(   $urlRouterProvider,   $urlMatcherFactory,    ...
  function $ViewProvider (line 33931) | function $ViewProvider() {
  function $ViewScrollProvider (line 34008) | function $ViewScrollProvider() {
  function $ViewDirective (line 34168) | function $ViewDirective(   $state,   $injector,   $uiViewScroll) {
  function $ViewDirectiveFill (line 34298) | function $ViewDirectiveFill ($compile, $controller, $state) {
  function parseStateRef (line 34345) | function parseStateRef(ref) {
  function stateContext (line 34351) | function stateContext(el) {
  function $StateRefDirective (line 34422) | function $StateRefDirective($state, $timeout) {
  function $StateActiveDirective (line 34534) | function $StateActiveDirective($state, $stateParams, $interpolate) {
  function $IsStateFilter (line 34582) | function $IsStateFilter($state) {
  function $IncludedByStateFilter (line 34598) | function $IncludedByStateFilter($state) {
  function $RouteProvider (line 34627) | function $RouteProvider(  $stateProvider,    $urlRouterProvider) {
  function actionSheet (line 34923) | function actionSheet(opts) {
  function retain (line 35141) | function retain() {
  function release (line 35149) | function release() {
  function getElement (line 35158) | function getElement() {
  function hideWithTransform (line 35333) | function hideWithTransform(element) {
  function CollectionRepeatDataSource (line 35337) | function CollectionRepeatDataSource(options) {
  function disconnectScope (line 35483) | function disconnectScope(scope) {
  function reconnectScope (line 35505) | function reconnectScope(scope) {
  function CollectionRepeatManager (line 35534) | function CollectionRepeatManager(options) {
  function calculateSize (line 35641) | function calculateSize(dim) {
  function doRender (line 35824) | function doRender(dataIndex, rect) {
  function delegateService (line 35867) | function delegateService(methodNames) {
  function getLoader (line 36170) | function getLoader() {
  function showLoader (line 36246) | function showLoader(options) {
  function hideLoader (line 36277) | function hideLoader() {
  function componentConfig (line 36695) | function componentConfig(defaults) {
  function positionView (line 36973) | function positionView(target, popoverEle) {
  function createPopup (line 37374) | function createPopup(options) {
  function onHardwareBackButton (line 37459) | function onHardwareBackButton(e) {
  function showPopup (line 37463) | function showPopup(options) {
  function focusInput (line 37524) | function focusInput(element) {
  function showAlert (line 37531) | function showAlert(opts) {
  function showConfirm (line 37543) | function showConfirm(opts) {
  function showPrompt (line 37557) | function showPrompt(opts) {
  function getStyle (line 37600) | function getStyle(el, cssprop) {
  function isStaticPositioned (line 37614) | function isStaticPositioned(element) {
  function $ionicTemplateCache (line 38238) | function $ionicTemplateCache(templates){
  function fetchTemplate (line 38322) | function fetchTemplate(url) {
  function loadAndCompile (line 38329) | function loadAndCompile(options) {
  function onHardwareBackButton (line 38444) | function onHardwareBackButton(e) {
  function createViewId (line 38508) | function createViewId(stateId) {
  function getParentAnimationClass (line 38812) | function getParentAnimationClass(el) {
  function setAnimationClass (line 38827) | function setAnimationClass() {
  function $LocationDecorator (line 38967) | function $LocationDecorator($location, $timeout) {
  function rerender (line 40323) | function rerender(value) {
  function rerenderOnResize (line 40352) | function rerenderOnResize() {
  function collectionRepeatSrcDirective (line 40381) | function collectionRepeatSrcDirective(ngAttrName, attrName) {
  function prelink (line 40464) | function prelink($scope, $element, $attr, navViewCtrl) {
  function checkAsideExpose (line 40594) | function checkAsideExpose() {
  function onResize (line 40600) | function onResize() {
  function gestureDirective (line 40859) | function gestureDirective(directiveName) {
  function tapScrollToTopDirective (line 40964) | function tapScrollToTopDirective() {
  function headerFooterBarDirective (line 41004) | function headerFooterBarDirective(isHeader) {
  function calculateMaxValue (line 41118) | function calculateMaxValue(distance, maximum, isPercent) {
  function checkInfiniteBounds (line 41183) | function checkInfiniteBounds() {
  function stopPropagation (line 41395) | function stopPropagation(e) {
  function onShow (line 41546) | function onShow(e) {
  function onHide (line 41560) | function onHide() {
  function keyboardAttachGetClientHeight (line 41582) | function keyboardAttachGetClientHeight(element) {
  function init (line 41683) | function init() {
  function prelink (line 42089) | function prelink($scope, $element, $attr, navBarCtrl) {
  function prelink (line 42239) | function prelink($scope, $element, $attrs) {
  function updateView (line 42408) | function updateView(doAnimate) {
  function eventStopPropagation (line 42514) | function eventStopPropagation(e) {
  function prelink (line 42797) | function prelink($scope, $element, $attr) {
  function prelink (line 42956) | function prelink($scope, $element, $attr, sideMenuCtrl) {
  function prelink (line 43181) | function prelink($scope) {
  function attrStr (line 43433) | function attrStr(k,v) {
  function selectIfMatchesState (line 43498) | function selectIfMatchesState() {
  function prelink (line 43662) | function prelink($scope, $element, $attr, tabsCtrl) {
  function s (line 43873) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function clamp (line 43994) | function clamp(min, n, max) { return Math.max(min, Math.min(n, max)); }
  function Animator (line 43998) | function Animator(opts) {
  function figureOutEasing (line 44206) | function figureOutEasing(easing) {
  function B1 (line 44362) | function B1(t) { return t*t*t; }
  function B2 (line 44363) | function B2(t) { return 3*t*t*(1-t); }
  function B3 (line 44364) | function B3(t) { return 3*t*(1-t)*(1-t); }
  function B4 (line 44365) | function B4(t) { return (1-t)*(1-t)*(1-t); }
  function solveEpsilon (line 44384) | function solveEpsilon(duration) {
  function unitBezier (line 44396) | function unitBezier(p1x, p1y, p2x, p2y) {
  function dynamicsSpring (line 44569) | function dynamicsSpring(opts) {
  function dynamicsGravity (line 44614) | function dynamicsGravity(opts) {
  function step (line 44778) | function step() {
  function SimpleEventEmitter (line 44836) | function SimpleEventEmitter() {
  function onceFn (line 44848) | function onceFn() {
  function noop (line 44971) | function noop() {}

FILE: www/lib/ionic/js/ionic.js
  function domReady (line 28) | function domReady() {
  function setup (line 518) | function setup() {
  function onWindowLoad (line 2201) | function onWindowLoad() {
  function onPlatformReady (line 2215) | function onPlatformReady() {
  function update (line 2269) | function update(fn) {
  function tapEventListener (line 2599) | function tapEventListener(type, enable, useCapture) {
  function tapClick (line 2607) | function tapClick(e) {
  function triggerMouseEvent (line 2623) | function triggerMouseEvent(type, ele, x, y) {
  function tapClickGateKeeper (line 2631) | function tapClickGateKeeper(e) {
  function tapMouseDown (line 2652) | function tapMouseDown(e) {
  function tapMouseUp (line 2677) | function tapMouseUp(e) {
  function tapMouseMove (line 2694) | function tapMouseMove(e) {
  function tapTouchStart (line 2705) | function tapTouchStart(e) {
  function tapTouchEnd (line 2730) | function tapTouchEnd(e) {
  function tapTouchMove (line 2746) | function tapTouchMove(e) {
  function tapTouchCancel (line 2755) | function tapTouchCancel(e) {
  function tapEnableTouchEvents (line 2761) | function tapEnableTouchEvents() {
  function tapIgnoreEvent (line 2769) | function tapIgnoreEvent(e) {
  function tapHandleFocus (line 2779) | function tapHandleFocus(ele) {
  function tapFocusOutActive (line 2814) | function tapFocusOutActive() {
  function tapFocusIn (line 2823) | function tapFocusIn(e) {
  function tapFocusOut (line 2844) | function tapFocusOut() {
  function tapActiveElement (line 2848) | function tapActiveElement(ele) {
  function tapHasPointerMoved (line 2855) | function tapHasPointerMoved(endEvent) {
  function tapContainingElement (line 2870) | function tapContainingElement(ele, allowSelf) {
  function tapTargetElement (line 2880) | function tapTargetElement(ele) {
  function clear (line 2967) | function clear() {
  function activateElements (line 2975) | function activateElements() {
  function deactivateElements (line 2986) | function deactivateElements() {
  function keyboardInit (line 3262) | function keyboardInit() {
  function keyboardNativeShow (line 3287) | function keyboardNativeShow(e) {
  function keyboardBrowserFocusIn (line 3292) | function keyboardBrowserFocusIn(e) {
  function keyboardSetShow (line 3305) | function keyboardSetShow(e) {
  function keyboardShow (line 3334) | function keyboardShow(element, elementTop, elementBottom, viewportHeight...
  function keyboardFocusOut (line 3374) | function keyboardFocusOut(e) {
  function keyboardHide (line 3380) | function keyboardHide() {
  function keyboardUpdateViewportHeight (line 3401) | function keyboardUpdateViewportHeight() {
  function keyboardOnKeyDown (line 3407) | function keyboardOnKeyDown(e) {
  function keyboardPreventDefault (line 3413) | function keyboardPreventDefault(e) {
  function keyboardOrientationChange (line 3419) | function keyboardOrientationChange() {
  function keyboardGetHeight (line 3450) | function keyboardGetHeight() {
  function getViewportHeight (line 3487) | function getViewportHeight() {
  function keyboardIsWithinScroll (line 3491) | function keyboardIsWithinScroll(ele) {
  function keyboardHasPlugin (line 3501) | function keyboardHasPlugin() {
  function viewportLoadTag (line 3535) | function viewportLoadTag() {
  function viewportUpdate (line 3558) | function viewportUpdate() {
  function viewportTagUpdate (line 3642) | function viewportTagUpdate() {
  function getEventTouches (line 4376) | function getEventTouches(e) {
  function setup (line 6849) | function setup() {
  function prev (line 6902) | function prev() {
  function next (line 6909) | function next() {
  function circle (line 6916) | function circle(index) {
  function slide (line 6923) | function slide(to, slideSpeed) {
  function move (line 6966) | function move(index, dist, speed) {
  function translate (line 6973) | function translate(index, dist, speed) {
  function animate (line 6993) | function animate(from, to, speed) {
  function begin (line 7032) | function begin() {
  function stop (line 7038) | function stop() {

FILE: www/lib/mockfirebase/dist/mockfirebase.js
  function s (line 5) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function Buffer (line 365) | function Buffer (subject, encoding, noZero) {
  function hexWrite (line 526) | function hexWrite (buf, string, offset, length) {
  function utf8Write (line 553) | function utf8Write (buf, string, offset, length) {
  function asciiWrite (line 558) | function asciiWrite (buf, string, offset, length) {
  function binaryWrite (line 563) | function binaryWrite (buf, string, offset, length) {
  function base64Write (line 567) | function base64Write (buf, string, offset, length) {
  function utf16leWrite (line 572) | function utf16leWrite (buf, string, offset, length) {
  function base64Slice (line 728) | function base64Slice (buf, start, end) {
  function utf8Slice (line 736) | function utf8Slice (buf, start, end) {
  function asciiSlice (line 753) | function asciiSlice (buf, start, end) {
  function binarySlice (line 763) | function binarySlice (buf, start, end) {
  function hexSlice (line 767) | function hexSlice (buf, start, end) {
  function utf16leSlice (line 780) | function utf16leSlice (buf, start, end) {
  function readUInt16 (line 849) | function readUInt16 (buf, offset, littleEndian, noAssert) {
  function readUInt32 (line 881) | function readUInt32 (buf, offset, littleEndian, noAssert) {
  function readInt16 (line 938) | function readInt16 (buf, offset, littleEndian, noAssert) {
  function readInt32 (line 965) | function readInt32 (buf, offset, littleEndian, noAssert) {
  function readFloat (line 992) | function readFloat (buf, offset, littleEndian, noAssert) {
  function readDouble (line 1009) | function readDouble (buf, offset, littleEndian, noAssert) {
  function writeUInt16 (line 1040) | function writeUInt16 (buf, value, offset, littleEndian, noAssert) {
  function writeUInt32 (line 1069) | function writeUInt32 (buf, value, offset, littleEndian, noAssert) {
  function writeInt16 (line 1115) | function writeInt16 (buf, value, offset, littleEndian, noAssert) {
  function writeInt32 (line 1143) | function writeInt32 (buf, value, offset, littleEndian, noAssert) {
  function writeFloat (line 1171) | function writeFloat (buf, value, offset, littleEndian, noAssert) {
  function writeDouble (line 1196) | function writeDouble (buf, value, offset, littleEndian, noAssert) {
  function base64clean (line 1350) | function base64clean (str) {
  function stringtrim (line 1360) | function stringtrim (str) {
  function isArray (line 1365) | function isArray (subject) {
  function isArrayish (line 1371) | function isArrayish (subject) {
  function toHex (line 1377) | function toHex (n) {
  function utf8ToBytes (line 1382) | function utf8ToBytes (str) {
  function asciiToBytes (line 1400) | function asciiToBytes (str) {
  function utf16leToBytes (line 1409) | function utf16leToBytes (str) {
  function base64ToBytes (line 1423) | function base64ToBytes (str) {
  function blitBuffer (line 1427) | function blitBuffer (src, dst, offset, length) {
  function decodeUtf8Char (line 1436) | function decodeUtf8Char (str) {
  function verifuint (line 1449) | function verifuint (value, max) {
  function verifsint (line 1456) | function verifsint (value, max, min) {
  function verifIEEE754 (line 1463) | function verifIEEE754 (value, max, min) {
  function assert (line 1469) | function assert (test, message) {
  function decode (line 1489) | function decode (elt) {
  function b64ToByteArray (line 1505) | function b64ToByteArray (b64) {
  function uint8ToBase64 (line 1551) | function uint8ToBase64 (uint8) {
  function baseIndexOf (line 1852) | function baseIndexOf(array, value, fromIndex) {
  function cacheIndexOf (line 1873) | function cacheIndexOf(cache, value) {
  function cachePush (line 1897) | function cachePush(value) {
  function charAtCallback (line 1926) | function charAtCallback(value) {
  function compareAscending (line 1939) | function compareAscending(a, b) {
  function createCache (line 1974) | function createCache(array) {
  function escapeStringChar (line 2007) | function escapeStringChar(match) {
  function getArray (line 2017) | function getArray() {
  function getObject (line 2027) | function getObject() {
  function releaseArray (line 2051) | function releaseArray(array) {
  function releaseObject (line 2064) | function releaseObject(object) {
  function slice (line 2088) | function slice(array, start, end) {
  function runInContext (line 2114) | function runInContext(context) {
  function MockFirebase (line 8549) | function MockFirebase(currentPath, data, parent, name) {
  function MockQuery (line 9251) | function MockQuery(ref) {
  function fn (line 9362) | function fn() {
  function MockFirebaseSimpleLogin (line 9402) | function MockFirebaseSimpleLogin(ref, callback, userData) {
  function Slice (line 9614) | function Slice(queue, snap) {
  function FlushQueue (line 9800) | function FlushQueue() {
  function process (line 9821) | function process() {
  function priAndKeyComparator (line 9837) | function priAndKeyComparator(testPri, testKey, valPri, valKey) {
  function priorityComparator (line 9848) | function priorityComparator(a,b) {
  function createEmailUser (line 9910) | function createEmailUser(email, password) {
  function createDefaultUser (line 9923) | function createDefaultUser(provider) {
  function ref (line 9971) | function ref(path, autoSyncDelay) {
  function mergePaths (line 9978) | function mergePaths(base, add) {
  function makeRefSnap (line 9982) | function makeRefSnap(ref) {
  function makeSnap (line 9986) | function makeSnap(ref, data, pri) {
  function extractName (line 10007) | function extractName(path) {
  function createError (line 10011) | function createError(code, message) {
  function getMeta (line 10015) | function getMeta(data, key, defaultVal) {
  function cleanData (line 10025) | function cleanData(data) {
  function assertKey (line 10042) | function assertKey(method, key, argNum) {
  function assertQuery (line 10049) | function assertQuery(method, pri, key) {
Condensed preview — 144 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,000K chars).
[
  {
    "path": ".bowerrc",
    "chars": 29,
    "preview": "{\n  \"directory\": \"www/lib\"\n}\n"
  },
  {
    "path": ".gitignore",
    "chars": 138,
    "preview": "# Specifies intentionally untracked files to ignore when using Git\n# http://git-scm.com/docs/gitignore\n\nnode_modules/\npl"
  },
  {
    "path": "LICENSE",
    "chars": 1099,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2014\nJeremy Wilken (Gnome on the run)\n\nPermission is hereby granted, free of charge"
  },
  {
    "path": "README.md",
    "chars": 694,
    "preview": "# Ionic Framework Demo App\n\nThis is a demo app built with the Ionic Framework that you can preview in the browser or clo"
  },
  {
    "path": "bower.json",
    "chars": 189,
    "preview": "{\n  \"name\": \"ionic-in-action-demo\",\n  \"private\": \"true\",\n  \"dependencies\": {\n    \"ionic\": \"driftyco/ionic-bower#1.0.0-be"
  },
  {
    "path": "config.xml",
    "chars": 919,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<widget id=\"com.ionicinaction.demo\" version=\"0.0.1\" xmlns=\"http:"
  },
  {
    "path": "gulpfile.js",
    "chars": 1353,
    "preview": "var gulp = require('gulp');\nvar gutil = require('gulp-util');\nvar bower = require('bower');\nvar concat = require('gulp-c"
  },
  {
    "path": "hooks/README.md",
    "chars": 3018,
    "preview": "<!--\n#\n# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements.  See the N"
  },
  {
    "path": "hooks/after_prepare/010_add_platform_class.js",
    "chars": 2735,
    "preview": "#!/usr/bin/env node\n\n// Add Platform Class\n// v1.0\n// Automatically adds the platform class to the body tag\n// after the"
  },
  {
    "path": "ionic.project",
    "chars": 53,
    "preview": "{\n  \"name\": \"ionic-in-action-demo\",\n  \"app_id\": \"\"\n}\n"
  },
  {
    "path": "package.json",
    "chars": 367,
    "preview": "{\n  \"name\": \"ionic-in-action-demo\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Ionic in Action Demo\",\n  \"dependencies\": {\n "
  },
  {
    "path": "scss/ionic.app.scss",
    "chars": 826,
    "preview": "/*\nTo customize the look and feel of Ionic, you can override the variables\nin ionic's _variables.scss file.\n\nFor example"
  },
  {
    "path": "www/api/data.json",
    "chars": 7601,
    "preview": "{\n  \"menu\": [\n    {\n      \"meal\": \"Breakfast\",\n      \"items\": [\n        { \"item\": \"Eggs\", \"price\": 2.50 },\n        { \"it"
  },
  {
    "path": "www/css/style.css",
    "chars": 384,
    "preview": ".tour {\n  background-color: #ffefd6;\n  text-align: center;\n  position: absolute;\n  z-index: 100;\n}\n.tour .slider {\n  hei"
  },
  {
    "path": "www/index.html",
    "chars": 2702,
    "preview": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"initial-scale=1, maximum-s"
  },
  {
    "path": "www/js/app.js",
    "chars": 2694,
    "preview": "angular.module('App', ['ionic', 'firebase'])\n\n.config(function ($stateProvider, $urlRouterProvider) {\n  $stateProvider\n "
  },
  {
    "path": "www/lib/angular/.bower.json",
    "chars": 417,
    "preview": "{\n  \"name\": \"angular\",\n  \"version\": \"1.2.24\",\n  \"main\": \"./angular.js\",\n  \"dependencies\": {},\n  \"homepage\": \"https://git"
  },
  {
    "path": "www/lib/angular/README.md",
    "chars": 1615,
    "preview": "# bower-angular\n\nThis repo is for distribution on `bower`. The source for this module is in the\n[main AngularJS repo](ht"
  },
  {
    "path": "www/lib/angular/angular-csp.css",
    "chars": 535,
    "preview": "/* Include this file in your html if you are using the CSP mode. */\n\n@charset \"UTF-8\";\n\n[ng\\:cloak], [ng-cloak], [data-n"
  },
  {
    "path": "www/lib/angular/angular.js",
    "chars": 782507,
    "preview": "/**\n * @license AngularJS v1.2.24\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(windo"
  },
  {
    "path": "www/lib/angular/bower.json",
    "chars": 98,
    "preview": "{\n  \"name\": \"angular\",\n  \"version\": \"1.2.24\",\n  \"main\": \"./angular.js\",\n  \"dependencies\": {\n  }\n}\n"
  },
  {
    "path": "www/lib/angular-animate/.bower.json",
    "chars": 484,
    "preview": "{\n  \"name\": \"angular-animate\",\n  \"version\": \"1.2.24\",\n  \"main\": \"./angular-animate.js\",\n  \"dependencies\": {\n    \"angular"
  },
  {
    "path": "www/lib/angular-animate/README.md",
    "chars": 1796,
    "preview": "# bower-angular-animate\n\nThis repo is for distribution on `bower`. The source for this module is in the\n[main AngularJS "
  },
  {
    "path": "www/lib/angular-animate/angular-animate.js",
    "chars": 77392,
    "preview": "/**\n * @license AngularJS v1.2.24\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(windo"
  },
  {
    "path": "www/lib/angular-animate/bower.json",
    "chars": 138,
    "preview": "{\n  \"name\": \"angular-animate\",\n  \"version\": \"1.2.24\",\n  \"main\": \"./angular-animate.js\",\n  \"dependencies\": {\n    \"angular"
  },
  {
    "path": "www/lib/angular-sanitize/.bower.json",
    "chars": 489,
    "preview": "{\n  \"name\": \"angular-sanitize\",\n  \"version\": \"1.2.24\",\n  \"main\": \"./angular-sanitize.js\",\n  \"dependencies\": {\n    \"angul"
  },
  {
    "path": "www/lib/angular-sanitize/README.md",
    "chars": 1804,
    "preview": "# bower-angular-sanitize\n\nThis repo is for distribution on `bower`. The source for this module is in the\n[main AngularJS"
  },
  {
    "path": "www/lib/angular-sanitize/angular-sanitize.js",
    "chars": 21794,
    "preview": "/**\n * @license AngularJS v1.2.24\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(windo"
  },
  {
    "path": "www/lib/angular-sanitize/bower.json",
    "chars": 140,
    "preview": "{\n  \"name\": \"angular-sanitize\",\n  \"version\": \"1.2.24\",\n  \"main\": \"./angular-sanitize.js\",\n  \"dependencies\": {\n    \"angul"
  },
  {
    "path": "www/lib/angular-ui-router/.bower.json",
    "chars": 717,
    "preview": "{\n  \"name\": \"angular-ui-router\",\n  \"version\": \"0.2.10\",\n  \"main\": \"./release/angular-ui-router.js\",\n  \"dependencies\": {\n"
  },
  {
    "path": "www/lib/angular-ui-router/CHANGELOG.md",
    "chars": 1653,
    "preview": "<a name=\"v0.2.8\"></a>\n### v0.2.8 (2014-01-16)\n\n\n#### Bug Fixes\n\n* **$state:** allow null to be passed as 'params' param "
  },
  {
    "path": "www/lib/angular-ui-router/LICENSE",
    "chars": 1097,
    "preview": "The MIT License\n\nCopyright (c) 2014 The AngularUI Team, Karsten Sperling\n\nPermission is hereby granted, free of charge, "
  },
  {
    "path": "www/lib/angular-ui-router/README.md",
    "chars": 11256,
    "preview": "# AngularUI Router &nbsp;[![Build Status](https://travis-ci.org/angular-ui/ui-router.png?branch=master)](https://travis-"
  },
  {
    "path": "www/lib/angular-ui-router/bower.json",
    "chars": 389,
    "preview": "{\n  \"name\": \"angular-ui-router\",\n  \"version\": \"0.2.10\",\n  \"main\": \"./release/angular-ui-router.js\",\n  \"dependencies\": {\n"
  },
  {
    "path": "www/lib/angular-ui-router/release/angular-ui-router.js",
    "chars": 116474,
    "preview": "/**\n * State-based routing for AngularJS\n * @version v0.2.10\n * @link http://angular-ui.github.com/\n * @license MIT Lice"
  },
  {
    "path": "www/lib/angular-ui-router/src/common.js",
    "chars": 6893,
    "preview": "/*jshint globalstrict:true*/\n/*global angular:false*/\n'use strict';\n\nvar isDefined = angular.isDefined,\n    isFunction ="
  },
  {
    "path": "www/lib/angular-ui-router/src/compat.js",
    "chars": 4685,
    "preview": "/*\n * @ngdoc object\n * @name ui.router.compat.$routeProvider\n *\n * @requires ui.router.state.$stateProvider\n * @requires"
  },
  {
    "path": "www/lib/angular-ui-router/src/resolve.js",
    "chars": 9276,
    "preview": "/**\n * @ngdoc object\n * @name ui.router.util.$resolve\n *\n * @requires $q\n * @requires $injector\n *\n * @description\n * Ma"
  },
  {
    "path": "www/lib/angular-ui-router/src/state.js",
    "chars": 49101,
    "preview": "/**\n * @ngdoc object\n * @name ui.router.state.$stateProvider\n *\n * @requires ui.router.router.$urlRouterProvider\n * @req"
  },
  {
    "path": "www/lib/angular-ui-router/src/stateDirectives.js",
    "chars": 7432,
    "preview": "function parseStateRef(ref) {\n  var parsed = ref.replace(/\\n/g, \" \").match(/^([^(]+?)\\s*(\\((.*)\\))?$/);\n  if (!parsed ||"
  },
  {
    "path": "www/lib/angular-ui-router/src/stateFilters.js",
    "chars": 862,
    "preview": "/**\n * @ngdoc filter\n * @name ui.router.state.filter:isState\n *\n * @requires ui.router.state.$state\n *\n * @description\n "
  },
  {
    "path": "www/lib/angular-ui-router/src/templateFactory.js",
    "chars": 4158,
    "preview": "/**\n * @ngdoc object\n * @name ui.router.util.$templateFactory\n *\n * @requires $http\n * @requires $templateCache\n * @requ"
  },
  {
    "path": "www/lib/angular-ui-router/src/urlMatcherFactory.js",
    "chars": 12623,
    "preview": "/**\n * @ngdoc object\n * @name ui.router.util.type:UrlMatcher\n *\n * @description\n * Matches URLs against patterns and ext"
  },
  {
    "path": "www/lib/angular-ui-router/src/urlRouter.js",
    "chars": 9473,
    "preview": "/**\n * @ngdoc object\n * @name ui.router.router.$urlRouterProvider\n *\n * @requires ui.router.util.$urlMatcherFactoryProvi"
  },
  {
    "path": "www/lib/angular-ui-router/src/view.js",
    "chars": 2129,
    "preview": "\n$ViewProvider.$inject = [];\nfunction $ViewProvider() {\n\n  this.$get = $get;\n  /**\n   * @ngdoc object\n   * @name ui.rout"
  },
  {
    "path": "www/lib/angular-ui-router/src/viewDirective.js",
    "chars": 8663,
    "preview": "/**\n * @ngdoc directive\n * @name ui.router.state.directive:ui-view\n *\n * @requires ui.router.state.$state\n * @requires $"
  },
  {
    "path": "www/lib/angular-ui-router/src/viewScroll.js",
    "chars": 1522,
    "preview": "/**\n * @ngdoc object\n * @name ui.router.state.$uiViewScrollProvider\n *\n * @description\n * Provider that returns the {@li"
  },
  {
    "path": "www/lib/angularfire/.bower.json",
    "chars": 1206,
    "preview": "{\n  \"name\": \"angularfire\",\n  \"description\": \"The officially supported AngularJS binding for Firebase\",\n  \"version\": \"0.8"
  },
  {
    "path": "www/lib/angularfire/README.md",
    "chars": 4963,
    "preview": "\n# AngularFire\n\n[![Build Status](https://travis-ci.org/firebase/angularfire.svg?branch=master)](https://travis-ci.org/fi"
  },
  {
    "path": "www/lib/angularfire/bower.json",
    "chars": 923,
    "preview": "{\n  \"name\": \"angularfire\",\n  \"description\": \"The officially supported AngularJS binding for Firebase\",\n  \"version\": \"0.0"
  },
  {
    "path": "www/lib/angularfire/dist/angularfire.js",
    "chars": 72638,
    "preview": "/*!\n * AngularFire is the officially supported AngularJS binding for Firebase. Firebase\n * is a full backend so you don'"
  },
  {
    "path": "www/lib/collide/.bower.json",
    "chars": 457,
    "preview": "{\n  \"name\": \"collide\",\n  \"version\": \"1.0.0-beta.1\",\n  \"main\": \"collide.js\",\n  \"ignore\": [\n    \"src\"\n  ],\n  \"dependencies"
  },
  {
    "path": "www/lib/collide/.gitignore",
    "chars": 610,
    "preview": "# Logs\nlogs\n*.log\n\n# Runtime data\npids\n*.pid\n*.seed\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nl"
  },
  {
    "path": "www/lib/collide/README.md",
    "chars": 3455,
    "preview": "Collide\n--------\n\nCollide is a powerful yet simple javascript animation engine for web and hybrid mobile apps, inspired "
  },
  {
    "path": "www/lib/collide/bower.json",
    "chars": 128,
    "preview": "{\n  \"name\": \"collide\",\n  \"version\": \"1.0.0-beta.1\",\n  \"main\": \"collide.js\",\n  \"ignore\": [\n    \"src\"\n  ],\n  \"dependencies"
  },
  {
    "path": "www/lib/collide/collide.js",
    "chars": 29807,
    "preview": "!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof defin"
  },
  {
    "path": "www/lib/collide/package.json",
    "chars": 509,
    "preview": "{\n  \"name\": \"collide\",\n  \"version\": \"0.0.4\",\n  \"main\": \"collide.js\",\n  \"scripts\": {\n    \"build\": \"mkdir -p dist && brows"
  },
  {
    "path": "www/lib/collide/test/animator.spec.js",
    "chars": 7307,
    "preview": "var easings = require('../src/core/easing-functions');\nvar dynamics = require('../src/core/dynamics');\n\nvar cssFeature ="
  },
  {
    "path": "www/lib/collide/test/core/timeline.spec.js",
    "chars": 1947,
    "preview": "\nvar lastRafId;\nvar nextRafCb;\nfunction mockRaf(cb) {\n  nextRafCb = cb;\n  return lastRafId++;\n}\nmockRaf.cancel = jasmine"
  },
  {
    "path": "www/lib/collide/test/util/simple-emitter.spec.js",
    "chars": 2526,
    "preview": "var Emitter = require('../../src/util/simple-emitter');\n\ndescribe('SimpleEmitter', function() {\n\n  it('should on() and e"
  },
  {
    "path": "www/lib/collide/test.html",
    "chars": 4327,
    "preview": "<!DOCTYPE html>\n<html ng-app=\"myApp\">\n  <head>\n    <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n "
  },
  {
    "path": "www/lib/firebase/.bower.json",
    "chars": 710,
    "preview": "{\n  \"name\": \"firebase\",\n  \"version\": \"1.0.21\",\n  \"homepage\": \"https://firebase.com\",\n  \"authors\": [\n    \"Firebase <opera"
  },
  {
    "path": "www/lib/firebase/LICENSE",
    "chars": 1076,
    "preview": "Copyright © 2014 Firebase <opensource@firebase.com>\n\nPermission is hereby granted, free of charge, to any person obtaini"
  },
  {
    "path": "www/lib/firebase/README.md",
    "chars": 46,
    "preview": "firebase-bower\n==============\n\nFirebase Bower\n"
  },
  {
    "path": "www/lib/firebase/bower.json",
    "chars": 444,
    "preview": "{\n  \"name\": \"firebase\",\n  \"version\": \"1.0.21\",\n  \"homepage\": \"https://firebase.com\",\n  \"authors\": [\n    \"Firebase <opera"
  },
  {
    "path": "www/lib/firebase/firebase-debug.js",
    "chars": 324064,
    "preview": "/* Firebase v1.0.21 */ var CLOSURE_NO_DEPS = true; var COMPILED = false;\nvar goog = goog || {};\ngoog.global = this;\ngoog"
  },
  {
    "path": "www/lib/firebase/firebase.js",
    "chars": 81503,
    "preview": "/* Firebase v1.0.21 */ (function() {var h,aa=this;function n(a){return void 0!==a}function ba(){}function ca(a){a.sb=fun"
  },
  {
    "path": "www/lib/firebase-simple-login/.bower.json",
    "chars": 1265,
    "preview": "{\n  \"name\": \"firebase-simple-login\",\n  \"description\": \"Firebase Simple Login web client\",\n  \"version\": \"1.6.3\",\n  \"autho"
  },
  {
    "path": "www/lib/firebase-simple-login/CHANGELOG.md",
    "chars": 3954,
    "preview": "v1.6.3\n-------------\nRelease Date: 2014-08-15\n\n  * The callback argument for `createUser()`, `changePassword()`, `sendPa"
  },
  {
    "path": "www/lib/firebase-simple-login/LICENSE",
    "chars": 1098,
    "preview": "The MIT License (MIT)\n\nCopyright © 2014 Firebase <opensource@firebase.com>\n\nPermission is hereby granted, free of charge"
  },
  {
    "path": "www/lib/firebase-simple-login/README.md",
    "chars": 5931,
    "preview": "# Firebase Simple Login - Web Client\n\n[![GitHub version](https://badge.fury.io/gh/firebase%2Ffirebase-simple-login.svg)]"
  },
  {
    "path": "www/lib/firebase-simple-login/firebase-simple-login-debug.js",
    "chars": 101975,
    "preview": "var COMPILED = false;\nvar goog = goog || {};\ngoog.global = this;\ngoog.global.CLOSURE_DEFINES;\ngoog.exportPath_ = functio"
  },
  {
    "path": "www/lib/firebase-simple-login/firebase-simple-login.js",
    "chars": 65542,
    "preview": "(function() {var COMPILED=!0,goog=goog||{};goog.global=this;goog.exportPath_=function(a,d,e){a=a.split(\".\");e=e||goog.gl"
  },
  {
    "path": "www/lib/ionic/.bower.json",
    "chars": 1110,
    "preview": "{\n  \"name\": \"ionic\",\n  \"version\": \"1.0.0-beta.12\",\n  \"codename\": \"krypton-koala\",\n  \"homepage\": \"https://github.com/drif"
  },
  {
    "path": "www/lib/ionic/README.md",
    "chars": 430,
    "preview": "# ionic-bower\n\nBower repository for [Ionic Framework](http://github.com/driftyco/ionic)\n\n### Usage\n\nInclude `js/ionic.bu"
  },
  {
    "path": "www/lib/ionic/bower.json",
    "chars": 814,
    "preview": "{\n  \"name\": \"ionic\",\n  \"version\": \"1.0.0-beta.12\",\n  \"codename\": \"krypton-koala\",\n  \"homepage\": \"https://github.com/drif"
  },
  {
    "path": "www/lib/ionic/css/ionic.css",
    "chars": 233689,
    "preview": "/*!\n * Copyright 2014 Drifty Co.\n * http://drifty.com/\n *\n * Ionic, v1.0.0-beta.12\n * A powerful HTML5 mobile app framew"
  },
  {
    "path": "www/lib/ionic/js/ionic-angular.js",
    "chars": 315813,
    "preview": "/*!\n * Copyright 2014 Drifty Co.\n * http://drifty.com/\n *\n * Ionic, v1.0.0-beta.12\n * A powerful HTML5 mobile app framew"
  },
  {
    "path": "www/lib/ionic/js/ionic.bundle.js",
    "chars": 1529840,
    "preview": "/*!\n * ionic.bundle.js is a concatenation of:\n * ionic.js, angular.js, angular-animate.js,\n * angular-sanitize.js, angul"
  },
  {
    "path": "www/lib/ionic/js/ionic.js",
    "chars": 234361,
    "preview": "/*!\n * Copyright 2014 Drifty Co.\n * http://drifty.com/\n *\n * Ionic, v1.0.0-beta.12\n * A powerful HTML5 mobile app framew"
  },
  {
    "path": "www/lib/ionic/scss/_action-sheet.scss",
    "chars": 1540,
    "preview": "/**\n * Action Sheets\n * --------------------------------------------------\n */\n\n.action-sheet-backdrop {\n  @include tran"
  },
  {
    "path": "www/lib/ionic/scss/_animations.scss",
    "chars": 23712,
    "preview": "/**\n * Animations\n * --------------------------------------------------\n * The animations in this file are \"simple\" - no"
  },
  {
    "path": "www/lib/ionic/scss/_backdrop.scss",
    "chars": 314,
    "preview": "\n.backdrop {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: $z-index-backdrop;\n\n  width: 100%;\n  height: 100%;\n\n  ba"
  },
  {
    "path": "www/lib/ionic/scss/_badge.scss",
    "chars": 1507,
    "preview": "\n/**\n * Badges\n * --------------------------------------------------\n */\n\n.badge {\n  @include badge-style($badge-default"
  },
  {
    "path": "www/lib/ionic/scss/_bar.scss",
    "chars": 8885,
    "preview": "\n/**\n * Bar (Headers and Footers)\n * --------------------------------------------------\n */\n\n.bar {\n  @include display-f"
  },
  {
    "path": "www/lib/ionic/scss/_button-bar.scss",
    "chars": 787,
    "preview": "\n/**\n * Button Bar\n * --------------------------------------------------\n */\n\n.button-bar {\n  @include display-flex();\n "
  },
  {
    "path": "www/lib/ionic/scss/_button.scss",
    "chars": 6430,
    "preview": "\n/**\n * Buttons\n * --------------------------------------------------\n */\n\n.button {\n  // set the color defaults\n  @incl"
  },
  {
    "path": "www/lib/ionic/scss/_checkbox.scss",
    "chars": 3750,
    "preview": "\n/**\n * Checkbox\n * --------------------------------------------------\n */\n\n.checkbox {\n  // set the color defaults\n  @i"
  },
  {
    "path": "www/lib/ionic/scss/_form.scss",
    "chars": 5958,
    "preview": "/**\n * Forms\n * --------------------------------------------------\n */\n\n// Make all forms have space below them\nform {\n "
  },
  {
    "path": "www/lib/ionic/scss/_grid.scss",
    "chars": 2839,
    "preview": "/**\n * Grid\n * --------------------------------------------------\n * Using flexbox for the grid, inspired by Philip Walt"
  },
  {
    "path": "www/lib/ionic/scss/_items.scss",
    "chars": 17881,
    "preview": "/**\n * Items\n * --------------------------------------------------\n */\n\n.item {\n  @include item-style($item-default-bg, "
  },
  {
    "path": "www/lib/ionic/scss/_list.scss",
    "chars": 2247,
    "preview": "\n/**\n * Lists\n * --------------------------------------------------\n */\n\n.list {\n  position: relative;\n  padding-top: $i"
  },
  {
    "path": "www/lib/ionic/scss/_loading.scss",
    "chars": 776,
    "preview": "\n/**\n * Loading\n * --------------------------------------------------\n */\n\n.loading-container {\n  position: absolute;\n  "
  },
  {
    "path": "www/lib/ionic/scss/_menu.scss",
    "chars": 1000,
    "preview": "\n/**\n * Menus\n * --------------------------------------------------\n * Side panel structure\n */\n\n.menu {\n  position: abs"
  },
  {
    "path": "www/lib/ionic/scss/_mixins.scss",
    "chars": 16031,
    "preview": "\n// Button Mixins\n// --------------------------------------------------\n\n@mixin button-style($bg-color, $border-color, $"
  },
  {
    "path": "www/lib/ionic/scss/_modal.scss",
    "chars": 2010,
    "preview": "\n/**\n * Modals\n * --------------------------------------------------\n * Modals are independent windows that slide in fro"
  },
  {
    "path": "www/lib/ionic/scss/_platform.scss",
    "chars": 2941,
    "preview": "\n/**\n * Platform\n * --------------------------------------------------\n * Platform specific tweaks\n */\n\n\n/**\n * Apply ro"
  },
  {
    "path": "www/lib/ionic/scss/_popover.scss",
    "chars": 3024,
    "preview": "\n/**\n * Popovers\n * --------------------------------------------------\n * Popovers are independent views which float ove"
  },
  {
    "path": "www/lib/ionic/scss/_popup.scss",
    "chars": 1951,
    "preview": "\n/**\n * Popups\n * --------------------------------------------------\n */\n\n.popup-container {\n  position: absolute;\n  top"
  },
  {
    "path": "www/lib/ionic/scss/_progress.scss",
    "chars": 161,
    "preview": "\n/**\n * Progress\n * --------------------------------------------------\n */\n\nprogress {\n  display: block;\n  margin: $prog"
  },
  {
    "path": "www/lib/ionic/scss/_radio.scss",
    "chars": 1201,
    "preview": "\n/**\n * Radio Button Inputs\n * --------------------------------------------------\n */\n\n.item-radio {\n  padding: 0;\n\n  &:"
  },
  {
    "path": "www/lib/ionic/scss/_range.scss",
    "chars": 2851,
    "preview": "\n/**\n * Range\n * --------------------------------------------------\n */\n\ninput[type=\"range\"] {\n  display: inline-block;\n"
  },
  {
    "path": "www/lib/ionic/scss/_reset.scss",
    "chars": 6919,
    "preview": "\n/**\n * Resets\n * --------------------------------------------------\n * Adapted from normalize.css and some reset.css. W"
  },
  {
    "path": "www/lib/ionic/scss/_scaffolding.scss",
    "chars": 6817,
    "preview": "\n/**\n * Scaffolding\n * --------------------------------------------------\n */\n\n*,\n*:before,\n*:after {\n  @include box-siz"
  },
  {
    "path": "www/lib/ionic/scss/_select.scss",
    "chars": 2597,
    "preview": "\n/**\n * Select\n * --------------------------------------------------\n */\n\n.item-select {\n  position: relative;\n\n  select"
  },
  {
    "path": "www/lib/ionic/scss/_slide-box.scss",
    "chars": 828,
    "preview": "\n/**\n * Slide Box\n * --------------------------------------------------\n */\n\n.slider {\n  position: relative;\n  visibilit"
  },
  {
    "path": "www/lib/ionic/scss/_split-pane.scss",
    "chars": 502,
    "preview": "\n/**\n * Split Pane\n * --------------------------------------------------\n */\n\n.split-pane {\n  @include display-flex();\n "
  },
  {
    "path": "www/lib/ionic/scss/_tabs.scss",
    "chars": 9879,
    "preview": "/**\n * Tabs\n * --------------------------------------------------\n * A navigation bar with any number of tab items suppo"
  },
  {
    "path": "www/lib/ionic/scss/_toggle.scss",
    "chars": 3759,
    "preview": "\n/**\n * Toggle\n * --------------------------------------------------\n */\n\n.item-toggle {\n  pointer-events: none;\n}\n\n.tog"
  },
  {
    "path": "www/lib/ionic/scss/_type.scss",
    "chars": 2845,
    "preview": "\n/**\n * Typography\n * --------------------------------------------------\n */\n\n\n// Body text\n// -------------------------"
  },
  {
    "path": "www/lib/ionic/scss/_util.scss",
    "chars": 3963,
    "preview": "\n/**\n * Utility Classes\n * --------------------------------------------------\n */\n\n.hide {\n  display: none;\n}\n.opacity-h"
  },
  {
    "path": "www/lib/ionic/scss/_variables.scss",
    "chars": 29920,
    "preview": "\n// Colors\n// -------------------------------\n\n$light:                           #fff !default;\n$stable:                "
  },
  {
    "path": "www/lib/ionic/scss/ionic.scss",
    "chars": 533,
    "preview": "@charset \"UTF-8\";\n\n@import\n  // Ionicons\n  \"ionicons/ionicons.scss\",\n\n  // Variables\n  \"mixins\",\n  \"variables\",\n\n  // Ba"
  },
  {
    "path": "www/lib/ionic/scss/ionicons/_ionicons-animation.scss",
    "chars": 1856,
    "preview": "// Animation Icons\n// --------------------------\n\n.#{$ionicons-prefix}spin {\n  -webkit-animation: spin 1s infinite linea"
  },
  {
    "path": "www/lib/ionic/scss/ionicons/_ionicons-font.scss",
    "chars": 890,
    "preview": "// Ionicons Font Path\n// --------------------------\n\n@font-face {\n font-family: $ionicons-font-family;\n src:url(\"#{$ioni"
  },
  {
    "path": "www/lib/ionic/scss/ionicons/_ionicons-icons.scss",
    "chars": 74650,
    "preview": "// Ionicons Icons\n// --------------------------\n\n.ionicons,\n.#{$ionicons-prefix}alert:before,\n.#{$ionicons-prefix}alert-"
  },
  {
    "path": "www/lib/ionic/scss/ionicons/_ionicons-variables.scss",
    "chars": 22462,
    "preview": "// Ionicons Variables\n// --------------------------\n\n$ionicons-font-path: \"../fonts\" !default;\n$ionicons-font-family: \"I"
  },
  {
    "path": "www/lib/ionic/scss/ionicons/ionicons.scss",
    "chars": 329,
    "preview": "@import \"ionicons-variables\";\n/*!\n  Ionicons, v1.5.2\n  Created by Ben Sperry for the Ionic Framework, http://ionicons.co"
  },
  {
    "path": "www/lib/mockfirebase/.bower.json",
    "chars": 811,
    "preview": "{\n  \"name\": \"mockfirebase\",\n  \"version\": \"0.2.9\",\n  \"homepage\": \"https://github.com/katowulf/mockfirebase\",\n  \"authors\":"
  },
  {
    "path": "www/lib/mockfirebase/CONTRIBUTING.md",
    "chars": 412,
    "preview": "# Issues\n\nIf you've encountered a bug or want to request new functionality, go ahead and file an issue. Please provide a"
  },
  {
    "path": "www/lib/mockfirebase/MAINTAINING.md",
    "chars": 237,
    "preview": "# Releasing\n\nCall `gulp release` to release a new patch version. For *minor* or *major* releases, use the `--type` flag:"
  },
  {
    "path": "www/lib/mockfirebase/README.md",
    "chars": 4829,
    "preview": "MockFirebase\n============\n\n**This is an experimental library. It is not supported by Firebase. Use with caution and subm"
  },
  {
    "path": "www/lib/mockfirebase/bower.json",
    "chars": 545,
    "preview": "{\n  \"name\": \"mockfirebase\",\n  \"version\": \"0.2.9\",\n  \"homepage\": \"https://github.com/katowulf/mockfirebase\",\n  \"authors\":"
  },
  {
    "path": "www/lib/mockfirebase/dist/mockfirebase.js",
    "chars": 328189,
    "preview": "/** mockfirebase - v0.2.9\nhttps://github.com/katowulf/mockfirebase\n* Copyright (c) 2014 Kato\n* License: MIT */\n!function"
  },
  {
    "path": "www/views/about/about.html",
    "chars": 863,
    "preview": "<ion-view title=\"About App\">\n  <ion-content class=\"padding\">\n\n    <p>App built as an example for demonstrating many feat"
  },
  {
    "path": "www/views/events/events.html",
    "chars": 355,
    "preview": "<ion-view title=\"Upcoming Events\">\n  <ion-content>\n    <ul class=\"list\">\n      <span ng-repeat=\"day in events\">\n      <l"
  },
  {
    "path": "www/views/events/events.js",
    "chars": 436,
    "preview": "angular.module('App').controller('EventsCtrl', function ($scope, EventsService) {\n\n  var days = ['Sunday', 'Monday', 'Tu"
  },
  {
    "path": "www/views/food/food.html",
    "chars": 791,
    "preview": "<ion-view title=\"Room Service\" class=\"room-service\">\n  <ion-nav-buttons side=\"right\">\n    <button class=\"button button-c"
  },
  {
    "path": "www/views/food/food.js",
    "chars": 1394,
    "preview": "angular.module('App').controller('FoodCtrl', function ($scope, $ionicListDelegate, $ionicLoading, $ionicModal, $ionicPop"
  },
  {
    "path": "www/views/food/preview.html",
    "chars": 775,
    "preview": "<ion-modal-view>\n  <ion-header-bar class=\"bar-dark\">\n    <div class=\"buttons\">\n      <button class=\"button button-clear\""
  },
  {
    "path": "www/views/home/comments.html",
    "chars": 1445,
    "preview": "<ion-modal-view>\n  <ion-header-bar class=\"bar-dark\">\n    <h1 class=\"title\">Send Us Comments</h1>\n    <div class=\"buttons"
  },
  {
    "path": "www/views/home/home.html",
    "chars": 1359,
    "preview": "<ion-view title=\"Home\">\n  <ion-content>\n    <div class=\"card\">\n      <div class=\"item item-divider\">Welcome to Sunshine "
  },
  {
    "path": "www/views/home/home.js",
    "chars": 1264,
    "preview": "angular.module('App').controller('HomeCtrl', function ($scope, $http, $timeout, $ionicModal, $ionicLoading, $ionicPopup,"
  },
  {
    "path": "www/views/local/beaches.html",
    "chars": 957,
    "preview": "<ion-view title=\"Local Beaches\">\n  <ion-content>\n    <ul class=\"list\">\n      <li class=\"item item-divider\">Public</li>\n "
  },
  {
    "path": "www/views/local/food.html",
    "chars": 944,
    "preview": "<ion-view title=\"Local Resturants\">\n  <ion-content>\n    <ul class=\"list\">\n      <li class=\"item item-divider\">Casual</li"
  },
  {
    "path": "www/views/local/local.html",
    "chars": 518,
    "preview": "<ion-view title=\"Local Places\">\n  <ion-tabs class=\"tabs-icon-top\">\n    <ion-tab icon=\"ion-fork\" title=\"Resturants\" href="
  },
  {
    "path": "www/views/local/sights.html",
    "chars": 855,
    "preview": "<ion-view title=\"Local Sights\">\n  <ion-content>\n    <ul class=\"list\">\n      <li class=\"item item-divider\">Natural</li>\n "
  },
  {
    "path": "www/views/reservation/reservation.html",
    "chars": 1062,
    "preview": "<ion-view title=\"Your Reservation\">\n  <ion-content>\n    <div class=\"list card\" ng-if=\"reservation\">\n      <div class=\"it"
  },
  {
    "path": "www/views/reservation/reservation.js",
    "chars": 596,
    "preview": "angular.module('App').controller('ReservationCtrl', function ($scope, $timeout, $ionicModal, $ionicLoading, $ionicPopup)"
  },
  {
    "path": "www/views/tour/tour.html",
    "chars": 657,
    "preview": "<ion-view title=\"Welcome\" class=\"tour\">\n  <ion-nav-buttons side=\"left\">\n  </ion-nav-buttons>\n  <ion-slide-box>\n    <ion-"
  },
  {
    "path": "www/views/tour/tour.js",
    "chars": 385,
    "preview": "angular.module('App').controller('TourCtrl', function ($scope, $location, $ionicPopup) {\n\n  $scope.login = function () {"
  },
  {
    "path": "www/views/weather/weather.html",
    "chars": 528,
    "preview": "<ion-view title=\"7 Day Forecast\">\n  <ion-content>\n    <div class=\"list card\">\n      <div class=\"item item-divider\">Sunsh"
  },
  {
    "path": "www/views/weather/weather.js",
    "chars": 496,
    "preview": "angular.module('App').controller('WeatherCtrl', function ($scope, $http, $ionicLoading) {\n\n  $ionicLoading.show({\n    te"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the ionic-in-action/ionic-demo-resort-app GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 144 files (4.6 MB), approximately 1.2M tokens, and a symbol index with 1272 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

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

Copied to clipboard!