From: Chris Koeritz
Date: Mon, 28 Jan 2019 21:42:30 +0000 (-0500)
Subject: adding example apps, fixing powerup issues
X-Git-Tag: 2.140.115^2~50
X-Git-Url: https://feistymeow.org/gitweb/?a=commitdiff_plain;h=935f2f9f0aa8a1cadc390326c2dce73433c44fb2;p=feisty_meow.git
adding example apps, fixing powerup issues
the new example apps are in nascent state but provide two demos, one of the google maps using a zipcode database and the other implementing a shared calendar view in google.
the site avenger shared support and all scripts have been updated to allow an empty app_dirname, such as when you are already in a directory and want to just say powerup. this works with existing avenger5 folders already, but still needs some help to be generalized.
---
diff --git a/production/example_apps/shared_calendar/.buildpath b/production/example_apps/shared_calendar/.buildpath
new file mode 100644
index 00000000..8bcb4b5f
--- /dev/null
+++ b/production/example_apps/shared_calendar/.buildpath
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/production/example_apps/shared_calendar/.editorconfig b/production/example_apps/shared_calendar/.editorconfig
new file mode 100644
index 00000000..70619017
--- /dev/null
+++ b/production/example_apps/shared_calendar/.editorconfig
@@ -0,0 +1,18 @@
+; This file is for unifying the coding style for different editors and IDEs.
+; More information at http://editorconfig.org
+
+root = true
+
+[*]
+indent_style = space
+indent_size = 4
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.bat]
+end_of_line = crlf
+
+[*.yml]
+indent_style = space
+indent_size = 2
diff --git a/production/example_apps/shared_calendar/.gitattributes b/production/example_apps/shared_calendar/.gitattributes
new file mode 100644
index 00000000..5054ec07
--- /dev/null
+++ b/production/example_apps/shared_calendar/.gitattributes
@@ -0,0 +1,44 @@
+# Define the line ending behavior of the different file extensions
+# Set default behaviour, in case users don't have core.autocrlf set.
+* text=auto
+* text eol=lf
+
+# Explicitly declare text files we want to always be normalized and converted
+# to native line endings on checkout.
+*.php text
+*.default text
+*.ctp text
+*.sql text
+*.md text
+*.po text
+*.js text
+*.css text
+*.ini text
+*.properties text
+*.txt text
+*.xml text
+*.svg text
+*.yml text
+.htaccess text
+
+# Declare files that will always have CRLF line endings on checkout.
+*.bat eol=crlf
+
+# Declare files that will always have LF line endings on checkout.
+*.pem eol=lf
+
+# Denote all files that are truly binary and should not be modified.
+*.png binary
+*.jpg binary
+*.gif binary
+*.ico binary
+*.mo binary
+*.pdf binary
+*.phar binary
+*.woff binary
+*.woff2 binary
+*.ttf binary
+*.otf binary
+*.eot binary
+*.odt binary
+
diff --git a/production/example_apps/shared_calendar/.github/ISSUE_TEMPLATE.md b/production/example_apps/shared_calendar/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000..92c77d6b
--- /dev/null
+++ b/production/example_apps/shared_calendar/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,23 @@
+This is a (multiple allowed):
+
+* [x] bug
+* [ ] enhancement
+* [ ] feature-discussion (RFC)
+
+* CakePHP Application Skeleton Version: EXACT RELEASE VERSION OR COMMIT HASH, HERE.
+* Platform and Target: YOUR WEB-SERVER, DATABASE AND OTHER RELEVANT INFO AND HOW THE REQUEST IS BEING MADE, HERE.
+
+### What you did
+EXPLAIN WHAT YOU DID, PREFERABLY WITH CODE EXAMPLES, HERE.
+
+### What happened
+EXPLAIN WHAT IS ACTUALLY HAPPENING, HERE.
+
+### What you expected to happen
+EXPLAIN WHAT IS TO BE EXPECTED, HERE.
+
+P.S. Remember, an issue is not the place to ask questions. You can use [Stack Overflow](http://stackoverflow.com/questions/tagged/cakephp)
+for that or join the #cakephp channel on irc.freenode.net, where we will be more
+than happy to help answer your questions.
+
+Before you open an issue, please check if a similar issue already exists or has been closed before.
\ No newline at end of file
diff --git a/production/example_apps/shared_calendar/.github/PULL_REQUEST_TEMPLATE.md b/production/example_apps/shared_calendar/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 00000000..05ca9eb6
--- /dev/null
+++ b/production/example_apps/shared_calendar/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,10 @@
+**PLEASE NOTE:**
+
+This is only a issue tracker for issues related to the CakePHP Application Skeleton.
+For CakePHP Framework issues please use this [issue tracker](https://github.com/cakephp/cakephp/issues).
+
+Describe the big picture of your changes here to communicate to the maintainers why we should accept this pull request. If it fixes a bug or resolves a feature request, be sure to link to that issue.
+
+The best way to propose a feature is to open an issue first and discuss your ideas there before implementing them.
+
+Always follow the [contribution guidelines](https://github.com/cakephp/cakephp/blob/master/.github/CONTRIBUTING.md) guidelines when submitting a pull request. In particular, make sure existing tests still pass, and add tests for all new behavior. When fixing a bug, you may want to add a test to verify the fix.
\ No newline at end of file
diff --git a/production/example_apps/shared_calendar/.gitignore b/production/example_apps/shared_calendar/.gitignore
new file mode 100644
index 00000000..8a18ddc3
--- /dev/null
+++ b/production/example_apps/shared_calendar/.gitignore
@@ -0,0 +1,10 @@
+/vendor/*
+/config/app.php
+/config/*secret*
+/config/config_google.php
+/tmp/*
+/logs/*
+/vendor/
+/webroot/avmaps
+/webroot/debug_kit
+
diff --git a/production/example_apps/shared_calendar/.htaccess b/production/example_apps/shared_calendar/.htaccess
new file mode 100644
index 00000000..bc1dd9c0
--- /dev/null
+++ b/production/example_apps/shared_calendar/.htaccess
@@ -0,0 +1,11 @@
+# Uncomment the following to prevent the httpoxy vulnerability
+# See: https://httpoxy.org/
+#
+# RequestHeader unset Proxy
+#
+
+
+ RewriteEngine on
+ RewriteRule ^$ webroot/ [L]
+ RewriteRule (.*) webroot/$1 [L]
+
diff --git a/production/example_apps/shared_calendar/.project b/production/example_apps/shared_calendar/.project
new file mode 100644
index 00000000..a71e33ed
--- /dev/null
+++ b/production/example_apps/shared_calendar/.project
@@ -0,0 +1,29 @@
+
+
+ shared_calendar
+
+
+
+
+
+ org.eclipse.wst.common.project.facet.core.builder
+
+
+
+
+ org.eclipse.wst.validation.validationbuilder
+
+
+
+
+ org.eclipse.dltk.core.scriptbuilder
+
+
+
+
+
+ org.eclipse.php.core.PHPNature
+ org.eclipse.wst.jsdt.core.jsNature
+ org.eclipse.wst.common.project.facet.core.nature
+
+
diff --git a/production/example_apps/shared_calendar/.settings/.jsdtscope b/production/example_apps/shared_calendar/.settings/.jsdtscope
new file mode 100644
index 00000000..4649ef13
--- /dev/null
+++ b/production/example_apps/shared_calendar/.settings/.jsdtscope
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/production/example_apps/shared_calendar/.settings/org.eclipse.php.core.prefs b/production/example_apps/shared_calendar/.settings/org.eclipse.php.core.prefs
new file mode 100644
index 00000000..64149f27
--- /dev/null
+++ b/production/example_apps/shared_calendar/.settings/org.eclipse.php.core.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+include_path=0;/shared_calendar
diff --git a/production/example_apps/shared_calendar/.settings/org.eclipse.wst.common.project.facet.core.xml b/production/example_apps/shared_calendar/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 00000000..ba149d77
--- /dev/null
+++ b/production/example_apps/shared_calendar/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/production/example_apps/shared_calendar/.settings/org.eclipse.wst.jsdt.ui.superType.container b/production/example_apps/shared_calendar/.settings/org.eclipse.wst.jsdt.ui.superType.container
new file mode 100644
index 00000000..3bd5d0a4
--- /dev/null
+++ b/production/example_apps/shared_calendar/.settings/org.eclipse.wst.jsdt.ui.superType.container
@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/production/example_apps/shared_calendar/.settings/org.eclipse.wst.jsdt.ui.superType.name b/production/example_apps/shared_calendar/.settings/org.eclipse.wst.jsdt.ui.superType.name
new file mode 100644
index 00000000..05bd71b6
--- /dev/null
+++ b/production/example_apps/shared_calendar/.settings/org.eclipse.wst.jsdt.ui.superType.name
@@ -0,0 +1 @@
+Window
\ No newline at end of file
diff --git a/production/example_apps/shared_calendar/.travis.yml b/production/example_apps/shared_calendar/.travis.yml
new file mode 100644
index 00000000..befdb98e
--- /dev/null
+++ b/production/example_apps/shared_calendar/.travis.yml
@@ -0,0 +1,30 @@
+language: php
+
+dist: trusty
+
+sudo: false
+
+php:
+ - 5.6
+ - 7.0
+ - 7.1
+
+matrix:
+ fast_finish: true
+
+ include:
+ - php: 7.0
+ env: PHPCS=1
+
+before_script:
+ - if [[ $PHPCS = 1 ]]; then composer require cakephp/cakephp-codesniffer:~2.1; fi
+ - if [[ $PHPCS != 1 ]]; then composer install; fi
+ - if [[ $PHPCS != 1 ]]; then composer require phpunit/phpunit:"^5.7|^6.0"; fi
+ - if [[ $PHPCS != 1 ]]; then composer run-script post-install-cmd --no-interaction; fi
+
+script:
+ - if [[ $PHPCS != 1 ]]; then vendor/bin/phpunit; fi
+ - if [[ $PHPCS = 1 ]]; then vendor/bin/phpcs -p --extensions=php --standard=vendor/cakephp/cakephp-codesniffer/CakePHP ./src ./tests ./config ./webroot; fi
+
+notifications:
+ email: false
diff --git a/production/example_apps/shared_calendar/bin/cake b/production/example_apps/shared_calendar/bin/cake
new file mode 100644
index 00000000..6801c45b
--- /dev/null
+++ b/production/example_apps/shared_calendar/bin/cake
@@ -0,0 +1,46 @@
+#!/usr/bin/env sh
+################################################################################
+#
+# Cake is a shell script for invoking CakePHP shell commands
+#
+# CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
+# Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+#
+# Licensed under The MIT License
+# For full copyright and license information, please see the LICENSE.txt
+# Redistributions of files must retain the above copyright notice.
+#
+# @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+# @link http://cakephp.org CakePHP(tm) Project
+# @since 1.2.0
+# @license http://www.opensource.org/licenses/mit-license.php MIT License
+#
+################################################################################
+
+# Canonicalize by following every symlink of the given name recursively
+canonicalize() {
+ NAME="$1"
+ if [ -f "$NAME" ]
+ then
+ DIR=$(dirname -- "$NAME")
+ NAME=$(cd -P "$DIR" > /dev/null && pwd -P)/$(basename -- "$NAME")
+ fi
+ while [ -h "$NAME" ]; do
+ DIR=$(dirname -- "$NAME")
+ SYM=$(readlink "$NAME")
+ NAME=$(cd "$DIR" > /dev/null && cd $(dirname -- "$SYM") > /dev/null && pwd)/$(basename -- "$SYM")
+ done
+ echo "$NAME"
+}
+
+CONSOLE=$(dirname -- "$(canonicalize "$0")")
+APP=$(dirname "$CONSOLE")
+
+if [ $(basename $0) != 'cake' ]
+then
+ exec php "$CONSOLE"/cake.php $(basename $0) "$@"
+else
+ exec php "$CONSOLE"/cake.php "$@"
+fi
+
+exit
diff --git a/production/example_apps/shared_calendar/bin/cake.bat b/production/example_apps/shared_calendar/bin/cake.bat
new file mode 100644
index 00000000..d4512dbf
--- /dev/null
+++ b/production/example_apps/shared_calendar/bin/cake.bat
@@ -0,0 +1,27 @@
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+::
+:: Cake is a Windows batch script for invoking CakePHP shell commands
+::
+:: CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
+:: Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+::
+:: Licensed under The MIT License
+:: Redistributions of files must retain the above copyright notice.
+::
+:: @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+:: @link http://cakephp.org CakePHP(tm) Project
+:: @since 2.0.0
+:: @license http://www.opensource.org/licenses/mit-license.php MIT License
+::
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+@echo off
+
+SET app=%0
+SET lib=%~dp0
+
+php "%lib%cake.php" %*
+
+echo.
+
+exit /B %ERRORLEVEL%
diff --git a/production/example_apps/shared_calendar/bin/cake.php b/production/example_apps/shared_calendar/bin/cake.php
new file mode 100644
index 00000000..5ee314c9
--- /dev/null
+++ b/production/example_apps/shared_calendar/bin/cake.php
@@ -0,0 +1,34 @@
+#!/usr/bin/php -q
+require->php)) {
+ $minVersion = preg_replace('/([^0-9\.])/', '', $composer->require->php);
+ }
+}
+if (version_compare(phpversion(), $minVersion, '<')) {
+ fwrite(STDERR, sprintf("Minimum PHP version: %s. You are using: %s.\n", $minVersion, phpversion()));
+ exit(-1);
+}
+
+require dirname(__DIR__) . '/vendor/autoload.php';
+include dirname(__DIR__) . '/config/bootstrap.php';
+
+exit(Cake\Console\ShellDispatcher::run($argv));
diff --git a/production/example_apps/shared_calendar/composer.json b/production/example_apps/shared_calendar/composer.json
new file mode 100644
index 00000000..221cae16
--- /dev/null
+++ b/production/example_apps/shared_calendar/composer.json
@@ -0,0 +1,50 @@
+{
+ "name": "cakephp/app",
+ "description": "CakePHP skeleton app",
+ "homepage": "http://cakephp.org",
+ "type": "project",
+ "license": "MIT",
+ "require": {
+ "php": ">=5.6",
+ "cakephp/cakephp": "3.4.*",
+ "mobiledetect/mobiledetectlib": "2.*",
+ "cakephp/migrations": "~1.0",
+ "cakephp/plugin-installer": "~1.0",
+ "google/apiclient": "^2.0"
+ },
+ "require-dev": {
+ "psy/psysh": "@stable",
+ "cakephp/debug_kit": "~3.0",
+ "cakephp/bake": "~1.1"
+ },
+ "suggest": {
+ "markstory/asset_compress": "An asset compression plugin which provides file concatenation and a flexible filter system for preprocessing and minification.",
+ "dereuromark/cakephp-ide-helper": "After baking your code, this keeps your annotations in sync with the code evolving from there on for maximum IDE and PHPStan compatibility.",
+ "phpunit/phpunit": "Allows automated tests to be run without system-wide install.",
+ "cakephp/cakephp-codesniffer": "Allows to check the code against the coding standards used in CakePHP."
+ },
+ "autoload": {
+ "psr-4": {
+ "App\\": "src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "App\\Test\\": "tests",
+ "Cake\\Test\\": "./vendor/cakephp/cakephp/tests"
+ }
+ },
+ "scripts": {
+ "post-install-cmd": "App\\Console\\Installer::postInstall",
+ "post-create-project-cmd": "App\\Console\\Installer::postInstall",
+ "post-autoload-dump": "Cake\\Composer\\Installer\\PluginInstaller::postAutoloadDump",
+ "check": [
+ "@test",
+ "@cs-check"
+ ],
+ "cs-check": "phpcs --colors -p --standard=vendor/cakephp/cakephp-codesniffer/CakePHP ./src ./tests",
+ "cs-fix": "phpcbf --colors --standard=vendor/cakephp/cakephp-codesniffer/CakePHP ./src ./tests",
+ "test": "phpunit --colors=always"
+ },
+ "prefer-stable": true
+}
diff --git a/production/example_apps/shared_calendar/composer.lock b/production/example_apps/shared_calendar/composer.lock
new file mode 100644
index 00000000..1cacf0de
--- /dev/null
+++ b/production/example_apps/shared_calendar/composer.lock
@@ -0,0 +1,2538 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "099599d4cc2fd8367c1e6c24bb83d011",
+ "packages": [
+ {
+ "name": "aura/intl",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/auraphp/Aura.Intl.git",
+ "reference": "7fce228980b19bf4dee2d7bbd6202a69b0dde926"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/auraphp/Aura.Intl/zipball/7fce228980b19bf4dee2d7bbd6202a69b0dde926",
+ "reference": "7fce228980b19bf4dee2d7bbd6202a69b0dde926",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Aura\\Intl\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aura.Intl Contributors",
+ "homepage": "https://github.com/auraphp/Aura.Intl/contributors"
+ }
+ ],
+ "description": "The Aura Intl package provides internationalization tools, specifically message translation.",
+ "homepage": "https://github.com/auraphp/Aura.Intl",
+ "keywords": [
+ "g11n",
+ "globalization",
+ "i18n",
+ "internationalization",
+ "intl",
+ "l10n",
+ "localization"
+ ],
+ "time": "2017-01-20T05:00:11+00:00"
+ },
+ {
+ "name": "cakephp/cakephp",
+ "version": "3.4.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/cakephp.git",
+ "reference": "c90f9d2ef2376f8e4d9cca39d971053707645118"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/cakephp/zipball/c90f9d2ef2376f8e4d9cca39d971053707645118",
+ "reference": "c90f9d2ef2376f8e4d9cca39d971053707645118",
+ "shasum": ""
+ },
+ "require": {
+ "aura/intl": "^3.0.0",
+ "cakephp/chronos": "^1.0.0",
+ "ext-intl": "*",
+ "ext-mbstring": "*",
+ "php": ">=5.6.0",
+ "psr/log": "^1.0.0",
+ "zendframework/zend-diactoros": "^1.4.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<5.7"
+ },
+ "replace": {
+ "cakephp/cache": "self.version",
+ "cakephp/collection": "self.version",
+ "cakephp/core": "self.version",
+ "cakephp/database": "self.version",
+ "cakephp/datasource": "self.version",
+ "cakephp/event": "self.version",
+ "cakephp/filesystem": "self.version",
+ "cakephp/form": "self.version",
+ "cakephp/i18n": "self.version",
+ "cakephp/log": "self.version",
+ "cakephp/orm": "self.version",
+ "cakephp/utility": "self.version",
+ "cakephp/validation": "self.version"
+ },
+ "require-dev": {
+ "cakephp/cakephp-codesniffer": "^3.0",
+ "phpunit/phpunit": "^5.7|^6.0"
+ },
+ "suggest": {
+ "ext-openssl": "To use Security::encrypt() or have secure CSRF token generation.",
+ "lib-ICU": "The intl PHP library, to use Text::transliterate() or Text::slug()"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Cake\\": "src"
+ },
+ "files": [
+ "src/Core/functions.php",
+ "src/Collection/functions.php",
+ "src/I18n/functions.php",
+ "src/Utility/bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "CakePHP Community",
+ "homepage": "https://github.com/cakephp/cakephp/graphs/contributors"
+ }
+ ],
+ "description": "The CakePHP framework",
+ "homepage": "https://cakephp.org",
+ "keywords": [
+ "conventions over configuration",
+ "dry",
+ "form",
+ "framework",
+ "mvc",
+ "orm",
+ "psr-7",
+ "rapid-development",
+ "validation"
+ ],
+ "time": "2017-07-19T01:43:53+00:00"
+ },
+ {
+ "name": "cakephp/chronos",
+ "version": "1.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/chronos.git",
+ "reference": "0621b191334d8dcb56907688986dd24eb8c38234"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/chronos/zipball/0621b191334d8dcb56907688986dd24eb8c38234",
+ "reference": "0621b191334d8dcb56907688986dd24eb8c38234",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1",
+ "cakephp/cakephp-codesniffer": "~2.3",
+ "phpbench/phpbench": "@dev",
+ "phpstan/phpstan": "^0.6.4",
+ "phpunit/phpunit": "<6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Cake\\Chronos\\": "src"
+ },
+ "files": [
+ "src/carbon_compat.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brian Nesbitt",
+ "email": "brian@nesbot.com",
+ "homepage": "http://nesbot.com"
+ },
+ {
+ "name": "The CakePHP Team",
+ "homepage": "http://cakephp.org"
+ }
+ ],
+ "description": "A simple API extension for DateTime.",
+ "homepage": "http://cakephp.org",
+ "keywords": [
+ "date",
+ "datetime",
+ "time"
+ ],
+ "time": "2017-04-27T01:27:49+00:00"
+ },
+ {
+ "name": "cakephp/migrations",
+ "version": "1.6.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/migrations.git",
+ "reference": "f2a5e2915f8924bd36979a1001edeef7cd455f89"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/migrations/zipball/f2a5e2915f8924bd36979a1001edeef7cd455f89",
+ "reference": "f2a5e2915f8924bd36979a1001edeef7cd455f89",
+ "shasum": ""
+ },
+ "require": {
+ "cakephp/cakephp": "~3.1",
+ "php": ">=5.4",
+ "robmorgan/phinx": "0.6.5"
+ },
+ "require-dev": {
+ "cakephp/bake": "@stable",
+ "phpunit/phpunit": "*"
+ },
+ "suggest": {
+ "cakephp/bake": "Required if you want to generate migrations."
+ },
+ "type": "cakephp-plugin",
+ "autoload": {
+ "psr-4": {
+ "Migrations\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "CakePHP Community",
+ "homepage": "https://github.com/cakephp/migrations/graphs/contributors"
+ }
+ ],
+ "description": "Database Migration plugin for CakePHP 3.0 based on Phinx",
+ "homepage": "https://github.com/cakephp/migrations",
+ "keywords": [
+ "cakephp",
+ "migrations"
+ ],
+ "time": "2017-01-07T16:45:31+00:00"
+ },
+ {
+ "name": "cakephp/plugin-installer",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/plugin-installer.git",
+ "reference": "3449cb3251e3e741b123237765e278005565d8de"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/plugin-installer/zipball/3449cb3251e3e741b123237765e278005565d8de",
+ "reference": "3449cb3251e3e741b123237765e278005565d8de",
+ "shasum": ""
+ },
+ "require-dev": {
+ "cakephp/cakephp-codesniffer": "dev-master",
+ "composer/composer": "1.0.*@dev",
+ "phpunit/phpunit": "^4.8|^5.7|^6.0"
+ },
+ "type": "composer-installer",
+ "extra": {
+ "class": "Cake\\Composer\\Installer\\PluginInstaller"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cake\\Composer\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "CakePHP Community",
+ "homepage": "http://cakephp.org"
+ }
+ ],
+ "description": "A composer installer for CakePHP 3.0+ plugins.",
+ "time": "2017-03-21T13:48:47+00:00"
+ },
+ {
+ "name": "firebase/php-jwt",
+ "version": "v4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/firebase/php-jwt.git",
+ "reference": "dccf163dc8ed7ed6a00afc06c51ee5186a428d35"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/firebase/php-jwt/zipball/dccf163dc8ed7ed6a00afc06c51ee5186a428d35",
+ "reference": "dccf163dc8ed7ed6a00afc06c51ee5186a428d35",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Firebase\\JWT\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Neuman Vong",
+ "email": "neuman+pear@twilio.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Anant Narayanan",
+ "email": "anant@php.net",
+ "role": "Developer"
+ }
+ ],
+ "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
+ "homepage": "https://github.com/firebase/php-jwt",
+ "time": "2016-07-18T04:51:16+00:00"
+ },
+ {
+ "name": "google/apiclient",
+ "version": "v2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/google/google-api-php-client.git",
+ "reference": "f3fadd538315d62ebd1191d89ac791468c617260"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/google/google-api-php-client/zipball/f3fadd538315d62ebd1191d89ac791468c617260",
+ "reference": "f3fadd538315d62ebd1191d89ac791468c617260",
+ "shasum": ""
+ },
+ "require": {
+ "firebase/php-jwt": "~2.0|~3.0|~4.0|~5.0",
+ "google/apiclient-services": "~0.13",
+ "google/auth": "^1.0",
+ "guzzlehttp/guzzle": "~5.3.1|~6.0",
+ "guzzlehttp/psr7": "^1.2",
+ "monolog/monolog": "^1.17",
+ "php": ">=5.4",
+ "phpseclib/phpseclib": "~0.3.10|~2.0"
+ },
+ "require-dev": {
+ "cache/filesystem-adapter": "^0.3.2",
+ "phpunit/phpunit": "~4",
+ "squizlabs/php_codesniffer": "~2.3",
+ "symfony/css-selector": "~2.1",
+ "symfony/dom-crawler": "~2.1"
+ },
+ "suggest": {
+ "cache/filesystem-adapter": "For caching certs and tokens (using Google_Client::setCache)"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Google_": "src/"
+ },
+ "classmap": [
+ "src/Google/Service/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "description": "Client library for Google APIs",
+ "homepage": "http://developers.google.com/api-client-library/php",
+ "keywords": [
+ "google"
+ ],
+ "time": "2017-07-10T15:34:54+00:00"
+ },
+ {
+ "name": "google/apiclient-services",
+ "version": "v0.16",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/google/google-api-php-client-services.git",
+ "reference": "29c32b7d90a92af279ff5b51301fef03b44da7dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/google/google-api-php-client-services/zipball/29c32b7d90a92af279ff5b51301fef03b44da7dd",
+ "reference": "29c32b7d90a92af279ff5b51301fef03b44da7dd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Google_Service_": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "description": "Client library for Google APIs",
+ "homepage": "http://developers.google.com/api-client-library/php",
+ "keywords": [
+ "google"
+ ],
+ "time": "2017-07-22T00:20:26+00:00"
+ },
+ {
+ "name": "google/auth",
+ "version": "v1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/google/google-auth-library-php.git",
+ "reference": "db77bd2de0bcc40bf50ebe851e9eed332aeaa4df"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/google/google-auth-library-php/zipball/db77bd2de0bcc40bf50ebe851e9eed332aeaa4df",
+ "reference": "db77bd2de0bcc40bf50ebe851e9eed332aeaa4df",
+ "shasum": ""
+ },
+ "require": {
+ "firebase/php-jwt": "~2.0|~3.0|~4.0",
+ "guzzlehttp/guzzle": "~5.3.1|~6.0",
+ "guzzlehttp/psr7": "~1.2",
+ "php": ">=5.4",
+ "psr/cache": "^1.0",
+ "psr/http-message": "^1.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^1.11",
+ "phpunit/phpunit": "3.7.*"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ],
+ "psr-4": {
+ "Google\\Auth\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "description": "Google Auth Library for PHP",
+ "homepage": "http://github.com/google/google-auth-library-php",
+ "keywords": [
+ "Authentication",
+ "google",
+ "oauth2"
+ ],
+ "time": "2017-06-13T18:00:07+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "6.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699",
+ "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/promises": "^1.0",
+ "guzzlehttp/psr7": "^1.4",
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "ext-curl": "*",
+ "phpunit/phpunit": "^4.0 || ^5.0",
+ "psr/log": "^1.0"
+ },
+ "suggest": {
+ "psr/log": "Required for using the Log middleware"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.2-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "rest",
+ "web service"
+ ],
+ "time": "2017-06-22T18:50:49+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "v1.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ],
+ "time": "2016-12-20T10:07:11+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "1.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+ "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "psr/http-message": "~1.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Schultze",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "time": "2017-03-20T17:10:46+00:00"
+ },
+ {
+ "name": "mobiledetect/mobiledetectlib",
+ "version": "2.8.25",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/serbanghita/Mobile-Detect.git",
+ "reference": "f0896b5c7274d1450023b0b376240be902c3251c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/f0896b5c7274d1450023b0b376240be902c3251c",
+ "reference": "f0896b5c7274d1450023b0b376240be902c3251c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "Mobile_Detect.php"
+ ],
+ "psr-0": {
+ "Detection": "namespaced/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Serban Ghita",
+ "email": "serbanghita@gmail.com",
+ "homepage": "http://mobiledetect.net",
+ "role": "Developer"
+ }
+ ],
+ "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.",
+ "homepage": "https://github.com/serbanghita/Mobile-Detect",
+ "keywords": [
+ "detect mobile devices",
+ "mobile",
+ "mobile detect",
+ "mobile detector",
+ "php mobile detect"
+ ],
+ "time": "2017-03-29T13:59:30+00:00"
+ },
+ {
+ "name": "monolog/monolog",
+ "version": "1.23.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/monolog.git",
+ "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4",
+ "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "psr/log": "~1.0"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0.0"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+ "doctrine/couchdb": "~1.0@dev",
+ "graylog2/gelf-php": "~1.0",
+ "jakub-onderka/php-parallel-lint": "0.9",
+ "php-amqplib/php-amqplib": "~2.4",
+ "php-console/php-console": "^3.1.3",
+ "phpunit/phpunit": "~4.5",
+ "phpunit/phpunit-mock-objects": "2.3.0",
+ "ruflin/elastica": ">=0.90 <3.0",
+ "sentry/sentry": "^0.13",
+ "swiftmailer/swiftmailer": "^5.3|^6.0"
+ },
+ "suggest": {
+ "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+ "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+ "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+ "ext-mongo": "Allow sending log messages to a MongoDB server",
+ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+ "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
+ "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+ "php-console/php-console": "Allow sending log messages to Google Chrome",
+ "rollbar/rollbar": "Allow sending log messages to Rollbar",
+ "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
+ "sentry/sentry": "Allow sending log messages to a Sentry server"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Monolog\\": "src/Monolog"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+ "homepage": "http://github.com/Seldaek/monolog",
+ "keywords": [
+ "log",
+ "logging",
+ "psr-3"
+ ],
+ "time": "2017-06-19T01:22:40+00:00"
+ },
+ {
+ "name": "phpseclib/phpseclib",
+ "version": "2.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpseclib/phpseclib.git",
+ "reference": "34a7699e6f31b1ef4035ee36444407cecf9f56aa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/34a7699e6f31b1ef4035ee36444407cecf9f56aa",
+ "reference": "34a7699e6f31b1ef4035ee36444407cecf9f56aa",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phing/phing": "~2.7",
+ "phpunit/phpunit": "~4.0",
+ "sami/sami": "~2.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "suggest": {
+ "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
+ "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
+ "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
+ "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "phpseclib/bootstrap.php"
+ ],
+ "psr-4": {
+ "phpseclib\\": "phpseclib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jim Wigginton",
+ "email": "terrafrost@php.net",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Patrick Monnerat",
+ "email": "pm@datasphere.ch",
+ "role": "Developer"
+ },
+ {
+ "name": "Andreas Fischer",
+ "email": "bantu@phpbb.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Hans-Jürgen Petrich",
+ "email": "petrich@tronic-media.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
+ "homepage": "http://phpseclib.sourceforge.net",
+ "keywords": [
+ "BigInteger",
+ "aes",
+ "asn.1",
+ "asn1",
+ "blowfish",
+ "crypto",
+ "cryptography",
+ "encryption",
+ "rsa",
+ "security",
+ "sftp",
+ "signature",
+ "signing",
+ "ssh",
+ "twofish",
+ "x.509",
+ "x509"
+ ],
+ "time": "2017-06-05T06:31:10+00:00"
+ },
+ {
+ "name": "psr/cache",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
+ "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ],
+ "time": "2016-08-06T20:24:11+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "time": "2016-08-06T14:39:51+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "time": "2016-10-10T12:19:37+00:00"
+ },
+ {
+ "name": "robmorgan/phinx",
+ "version": "v0.6.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/phinx.git",
+ "reference": "6943cb4bb78bf9d3964967a032220b7c793b97b7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/phinx/zipball/6943cb4bb78bf9d3964967a032220b7c793b97b7",
+ "reference": "6943cb4bb78bf9d3964967a032220b7c793b97b7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4",
+ "symfony/config": "~2.8|~3.0",
+ "symfony/console": "~2.8|~3.0",
+ "symfony/yaml": "~2.8|~3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.26|^5.0"
+ },
+ "bin": [
+ "bin/phinx"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Phinx\\": "src/Phinx"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Woody Gilk",
+ "email": "woody.gilk@gmail.com",
+ "homepage": "http://shadowhand.me",
+ "role": "Developer"
+ },
+ {
+ "name": "Rob Morgan",
+ "email": "robbym@gmail.com",
+ "homepage": "https://robmorgan.id.au",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Richard Quadling",
+ "email": "rquadling@gmail.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "Phinx makes it ridiculously easy to manage the database migrations for your PHP app.",
+ "homepage": "https://phinx.org",
+ "keywords": [
+ "database",
+ "database migrations",
+ "db",
+ "migrations",
+ "phinx"
+ ],
+ "time": "2016-10-27T10:16:12+00:00"
+ },
+ {
+ "name": "symfony/config",
+ "version": "v3.3.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/config.git",
+ "reference": "a094618deb9a3fe1c3cf500a796e167d0495a274"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/config/zipball/a094618deb9a3fe1c3cf500a796e167d0495a274",
+ "reference": "a094618deb9a3fe1c3cf500a796e167d0495a274",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/filesystem": "~2.8|~3.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<3.3",
+ "symfony/finder": "<3.3"
+ },
+ "require-dev": {
+ "symfony/dependency-injection": "~3.3",
+ "symfony/finder": "~3.3",
+ "symfony/yaml": "~3.0"
+ },
+ "suggest": {
+ "symfony/yaml": "To use the yaml reference dumper"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Config\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Config Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-06-16T12:40:34+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v3.3.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "a97e45d98c59510f085fa05225a1acb74dfe0546"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/a97e45d98c59510f085fa05225a1acb74dfe0546",
+ "reference": "a97e45d98c59510f085fa05225a1acb74dfe0546",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/debug": "~2.8|~3.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<3.3"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~3.3",
+ "symfony/dependency-injection": "~3.3",
+ "symfony/event-dispatcher": "~2.8|~3.0",
+ "symfony/filesystem": "~2.8|~3.0",
+ "symfony/http-kernel": "~2.8|~3.0",
+ "symfony/process": "~2.8|~3.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/filesystem": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Console Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-07-03T13:19:36+00:00"
+ },
+ {
+ "name": "symfony/debug",
+ "version": "v3.3.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/debug.git",
+ "reference": "63b85a968486d95ff9542228dc2e4247f16f9743"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/63b85a968486d95ff9542228dc2e4247f16f9743",
+ "reference": "63b85a968486d95ff9542228dc2e4247f16f9743",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "psr/log": "~1.0"
+ },
+ "conflict": {
+ "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+ },
+ "require-dev": {
+ "symfony/http-kernel": "~2.8|~3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Debug\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Debug Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-07-05T13:02:37+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v3.3.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "427987eb4eed764c3b6e38d52a0f87989e010676"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/427987eb4eed764c3b6e38d52a0f87989e010676",
+ "reference": "427987eb4eed764c3b6e38d52a0f87989e010676",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Filesystem Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-07-11T07:17:58+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "f29dca382a6485c3cbe6379f0c61230167681937"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f29dca382a6485c3cbe6379f0c61230167681937",
+ "reference": "f29dca382a6485c3cbe6379f0c61230167681937",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2017-06-09T14:24:12+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v3.3.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "1f93a8d19b8241617f5074a123e282575b821df8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/1f93a8d19b8241617f5074a123e282575b821df8",
+ "reference": "1f93a8d19b8241617f5074a123e282575b821df8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "require-dev": {
+ "symfony/console": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/console": "For validating YAML files using the lint command"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-06-15T12:58:50+00:00"
+ },
+ {
+ "name": "zendframework/zend-diactoros",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/zendframework/zend-diactoros.git",
+ "reference": "b03f285a333f51e58c95cce54109a4a9ed691436"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/b03f285a333f51e58c95cce54109a4a9ed691436",
+ "reference": "b03f285a333f51e58c95cce54109a4a9ed691436",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.4 || ^7.0",
+ "psr/http-message": "~1.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "phpunit/phpunit": "^4.6 || ^5.5",
+ "zendframework/zend-coding-standard": "~1.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev",
+ "dev-develop": "1.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Zend\\Diactoros\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "description": "PSR HTTP Message implementations",
+ "homepage": "https://github.com/zendframework/zend-diactoros",
+ "keywords": [
+ "http",
+ "psr",
+ "psr-7"
+ ],
+ "time": "2017-04-06T16:18:34+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "cakephp/bake",
+ "version": "1.3.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/bake.git",
+ "reference": "4bbb541ee27d12fe63f15cf5acf70b94553de209"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/bake/zipball/4bbb541ee27d12fe63f15cf5acf70b94553de209",
+ "reference": "4bbb541ee27d12fe63f15cf5acf70b94553de209",
+ "shasum": ""
+ },
+ "require": {
+ "cakephp/cakephp": ">=3.4.0 <4.0.0",
+ "cakephp/plugin-installer": "*",
+ "php": ">=5.6.0"
+ },
+ "require-dev": {
+ "cakephp/cakephp-codesniffer": "^3.0",
+ "phpunit/phpunit": "~5.7 | ~6.0"
+ },
+ "type": "cakephp-plugin",
+ "autoload": {
+ "psr-4": {
+ "Bake\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "CakePHP Community",
+ "homepage": "https://github.com/cakephp/bake/graphs/contributors"
+ }
+ ],
+ "description": "Bake plugin for CakePHP 3.0",
+ "homepage": "https://github.com/cakephp/bake",
+ "keywords": [
+ "bake",
+ "cakephp"
+ ],
+ "time": "2017-07-01T15:59:12+00:00"
+ },
+ {
+ "name": "cakephp/debug_kit",
+ "version": "3.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/debug_kit.git",
+ "reference": "49208ec4aa0f5650095565f66c52a72fbe393069"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/debug_kit/zipball/49208ec4aa0f5650095565f66c52a72fbe393069",
+ "reference": "49208ec4aa0f5650095565f66c52a72fbe393069",
+ "shasum": ""
+ },
+ "require": {
+ "cakephp/cakephp": "^3.4.0",
+ "cakephp/chronos": "^1.0.0",
+ "cakephp/plugin-installer": "^1.0.0",
+ "composer/composer": "^1.3.0",
+ "jdorn/sql-formatter": "^1.2.0",
+ "php": ">=5.6.0"
+ },
+ "require-dev": {
+ "cakephp/cakephp-codesniffer": "^3.0",
+ "phpunit/phpunit": "^5.7|^6.0"
+ },
+ "suggest": {
+ "ext-sqlite": "DebugKit needs to store panel data in a database. SQLite is simple and easy to use."
+ },
+ "type": "cakephp-plugin",
+ "autoload": {
+ "psr-4": {
+ "DebugKit\\": "src",
+ "DebugKit\\Test\\Fixture\\": "tests\\Fixture"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mark Story",
+ "homepage": "http://mark-story.com",
+ "role": "Author"
+ },
+ {
+ "name": "CakePHP Community",
+ "homepage": "https://github.com/cakephp/debug_kit/graphs/contributors"
+ }
+ ],
+ "description": "CakePHP Debug Kit",
+ "homepage": "https://github.com/cakephp/debug_kit",
+ "keywords": [
+ "cakephp",
+ "debug",
+ "kit"
+ ],
+ "time": "2017-07-20T11:18:33+00:00"
+ },
+ {
+ "name": "composer/ca-bundle",
+ "version": "1.0.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/ca-bundle.git",
+ "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b17e6153cb7f33c7e44eb59578dc12eee5dc8e12",
+ "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12",
+ "shasum": ""
+ },
+ "require": {
+ "ext-openssl": "*",
+ "ext-pcre": "*",
+ "php": "^5.3.2 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.5",
+ "psr/log": "^1.0",
+ "symfony/process": "^2.5 || ^3.0"
+ },
+ "suggest": {
+ "symfony/process": "This is necessary to reliably check whether openssl_x509_parse is vulnerable on older php versions, but can be ignored on PHP 5.5.6+"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\CaBundle\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
+ "keywords": [
+ "cabundle",
+ "cacert",
+ "certificate",
+ "ssl",
+ "tls"
+ ],
+ "time": "2017-03-06T11:59:08+00:00"
+ },
+ {
+ "name": "composer/composer",
+ "version": "1.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/composer.git",
+ "reference": "489e09ee6c3ba431fbeeef9147afdaeb6f91b647"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/composer/zipball/489e09ee6c3ba431fbeeef9147afdaeb6f91b647",
+ "reference": "489e09ee6c3ba431fbeeef9147afdaeb6f91b647",
+ "shasum": ""
+ },
+ "require": {
+ "composer/ca-bundle": "^1.0",
+ "composer/semver": "^1.0",
+ "composer/spdx-licenses": "^1.0",
+ "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0",
+ "php": "^5.3.2 || ^7.0",
+ "psr/log": "^1.0",
+ "seld/cli-prompt": "^1.0",
+ "seld/jsonlint": "^1.4",
+ "seld/phar-utils": "^1.0",
+ "symfony/console": "^2.7 || ^3.0",
+ "symfony/filesystem": "^2.7 || ^3.0",
+ "symfony/finder": "^2.7 || ^3.0",
+ "symfony/process": "^2.7 || ^3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.5 || ^5.0.5",
+ "phpunit/phpunit-mock-objects": "^2.3 || ^3.0"
+ },
+ "suggest": {
+ "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages",
+ "ext-zip": "Enabling the zip extension allows you to unzip archives",
+ "ext-zlib": "Allow gzip compression of HTTP requests"
+ },
+ "bin": [
+ "bin/composer"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\": "src/Composer"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "Composer helps you declare, manage and install dependencies of PHP projects, ensuring you have the right stack everywhere.",
+ "homepage": "https://getcomposer.org/",
+ "keywords": [
+ "autoload",
+ "dependency",
+ "package"
+ ],
+ "time": "2017-05-17T06:17:53+00:00"
+ },
+ {
+ "name": "composer/semver",
+ "version": "1.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/semver.git",
+ "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/semver/zipball/c7cb9a2095a074d131b65a8a0cd294479d785573",
+ "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.5 || ^5.0.5",
+ "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Semver\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ },
+ {
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com",
+ "homepage": "http://robbast.nl"
+ }
+ ],
+ "description": "Semver library that offers utilities, version constraint parsing and validation.",
+ "keywords": [
+ "semantic",
+ "semver",
+ "validation",
+ "versioning"
+ ],
+ "time": "2016-08-30T16:08:34+00:00"
+ },
+ {
+ "name": "composer/spdx-licenses",
+ "version": "1.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/spdx-licenses.git",
+ "reference": "2603a0d7ddc00a015deb576fa5297ca43dee6b1c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/2603a0d7ddc00a015deb576fa5297ca43dee6b1c",
+ "reference": "2603a0d7ddc00a015deb576fa5297ca43dee6b1c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.5 || ^5.0.5",
+ "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Spdx\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ },
+ {
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com",
+ "homepage": "http://robbast.nl"
+ }
+ ],
+ "description": "SPDX licenses list and validation library.",
+ "keywords": [
+ "license",
+ "spdx",
+ "validator"
+ ],
+ "time": "2017-04-03T19:08:52+00:00"
+ },
+ {
+ "name": "dnoegel/php-xdg-base-dir",
+ "version": "0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dnoegel/php-xdg-base-dir.git",
+ "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/265b8593498b997dc2d31e75b89f053b5cc9621a",
+ "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "@stable"
+ },
+ "type": "project",
+ "autoload": {
+ "psr-4": {
+ "XdgBaseDir\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "implementation of xdg base directory specification for php",
+ "time": "2014-10-24T07:27:01+00:00"
+ },
+ {
+ "name": "jakub-onderka/php-console-color",
+ "version": "0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/JakubOnderka/PHP-Console-Color.git",
+ "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/e0b393dacf7703fc36a4efc3df1435485197e6c1",
+ "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "jakub-onderka/php-code-style": "1.0",
+ "jakub-onderka/php-parallel-lint": "0.*",
+ "jakub-onderka/php-var-dump-check": "0.*",
+ "phpunit/phpunit": "3.7.*",
+ "squizlabs/php_codesniffer": "1.*"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "JakubOnderka\\PhpConsoleColor": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jakub Onderka",
+ "email": "jakub.onderka@gmail.com",
+ "homepage": "http://www.acci.cz"
+ }
+ ],
+ "time": "2014-04-08T15:00:19+00:00"
+ },
+ {
+ "name": "jakub-onderka/php-console-highlighter",
+ "version": "v0.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git",
+ "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/7daa75df45242c8d5b75a22c00a201e7954e4fb5",
+ "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5",
+ "shasum": ""
+ },
+ "require": {
+ "jakub-onderka/php-console-color": "~0.1",
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "jakub-onderka/php-code-style": "~1.0",
+ "jakub-onderka/php-parallel-lint": "~0.5",
+ "jakub-onderka/php-var-dump-check": "~0.1",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~1.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "JakubOnderka\\PhpConsoleHighlighter": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jakub Onderka",
+ "email": "acci@acci.cz",
+ "homepage": "http://www.acci.cz/"
+ }
+ ],
+ "time": "2015-04-20T18:58:01+00:00"
+ },
+ {
+ "name": "jdorn/sql-formatter",
+ "version": "v1.2.17",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jdorn/sql-formatter.git",
+ "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc",
+ "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "3.7.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "lib"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jeremy Dorn",
+ "email": "jeremy@jeremydorn.com",
+ "homepage": "http://jeremydorn.com/"
+ }
+ ],
+ "description": "a PHP SQL highlighting library",
+ "homepage": "https://github.com/jdorn/sql-formatter/",
+ "keywords": [
+ "highlight",
+ "sql"
+ ],
+ "time": "2014-01-12T16:20:24+00:00"
+ },
+ {
+ "name": "justinrainbow/json-schema",
+ "version": "5.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/justinrainbow/json-schema.git",
+ "reference": "429be236f296ca249d61c65649cdf2652f4a5e80"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/429be236f296ca249d61c65649cdf2652f4a5e80",
+ "reference": "429be236f296ca249d61c65649cdf2652f4a5e80",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.1",
+ "json-schema/json-schema-test-suite": "1.2.0",
+ "phpdocumentor/phpdocumentor": "^2.7",
+ "phpunit/phpunit": "^4.8.22"
+ },
+ "bin": [
+ "bin/validate-json"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "JsonSchema\\": "src/JsonSchema/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bruno Prieto Reis",
+ "email": "bruno.p.reis@gmail.com"
+ },
+ {
+ "name": "Justin Rainbow",
+ "email": "justin.rainbow@gmail.com"
+ },
+ {
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch"
+ },
+ {
+ "name": "Robert Schönthal",
+ "email": "seroscho@googlemail.com"
+ }
+ ],
+ "description": "A library to validate a json schema.",
+ "homepage": "https://github.com/justinrainbow/json-schema",
+ "keywords": [
+ "json",
+ "schema"
+ ],
+ "time": "2017-05-16T21:06:09+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v3.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "0808939f81c1347a3c8a82a5925385a08074b0f1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0808939f81c1347a3c8a82a5925385a08074b0f1",
+ "reference": "0808939f81c1347a3c8a82a5925385a08074b0f1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0|~5.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "time": "2017-06-28T20:53:48+00:00"
+ },
+ {
+ "name": "psy/psysh",
+ "version": "v0.8.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/bobthecow/psysh.git",
+ "reference": "7ab97e5a32202585309f3ee35a0c08d2a8e588b1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/7ab97e5a32202585309f3ee35a0c08d2a8e588b1",
+ "reference": "7ab97e5a32202585309f3ee35a0c08d2a8e588b1",
+ "shasum": ""
+ },
+ "require": {
+ "dnoegel/php-xdg-base-dir": "0.1",
+ "jakub-onderka/php-console-highlighter": "0.3.*",
+ "nikic/php-parser": "~1.3|~2.0|~3.0",
+ "php": ">=5.3.9",
+ "symfony/console": "~2.3.10|^2.4.2|~3.0",
+ "symfony/var-dumper": "~2.7|~3.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "~1.11",
+ "hoa/console": "~3.16|~1.14",
+ "phpunit/phpunit": "~4.4|~5.0",
+ "symfony/finder": "~2.1|~3.0"
+ },
+ "suggest": {
+ "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
+ "ext-pdo-sqlite": "The doc command requires SQLite to work.",
+ "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.",
+ "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.",
+ "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit."
+ },
+ "bin": [
+ "bin/psysh"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-develop": "0.8.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Psy/functions.php"
+ ],
+ "psr-4": {
+ "Psy\\": "src/Psy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Justin Hileman",
+ "email": "justin@justinhileman.info",
+ "homepage": "http://justinhileman.com"
+ }
+ ],
+ "description": "An interactive shell for modern PHP.",
+ "homepage": "http://psysh.org",
+ "keywords": [
+ "REPL",
+ "console",
+ "interactive",
+ "shell"
+ ],
+ "time": "2017-07-22T15:14:19+00:00"
+ },
+ {
+ "name": "seld/cli-prompt",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/cli-prompt.git",
+ "reference": "a19a7376a4689d4d94cab66ab4f3c816019ba8dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/cli-prompt/zipball/a19a7376a4689d4d94cab66ab4f3c816019ba8dd",
+ "reference": "a19a7376a4689d4d94cab66ab4f3c816019ba8dd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Seld\\CliPrompt\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be"
+ }
+ ],
+ "description": "Allows you to prompt for user input on the command line, and optionally hide the characters they type",
+ "keywords": [
+ "cli",
+ "console",
+ "hidden",
+ "input",
+ "prompt"
+ ],
+ "time": "2017-03-18T11:32:45+00:00"
+ },
+ {
+ "name": "seld/jsonlint",
+ "version": "1.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/jsonlint.git",
+ "reference": "50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77",
+ "reference": "50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.5"
+ },
+ "bin": [
+ "bin/jsonlint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Seld\\JsonLint\\": "src/Seld/JsonLint/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "JSON Linter",
+ "keywords": [
+ "json",
+ "linter",
+ "parser",
+ "validator"
+ ],
+ "time": "2017-06-18T15:11:04+00:00"
+ },
+ {
+ "name": "seld/phar-utils",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/phar-utils.git",
+ "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/7009b5139491975ef6486545a39f3e6dad5ac30a",
+ "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Seld\\PharUtils\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be"
+ }
+ ],
+ "description": "PHAR file format utilities, for when PHP phars you up",
+ "keywords": [
+ "phra"
+ ],
+ "time": "2015-10-13T18:44:15+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v3.3.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "baea7f66d30854ad32988c11a09d7ffd485810c4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/baea7f66d30854ad32988c11a09d7ffd485810c4",
+ "reference": "baea7f66d30854ad32988c11a09d7ffd485810c4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Finder Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-06-01T21:01:25+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v3.3.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "07432804942b9f6dd7b7377faf9920af5f95d70a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/07432804942b9f6dd7b7377faf9920af5f95d70a",
+ "reference": "07432804942b9f6dd7b7377faf9920af5f95d70a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Process Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-07-13T13:05:09+00:00"
+ },
+ {
+ "name": "symfony/var-dumper",
+ "version": "v3.3.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "0f32b62d21991700250fed5109b092949007c5b3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0f32b62d21991700250fed5109b092949007c5b3",
+ "reference": "0f32b62d21991700250fed5109b092949007c5b3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0"
+ },
+ "require-dev": {
+ "ext-iconv": "*",
+ "twig/twig": "~1.34|~2.4"
+ },
+ "suggest": {
+ "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+ "ext-symfony_debug": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.3-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "Resources/functions/dump.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\VarDumper\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony mechanism for exploring and dumping PHP variables",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "debug",
+ "dump"
+ ],
+ "time": "2017-07-10T14:18:27+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {
+ "psy/psysh": 0
+ },
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=5.6"
+ },
+ "platform-dev": []
+}
diff --git a/production/example_apps/shared_calendar/config/Migrations/20170725211622_CreateUsers.php b/production/example_apps/shared_calendar/config/Migrations/20170725211622_CreateUsers.php
new file mode 100644
index 00000000..410e841f
--- /dev/null
+++ b/production/example_apps/shared_calendar/config/Migrations/20170725211622_CreateUsers.php
@@ -0,0 +1,24 @@
+table('users', ['id' => false, 'primary_key' => ['id']])
+ ->addColumn('id', 'integer', ['identity' => true, 'signed' => false])
+ ->addColumn('name', 'string', ['length' => 128, 'null' => false])
+ ->addColumn('token', 'string', ['length' => 2048, 'null' => true])
+ ->addColumn('created', 'datetime')
+ ->addColumn('modified', 'datetime')
+ ->addIndex('name')
+ ->create();
+ }
+}
diff --git a/production/example_apps/shared_calendar/config/Migrations/schema-dump-default.lock b/production/example_apps/shared_calendar/config/Migrations/schema-dump-default.lock
new file mode 100644
index 00000000..45109998
Binary files /dev/null and b/production/example_apps/shared_calendar/config/Migrations/schema-dump-default.lock differ
diff --git a/production/example_apps/shared_calendar/config/app.default.php b/production/example_apps/shared_calendar/config/app.default.php
new file mode 100644
index 00000000..c06599e2
--- /dev/null
+++ b/production/example_apps/shared_calendar/config/app.default.php
@@ -0,0 +1,346 @@
+ filter_var(env('DEBUG', true), FILTER_VALIDATE_BOOLEAN),
+
+ /**
+ * Configure basic information about the application.
+ *
+ * - namespace - The namespace to find app classes under.
+ * - defaultLocale - The default locale for translation, formatting currencies and numbers, date and time.
+ * - encoding - The encoding used for HTML + database connections.
+ * - base - The base directory the app resides in. If false this
+ * will be auto detected.
+ * - dir - Name of app directory.
+ * - webroot - The webroot directory.
+ * - wwwRoot - The file path to webroot.
+ * - baseUrl - To configure CakePHP to *not* use mod_rewrite and to
+ * use CakePHP pretty URLs, remove these .htaccess
+ * files:
+ * /.htaccess
+ * /webroot/.htaccess
+ * And uncomment the baseUrl key below.
+ * - fullBaseUrl - A base URL to use for absolute links.
+ * - imageBaseUrl - Web path to the public images directory under webroot.
+ * - cssBaseUrl - Web path to the public css directory under webroot.
+ * - jsBaseUrl - Web path to the public js directory under webroot.
+ * - paths - Configure paths for non class based resources. Supports the
+ * `plugins`, `templates`, `locales` subkeys, which allow the definition of
+ * paths for plugins, view templates and locale files respectively.
+ */
+ 'App' => [
+ 'namespace' => 'App',
+ 'encoding' => env('APP_ENCODING', 'UTF-8'),
+ 'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
+ 'base' => false,
+ 'dir' => 'src',
+ 'webroot' => 'webroot',
+ 'wwwRoot' => WWW_ROOT,
+ // 'baseUrl' => env('SCRIPT_NAME'),
+ 'fullBaseUrl' => false,
+ 'imageBaseUrl' => 'img/',
+ 'cssBaseUrl' => 'css/',
+ 'jsBaseUrl' => 'js/',
+ 'paths' => [
+ 'plugins' => [ROOT . DS . 'plugins' . DS],
+ 'templates' => [APP . 'Template' . DS],
+ 'locales' => [APP . 'Locale' . DS],
+ ],
+ ],
+
+ /**
+ * Security and encryption configuration
+ *
+ * - salt - A random string used in security hashing methods.
+ * The salt value is also used as the encryption key.
+ * You should treat it as extremely sensitive data.
+ */
+ 'Security' => [
+ 'salt' => env('SECURITY_SALT', '__SALT__'),
+ ],
+
+ /**
+ * Apply timestamps with the last modified time to static assets (js, css, images).
+ * Will append a querystring parameter containing the time the file was modified.
+ * This is useful for busting browser caches.
+ *
+ * Set to true to apply timestamps when debug is true. Set to 'force' to always
+ * enable timestamping regardless of debug value.
+ */
+ 'Asset' => [
+ // 'timestamp' => true,
+ ],
+
+ /**
+ * Configure the cache adapters.
+ */
+ 'Cache' => [
+ 'default' => [
+ 'className' => 'File',
+ 'path' => CACHE,
+ 'url' => env('CACHE_DEFAULT_URL', null),
+ ],
+
+ /**
+ * Configure the cache used for general framework caching.
+ * Translation cache files are stored with this configuration.
+ * Duration will be set to '+2 minutes' in bootstrap.php when debug = true
+ * If you set 'className' => 'Null' core cache will be disabled.
+ */
+ '_cake_core_' => [
+ 'className' => 'File',
+ 'prefix' => 'myapp_cake_core_',
+ 'path' => CACHE . 'persistent/',
+ 'serialize' => true,
+ 'duration' => '+1 years',
+ 'url' => env('CACHE_CAKECORE_URL', null),
+ ],
+
+ /**
+ * Configure the cache for model and datasource caches. This cache
+ * configuration is used to store schema descriptions, and table listings
+ * in connections.
+ * Duration will be set to '+2 minutes' in bootstrap.php when debug = true
+ */
+ '_cake_model_' => [
+ 'className' => 'File',
+ 'prefix' => 'myapp_cake_model_',
+ 'path' => CACHE . 'models/',
+ 'serialize' => true,
+ 'duration' => '+1 years',
+ 'url' => env('CACHE_CAKEMODEL_URL', null),
+ ],
+ ],
+
+ /**
+ * Configure the Error and Exception handlers used by your application.
+ *
+ * By default errors are displayed using Debugger, when debug is true and logged
+ * by Cake\Log\Log when debug is false.
+ *
+ * In CLI environments exceptions will be printed to stderr with a backtrace.
+ * In web environments an HTML page will be displayed for the exception.
+ * With debug true, framework errors like Missing Controller will be displayed.
+ * When debug is false, framework errors will be coerced into generic HTTP errors.
+ *
+ * Options:
+ *
+ * - `errorLevel` - int - The level of errors you are interested in capturing.
+ * - `trace` - boolean - Whether or not backtraces should be included in
+ * logged errors/exceptions.
+ * - `log` - boolean - Whether or not you want exceptions logged.
+ * - `exceptionRenderer` - string - The class responsible for rendering
+ * uncaught exceptions. If you choose a custom class you should place
+ * the file for that class in src/Error. This class needs to implement a
+ * render method.
+ * - `skipLog` - array - List of exceptions to skip for logging. Exceptions that
+ * extend one of the listed exceptions will also be skipped for logging.
+ * E.g.:
+ * `'skipLog' => ['Cake\Network\Exception\NotFoundException', 'Cake\Network\Exception\UnauthorizedException']`
+ * - `extraFatalErrorMemory` - int - The number of megabytes to increase
+ * the memory limit by when a fatal error is encountered. This allows
+ * breathing room to complete logging or error handling.
+ */
+ 'Error' => [
+ 'errorLevel' => E_ALL,
+ 'exceptionRenderer' => 'Cake\Error\ExceptionRenderer',
+ 'skipLog' => [],
+ 'log' => true,
+ 'trace' => true,
+ ],
+
+ /**
+ * Email configuration.
+ *
+ * By defining transports separately from delivery profiles you can easily
+ * re-use transport configuration across multiple profiles.
+ *
+ * You can specify multiple configurations for production, development and
+ * testing.
+ *
+ * Each transport needs a `className`. Valid options are as follows:
+ *
+ * Mail - Send using PHP mail function
+ * Smtp - Send using SMTP
+ * Debug - Do not send the email, just return the result
+ *
+ * You can add custom transports (or override existing transports) by adding the
+ * appropriate file to src/Mailer/Transport. Transports should be named
+ * 'YourTransport.php', where 'Your' is the name of the transport.
+ */
+ 'EmailTransport' => [
+ 'default' => [
+ 'className' => 'Mail',
+ // The following keys are used in SMTP transports
+ 'host' => 'localhost',
+ 'port' => 25,
+ 'timeout' => 30,
+ 'username' => 'user',
+ 'password' => 'secret',
+ 'client' => null,
+ 'tls' => null,
+ 'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
+ ],
+ ],
+
+ /**
+ * Email delivery profiles
+ *
+ * Delivery profiles allow you to predefine various properties about email
+ * messages from your application and give the settings a name. This saves
+ * duplication across your application and makes maintenance and development
+ * easier. Each profile accepts a number of keys. See `Cake\Mailer\Email`
+ * for more information.
+ */
+ 'Email' => [
+ 'default' => [
+ 'transport' => 'default',
+ 'from' => 'you@localhost',
+ //'charset' => 'utf-8',
+ //'headerCharset' => 'utf-8',
+ ],
+ ],
+
+ /**
+ * Connection information used by the ORM to connect
+ * to your application's datastores.
+ * Do not use periods in database name - it may lead to error.
+ * See https://github.com/cakephp/cakephp/issues/6471 for details.
+ * Drivers include Mysql Postgres Sqlite Sqlserver
+ * See vendor\cakephp\cakephp\src\Database\Driver for complete list
+ */
+ 'Datasources' => [
+ 'default' => [
+ 'className' => 'Cake\Database\Connection',
+ 'driver' => 'Cake\Database\Driver\Mysql',
+ 'persistent' => false,
+ 'host' => 'localhost',
+ /**
+ * CakePHP will use the default DB port based on the driver selected
+ * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
+ * the following line and set the port accordingly
+ */
+ //'port' => 'non_standard_port_number',
+ 'username' => 'my_app',
+ 'password' => 'secret',
+ 'database' => 'my_app',
+ 'encoding' => 'utf8',
+ 'timezone' => 'UTC',
+ 'flags' => [],
+ 'cacheMetadata' => true,
+ 'log' => false,
+
+ /**
+ * Set identifier quoting to true if you are using reserved words or
+ * special characters in your table or column names. Enabling this
+ * setting will result in queries built using the Query Builder having
+ * identifiers quoted when creating SQL. It should be noted that this
+ * decreases performance because each query needs to be traversed and
+ * manipulated before being executed.
+ */
+ 'quoteIdentifiers' => false,
+
+ /**
+ * During development, if using MySQL < 5.6, uncommenting the
+ * following line could boost the speed at which schema metadata is
+ * fetched from the database. It can also be set directly with the
+ * mysql configuration directive 'innodb_stats_on_metadata = 0'
+ * which is the recommended value in production environments
+ */
+ //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
+
+ 'url' => env('DATABASE_URL', null),
+ ],
+
+ /**
+ * The test connection is used during the test suite.
+ */
+ 'test' => [
+ 'className' => 'Cake\Database\Connection',
+ 'driver' => 'Cake\Database\Driver\Mysql',
+ 'persistent' => false,
+ 'host' => 'localhost',
+ //'port' => 'non_standard_port_number',
+ 'username' => 'my_app',
+ 'password' => 'secret',
+ 'database' => 'test_myapp',
+ 'encoding' => 'utf8',
+ 'timezone' => 'UTC',
+ 'cacheMetadata' => true,
+ 'quoteIdentifiers' => false,
+ 'log' => false,
+ //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
+ 'url' => env('DATABASE_TEST_URL', null),
+ ],
+ ],
+
+ /**
+ * Configures logging options
+ */
+ 'Log' => [
+ 'debug' => [
+ 'className' => 'Cake\Log\Engine\FileLog',
+ 'path' => LOGS,
+ 'file' => 'debug',
+ 'levels' => ['notice', 'info', 'debug'],
+ 'url' => env('LOG_DEBUG_URL', null),
+ ],
+ 'error' => [
+ 'className' => 'Cake\Log\Engine\FileLog',
+ 'path' => LOGS,
+ 'file' => 'error',
+ 'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
+ 'url' => env('LOG_ERROR_URL', null),
+ ],
+ ],
+
+ /**
+ * Session configuration.
+ *
+ * Contains an array of settings to use for session configuration. The
+ * `defaults` key is used to define a default preset to use for sessions, any
+ * settings declared here will override the settings of the default config.
+ *
+ * ## Options
+ *
+ * - `cookie` - The name of the cookie to use. Defaults to 'CAKEPHP'.
+ * - `cookiePath` - The url path for which session cookie is set. Maps to the
+ * `session.cookie_path` php.ini config. Defaults to base path of app.
+ * - `timeout` - The time in minutes the session should be valid for.
+ * Pass 0 to disable checking timeout.
+ * Please note that php.ini's session.gc_maxlifetime must be equal to or greater
+ * than the largest Session['timeout'] in all served websites for it to have the
+ * desired effect.
+ * - `defaults` - The default configuration set to use as a basis for your session.
+ * There are four built-in options: php, cake, cache, database.
+ * - `handler` - Can be used to enable a custom session handler. Expects an
+ * array with at least the `engine` key, being the name of the Session engine
+ * class to use for managing the session. CakePHP bundles the `CacheSession`
+ * and `DatabaseSession` engines.
+ * - `ini` - An associative array of additional ini values to set.
+ *
+ * The built-in `defaults` options are:
+ *
+ * - 'php' - Uses settings defined in your php.ini.
+ * - 'cake' - Saves session files in CakePHP's /tmp directory.
+ * - 'database' - Uses CakePHP's database sessions.
+ * - 'cache' - Use the Cache class to save sessions.
+ *
+ * To define a custom session handler, save it at src/Network/Session/.php.
+ * Make sure the class implements PHP's `SessionHandlerInterface` and set
+ * Session.handler to
+ *
+ * To use database sessions, load the SQL file located at config/Schema/sessions.sql
+ */
+ 'Session' => [
+ 'defaults' => 'php',
+ ],
+];
diff --git a/production/example_apps/shared_calendar/config/bootstrap.php b/production/example_apps/shared_calendar/config/bootstrap.php
new file mode 100644
index 00000000..44e68fc8
--- /dev/null
+++ b/production/example_apps/shared_calendar/config/bootstrap.php
@@ -0,0 +1,244 @@
+getMessage() . "\n");
+}
+
+/*
+ * Load an environment local configuration file.
+ * You can use a file like app_local.php to provide local overrides to your
+ * shared configuration.
+ */
+//Configure::load('app_local', 'default');
+
+/*
+ * When debug = true the metadata cache should only last
+ * for a short time.
+ */
+if (Configure::read('debug')) {
+ Configure::write('Cache._cake_model_.duration', '+2 minutes');
+ Configure::write('Cache._cake_core_.duration', '+2 minutes');
+}
+
+/*
+ * Set server timezone to UTC. You can change it to another timezone of your
+ * choice but using UTC makes time calculations / conversions easier.
+ */
+date_default_timezone_set('UTC');
+
+/*
+ * Configure the mbstring extension to use the correct encoding.
+ */
+mb_internal_encoding(Configure::read('App.encoding'));
+
+/*
+ * Set the default locale. This controls how dates, number and currency is
+ * formatted and sets the default language to use for translations.
+ */
+ini_set('intl.default_locale', Configure::read('App.defaultLocale'));
+
+/*
+ * Register application error and exception handlers.
+ */
+$isCli = PHP_SAPI === 'cli';
+if ($isCli) {
+ (new ConsoleErrorHandler(Configure::read('Error')))->register();
+} else {
+ (new ErrorHandler(Configure::read('Error')))->register();
+}
+
+/*
+ * Include the CLI bootstrap overrides.
+ */
+if ($isCli) {
+ require __DIR__ . '/bootstrap_cli.php';
+}
+
+/*
+ * Set the full base URL.
+ * This URL is used as the base of all absolute links.
+ *
+ * If you define fullBaseUrl in your config file you can remove this.
+ */
+if (!Configure::read('App.fullBaseUrl')) {
+ $s = null;
+ if (env('HTTPS')) {
+ $s = 's';
+ }
+
+ $httpHost = env('HTTP_HOST');
+ if (isset($httpHost)) {
+ Configure::write('App.fullBaseUrl', 'http' . $s . '://' . $httpHost);
+ }
+ unset($httpHost, $s);
+}
+
+Cache::setConfig(Configure::consume('Cache'));
+ConnectionManager::setConfig(Configure::consume('Datasources'));
+Email::setConfigTransport(Configure::consume('EmailTransport'));
+Email::setConfig(Configure::consume('Email'));
+Log::setConfig(Configure::consume('Log'));
+Security::salt(Configure::consume('Security.salt'));
+
+/*
+ * The default crypto extension in 3.0 is OpenSSL.
+ * If you are migrating from 2.x uncomment this code to
+ * use a more compatible Mcrypt based implementation
+ */
+//Security::engine(new \Cake\Utility\Crypto\Mcrypt());
+
+/*
+ * Setup detectors for mobile and tablet.
+ */
+Request::addDetector('mobile', function ($request) {
+ $detector = new \Detection\MobileDetect();
+
+ return $detector->isMobile();
+});
+Request::addDetector('tablet', function ($request) {
+ $detector = new \Detection\MobileDetect();
+
+ return $detector->isTablet();
+});
+
+/*
+ * Enable immutable time objects in the ORM.
+ *
+ * You can enable default locale format parsing by adding calls
+ * to `useLocaleParser()`. This enables the automatic conversion of
+ * locale specific date formats. For details see
+ * @link http://book.cakephp.org/3.0/en/core-libraries/internationalization-and-localization.html#parsing-localized-datetime-data
+ */
+Type::build('time')
+ ->useImmutable();
+Type::build('date')
+ ->useImmutable();
+Type::build('datetime')
+ ->useImmutable();
+Type::build('timestamp')
+ ->useImmutable();
+
+/*
+ * Custom Inflector rules, can be set to correctly pluralize or singularize
+ * table, model, controller names or whatever other string is passed to the
+ * inflection functions.
+ */
+//Inflector::rules('plural', ['/^(inflect)or$/i' => '\1ables']);
+//Inflector::rules('irregular', ['red' => 'redlings']);
+//Inflector::rules('uninflected', ['dontinflectme']);
+//Inflector::rules('transliteration', ['/Ã¥/' => 'aa']);
+
+/*
+ * Plugins need to be loaded manually, you can either load them one by one or all of them in a single call
+ * Uncomment one of the lines below, as you need. make sure you read the documentation on Plugin to use more
+ * advanced ways of loading plugins
+ *
+ * Plugin::loadAll(); // Loads all plugins at once
+ * Plugin::load('Migrations'); //Loads a single plugin named Migrations
+ *
+ */
+
+/*
+ * Only try to load DebugKit in development mode
+ * Debug Kit should not be installed on a production system
+ */
+if (Configure::read('debug')) {
+ Plugin::load('DebugKit', ['bootstrap' => true]);
+}
+
+// added for cache key construction from array using table model.
+// hmmm: could go into a trait or some other reusable asset?
+function bootMultiImplode($glue, $pieces) {
+ $string = '';
+ if (is_array ( $pieces )) {
+ reset ( $pieces );
+ while ( list ( $key, $value ) = each ( $pieces ) ) {
+ if (is_numeric ( $key )) {
+ $string .= $glue . bootMultiImplode ( $glue, $value );
+ } else {
+ // add string keys to string
+ $string .= $glue . $key . $glue . bootMultiImplode ( $glue, $value );
+ }
+ }
+ } else {
+
+ return $pieces;
+ }
+
+ return trim($string, $glue);
+}
diff --git a/production/example_apps/shared_calendar/config/bootstrap_cli.php b/production/example_apps/shared_calendar/config/bootstrap_cli.php
new file mode 100644
index 00000000..f822a557
--- /dev/null
+++ b/production/example_apps/shared_calendar/config/bootstrap_cli.php
@@ -0,0 +1,38 @@
+connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
+
+
+ //CALCODE:
+ /*
+ * make a more standard re-entry point for the google oauth process. this allows us to use
+ * the top level path for google_login in our oauth credential, rather than worrying about the
+ * specific controller that implements it.
+ */
+ $routes->connect('/google_oauth', [ 'controller'=>'authorizer', 'action' => 'google_login']);
+
+
+ /**
+ * ...and connect the rest of 'Pages' controller's URLs.
+ */
+ $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
+
+ /**
+ * Connect catchall routes for all controllers.
+ *
+ * Using the argument `DashedRoute`, the `fallbacks` method is a shortcut for
+ * `$routes->connect('/:controller', ['action' => 'index'], ['routeClass' => 'DashedRoute']);`
+ * `$routes->connect('/:controller/:action/*', [], ['routeClass' => 'DashedRoute']);`
+ *
+ * Any route class can be used with this method, such as:
+ * - DashedRoute
+ * - InflectedRoute
+ * - Route
+ * - Or your own route class
+ *
+ * You can remove these routes once you've connected the
+ * routes you want in your application.
+ */
+ $routes->fallbacks(DashedRoute::class);
+});
+
+/**
+ * Load all plugin routes. See the Plugin documentation on
+ * how to customize the loading of plugin routes.
+ */
+Plugin::routes();
diff --git a/production/example_apps/shared_calendar/config/schema/i18n.sql b/production/example_apps/shared_calendar/config/schema/i18n.sql
new file mode 100644
index 00000000..47cf171d
--- /dev/null
+++ b/production/example_apps/shared_calendar/config/schema/i18n.sql
@@ -0,0 +1,18 @@
+# Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+#
+# Licensed under The MIT License
+# For full copyright and license information, please see the LICENSE.txt
+# Redistributions of files must retain the above copyright notice.
+# MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+CREATE TABLE i18n (
+ id int NOT NULL auto_increment,
+ locale varchar(6) NOT NULL,
+ model varchar(255) NOT NULL,
+ foreign_key int(10) NOT NULL,
+ field varchar(255) NOT NULL,
+ content text,
+ PRIMARY KEY (id),
+ UNIQUE INDEX I18N_LOCALE_FIELD(locale, model, foreign_key, field),
+ INDEX I18N_FIELD(model, foreign_key, field)
+);
diff --git a/production/example_apps/shared_calendar/config/schema/sessions.sql b/production/example_apps/shared_calendar/config/schema/sessions.sql
new file mode 100644
index 00000000..b5a5276b
--- /dev/null
+++ b/production/example_apps/shared_calendar/config/schema/sessions.sql
@@ -0,0 +1,13 @@
+# Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+#
+# Licensed under The MIT License
+# For full copyright and license information, please see the LICENSE.txt
+# Redistributions of files must retain the above copyright notice.
+# MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+CREATE TABLE sessions (
+ id char(40) NOT NULL,
+ data text,
+ expires INT(11) NOT NULL,
+ PRIMARY KEY (id)
+);
diff --git a/production/example_apps/shared_calendar/docs/google_apis_and_credentials.odt b/production/example_apps/shared_calendar/docs/google_apis_and_credentials.odt
new file mode 100644
index 00000000..77ba9a00
Binary files /dev/null and b/production/example_apps/shared_calendar/docs/google_apis_and_credentials.odt differ
diff --git a/production/example_apps/shared_calendar/docs/google_apis_and_credentials.pdf b/production/example_apps/shared_calendar/docs/google_apis_and_credentials.pdf
new file mode 100644
index 00000000..850665ec
Binary files /dev/null and b/production/example_apps/shared_calendar/docs/google_apis_and_credentials.pdf differ
diff --git a/production/example_apps/shared_calendar/docs/readme.txt b/production/example_apps/shared_calendar/docs/readme.txt
new file mode 100644
index 00000000..4da1fd19
--- /dev/null
+++ b/production/example_apps/shared_calendar/docs/readme.txt
@@ -0,0 +1,7 @@
+
+
+note:
+these versions are outdated and deprecated.
+
+the new document is available at:
+https://feistymeow.org/feisty_meow/documentation/google_apis/google_apis_and_credentials.pdf
diff --git a/production/example_apps/shared_calendar/index.php b/production/example_apps/shared_calendar/index.php
new file mode 100644
index 00000000..fc5e39cc
--- /dev/null
+++ b/production/example_apps/shared_calendar/index.php
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+ ./tests/TestCase
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ./src/
+ ./plugins/*/src/
+
+
+
diff --git a/production/example_apps/shared_calendar/plugins/empty b/production/example_apps/shared_calendar/plugins/empty
new file mode 100644
index 00000000..e69de29b
diff --git a/production/example_apps/shared_calendar/scripts/launch_local_cake.sh b/production/example_apps/shared_calendar/scripts/launch_local_cake.sh
new file mode 100644
index 00000000..6769f974
--- /dev/null
+++ b/production/example_apps/shared_calendar/scripts/launch_local_cake.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+THIS_FOLDER="$( \cd "$(\dirname "$0")" && /bin/pwd )"
+pushd $THIS_FOLDER
+
+# does this help?
+export DEBUG=true
+
+./bin/cake server -p 8766
+
+popd
+
+
diff --git a/production/example_apps/shared_calendar/scripts/launch_serene_cake.sh b/production/example_apps/shared_calendar/scripts/launch_serene_cake.sh
new file mode 100644
index 00000000..a7ca15f5
--- /dev/null
+++ b/production/example_apps/shared_calendar/scripts/launch_serene_cake.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+THIS_FOLDER="$( \cd "$(\dirname "$0")" && /bin/pwd )"
+pushd $THIS_FOLDER
+
+# does this help?
+export DEBUG=true
+
+./bin/cake server -H feistymeow.com -p 12739
+
+popd
+
+
diff --git a/production/example_apps/shared_calendar/src/Application.php b/production/example_apps/shared_calendar/src/Application.php
new file mode 100644
index 00000000..9c5999b8
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Application.php
@@ -0,0 +1,52 @@
+add(ErrorHandlerMiddleware::class)
+
+ // Handle plugin/theme assets like CakePHP normally does.
+ ->add(AssetMiddleware::class)
+
+ // Apply routing
+ ->add(RoutingMiddleware::class);
+
+ return $middleware;
+ }
+}
diff --git a/production/example_apps/shared_calendar/src/Console/Installer.php b/production/example_apps/shared_calendar/src/Console/Installer.php
new file mode 100644
index 00000000..0756096c
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Console/Installer.php
@@ -0,0 +1,195 @@
+getIO();
+
+ $rootDir = dirname(dirname(__DIR__));
+
+ static::createAppConfig($rootDir, $io);
+ static::createWritableDirectories($rootDir, $io);
+
+ // ask if the permissions should be changed
+ if ($io->isInteractive()) {
+ $validator = function ($arg) {
+ if (in_array($arg, ['Y', 'y', 'N', 'n'])) {
+ return $arg;
+ }
+ throw new Exception('This is not a valid answer. Please choose Y or n.');
+ };
+ $setFolderPermissions = $io->askAndValidate(
+ 'Set Folder Permissions ? (Default to Y) [Y,n ]? ',
+ $validator,
+ 10,
+ 'Y'
+ );
+
+ if (in_array($setFolderPermissions, ['Y', 'y'])) {
+ static::setFolderPermissions($rootDir, $io);
+ }
+ } else {
+ static::setFolderPermissions($rootDir, $io);
+ }
+
+ static::setSecuritySalt($rootDir, $io);
+
+ if (class_exists('\Cake\Codeception\Console\Installer')) {
+ \Cake\Codeception\Console\Installer::customizeCodeceptionBinary($event);
+ }
+ }
+
+ /**
+ * Create the config/app.php file if it does not exist.
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @return void
+ */
+ public static function createAppConfig($dir, $io)
+ {
+ $appConfig = $dir . '/config/app.php';
+ $defaultConfig = $dir . '/config/app.default.php';
+ if (!file_exists($appConfig)) {
+ copy($defaultConfig, $appConfig);
+ $io->write('Created `config/app.php` file');
+ }
+ }
+
+ /**
+ * Create the `logs` and `tmp` directories.
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @return void
+ */
+ public static function createWritableDirectories($dir, $io)
+ {
+ $paths = [
+ 'logs',
+ 'tmp',
+ 'tmp/cache',
+ 'tmp/cache/models',
+ 'tmp/cache/persistent',
+ 'tmp/cache/views',
+ 'tmp/sessions',
+ 'tmp/tests'
+ ];
+
+ foreach ($paths as $path) {
+ $path = $dir . '/' . $path;
+ if (!file_exists($path)) {
+ mkdir($path);
+ $io->write('Created `' . $path . '` directory');
+ }
+ }
+ }
+
+ /**
+ * Set globally writable permissions on the "tmp" and "logs" directory.
+ *
+ * This is not the most secure default, but it gets people up and running quickly.
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @return void
+ */
+ public static function setFolderPermissions($dir, $io)
+ {
+ // Change the permissions on a path and output the results.
+ $changePerms = function ($path, $perms, $io) {
+ // Get permission bits from stat(2) result.
+ $currentPerms = fileperms($path) & 0777;
+ if (($currentPerms & $perms) == $perms) {
+ return;
+ }
+
+ $res = chmod($path, $currentPerms | $perms);
+ if ($res) {
+ $io->write('Permissions set on ' . $path);
+ } else {
+ $io->write('Failed to set permissions on ' . $path);
+ }
+ };
+
+ $walker = function ($dir, $perms, $io) use (&$walker, $changePerms) {
+ $files = array_diff(scandir($dir), ['.', '..']);
+ foreach ($files as $file) {
+ $path = $dir . '/' . $file;
+
+ if (!is_dir($path)) {
+ continue;
+ }
+
+ $changePerms($path, $perms, $io);
+ $walker($path, $perms, $io);
+ }
+ };
+
+ $worldWritable = bindec('0000000111');
+ $walker($dir . '/tmp', $worldWritable, $io);
+ $changePerms($dir . '/tmp', $worldWritable, $io);
+ $changePerms($dir . '/logs', $worldWritable, $io);
+ }
+
+ /**
+ * Set the security.salt value in the application's config file.
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @return void
+ */
+ public static function setSecuritySalt($dir, $io)
+ {
+ $config = $dir . '/config/app.php';
+ $content = file_get_contents($config);
+
+ $newKey = hash('sha256', Security::randomBytes(64));
+ $content = str_replace('__SALT__', $newKey, $content, $count);
+
+ if ($count == 0) {
+ $io->write('No Security.salt placeholder to replace.');
+
+ return;
+ }
+
+ $result = file_put_contents($config, $content);
+ if ($result) {
+ $io->write('Updated Security.salt value in config/app.php');
+
+ return;
+ }
+ $io->write('Unable to update Security.salt value.');
+ }
+}
diff --git a/production/example_apps/shared_calendar/src/Controller/AppController.php b/production/example_apps/shared_calendar/src/Controller/AppController.php
new file mode 100644
index 00000000..c3e07579
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Controller/AppController.php
@@ -0,0 +1,103 @@
+loadComponent('Security');`
+ *
+ * @return void
+ */
+ public function initialize()
+ {
+ parent::initialize();
+
+ $this->loadComponent('RequestHandler');
+ $this->loadComponent('Flash');
+
+ /*
+ * Enable the following components for recommended CakePHP security settings.
+ * see http://book.cakephp.org/3.0/en/controllers/components/security.html
+ */
+ //$this->loadComponent('Security');
+ //$this->loadComponent('Csrf');
+
+/* not necessarily what we want.
+//CALCODE:
+ $this->loadComponent('Auth', [
+ 'loginAction' => [
+ 'controller' => 'Users',
+ 'action' => 'authorize',
+ ],
+ 'authenticate' => [
+ 'Form' => [
+ 'fields' => [
+ 'username' => 'email',
+ 'password' => 'password'
+ ]
+ ]
+ ],
+ 'authError' => __('You do not have permission to access this page'),
+ 'authorize' => ['Controller'],
+ 'unauthorizedRedirect' => [
+ 'controller' => 'Users',
+ 'action' => 'forbidden'
+ ],
+ 'loginRedirect' => [
+ 'controller' => 'Users',
+ 'action' => 'show_calendar'
+ ],
+ 'logoutRedirect' => [
+ 'controller' => 'Users',
+ 'action' => 'authorize'
+ ]
+ ]);
+
+ $this->Auth->allow(['authorize', 'googleLogin']);
+*/
+ }
+
+ /**
+ * Before render callback.
+ *
+ * @param \Cake\Event\Event $event The beforeRender event.
+ * @return \Cake\Network\Response|null|void
+ */
+ public function beforeRender(Event $event)
+ {
+ if (!array_key_exists('_serialize', $this->viewVars) &&
+ in_array($this->response->type(), ['application/json', 'application/xml'])
+ ) {
+ $this->set('_serialize', true);
+ }
+ }
+}
diff --git a/production/example_apps/shared_calendar/src/Controller/AuthorizerController.php b/production/example_apps/shared_calendar/src/Controller/AuthorizerController.php
new file mode 100644
index 00000000..5ae43869
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Controller/AuthorizerController.php
@@ -0,0 +1,83 @@
+connect('/google_oauth', [ 'controller'=>'authorizer', 'action' => 'google_login']);
+ */
+
+ public function initialize()
+ {
+ parent::initialize();
+ }
+
+ /**
+ * our callback from google oauth that is passed the oauth access token (or an error
+ * if authorization failed).
+ * before redirecting to this URL, one must use the GoogleOauth trait's
+ * setPostAuthorizationURL() and setRequestedScopes() methods to provide session
+ * parameters (since this link is invoked by google later, and they will not be
+ * providing any of this info).
+ */
+ public function googleLogin() {
+ if (session_status() == PHP_SESSION_NONE) {
+ session_start ();
+ }
+
+ // retrieve the scopes out of the session.
+ $scopes = $this->getRequestedScopes();
+ Log::debug('loaded scopes: ' . var_export($scopes, true));
+
+ // use the scopes in a new google client.
+ $client = $this->createGoogleClient ( $scopes );
+
+ // see if we already have the 'code' available from the google side.
+ if (! isset ( $_GET ['code'] )) {
+ // no code, so we need to jump over to google.
+ Log::Debug ( 'creating auth url to redirect to google oauth' );
+ $auth_url = $client->createAuthUrl ();
+ $this->redirect ( $auth_url );
+ } else {
+ // we've got our code, so now we can try to fetch our access token.
+ Log::Debug ( 'access token being actively acquired...' );
+ $client->fetchAccessTokenWithAuthCode ( $_GET ['code'] );
+ // clean out the scopes in session now that we're done with them.
+ $this->dropRequestedScopes();
+
+ // record the new token in our session.
+ $token = $client->getAccessToken ();
+ $this->setLastOAuthToken($token);
+
+ // fabulously bad idea to show this...
+ //Log::debug ( 'got access token: ' . var_export ( $token, true ) );
+
+ // go to the next point in our app where we can handle the newly stored token.
+ $redirect = $this->getPostAuthorizationURL();
+ if (! $redirect) {
+ // jump home if they registered no continuation. this is a serious error in flow.
+ $redirect = 'http://' . $_SERVER ['HTTP_HOST'] . '/';
+ Log::debug('failure to find the redirection location for our app after successful oauth');
+ }
+ $this->redirect ( $redirect );
+ }
+ }
+
+}
diff --git a/production/example_apps/shared_calendar/src/Controller/ErrorController.php b/production/example_apps/shared_calendar/src/Controller/ErrorController.php
new file mode 100644
index 00000000..cf0ebd5b
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Controller/ErrorController.php
@@ -0,0 +1,68 @@
+loadComponent('RequestHandler');
+ }
+
+ /**
+ * beforeFilter callback.
+ *
+ * @param \Cake\Event\Event $event Event.
+ * @return \Cake\Network\Response|null|void
+ */
+ public function beforeFilter(Event $event)
+ {
+ }
+
+ /**
+ * beforeRender callback.
+ *
+ * @param \Cake\Event\Event $event Event.
+ * @return \Cake\Network\Response|null|void
+ */
+ public function beforeRender(Event $event)
+ {
+ parent::beforeRender($event);
+
+ $this->viewBuilder()->setTemplatePath('Error');
+ }
+
+ /**
+ * afterFilter callback.
+ *
+ * @param \Cake\Event\Event $event Event.
+ * @return \Cake\Network\Response|null|void
+ */
+ public function afterFilter(Event $event)
+ {
+ }
+}
diff --git a/production/example_apps/shared_calendar/src/Controller/PagesController.php b/production/example_apps/shared_calendar/src/Controller/PagesController.php
new file mode 100644
index 00000000..55792c8e
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Controller/PagesController.php
@@ -0,0 +1,69 @@
+redirect('/');
+ }
+ if (in_array('..', $path, true) || in_array('.', $path, true)) {
+ throw new ForbiddenException();
+ }
+ $page = $subpage = null;
+
+ if (!empty($path[0])) {
+ $page = $path[0];
+ }
+ if (!empty($path[1])) {
+ $subpage = $path[1];
+ }
+ $this->set(compact('page', 'subpage'));
+
+ try {
+ $this->render(implode('/', $path));
+ } catch (MissingTemplateException $e) {
+ if (Configure::read('debug')) {
+ throw $e;
+ }
+ throw new NotFoundException();
+ }
+ }
+}
diff --git a/production/example_apps/shared_calendar/src/Controller/UsersController.php b/production/example_apps/shared_calendar/src/Controller/UsersController.php
new file mode 100644
index 00000000..53a91274
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Controller/UsersController.php
@@ -0,0 +1,309 @@
+name) .'-';
+ // av_ prefix so we can delete all files generated in cache/sql/ except for .gitignore
+
+ $locales = Configure::read('avenger.locales');
+ if(!empty($locales)) {
+ $prefix .= Configure::read('Config.language') .'-';
+ }
+ Log::debug('cache prefix will be: ' . $prefix);
+
+ // configure a file cache for storing calendar data.
+ Cache::config('calendar_cache', [
+ 'className' => 'File',
+ 'prefix' => $prefix,
+ 'duration' => '+2 hours',
+ ]);
+ }
+
+ /**
+ * Index method
+ *
+ * @return \Cake\Http\Response|void
+ */
+ public function index() {
+ $users = $this->paginate ( $this->Users );
+
+ $this->set ( compact ( 'users' ) );
+ $this->set ( '_serialize', [
+ 'users'
+ ] );
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id
+ * User id.
+ * @return \Cake\Http\Response|void
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null) {
+ $user = $this->Users->get ( $id, [
+ 'contain' => [ ]
+ ] );
+
+ $this->set ( 'user', $user );
+ $this->set ( '_serialize', [
+ 'user'
+ ] );
+ }
+
+ /**
+ * prepares the google oauth process by stuffing required information into the session.
+ * we'll then redirect over to the authorizer controller to get the work done.
+ */
+ public function requestGoogleOauth($id)
+ {
+ //hmmm: if no id, bail out to error page.
+
+ Log::debug("into requestGoogleOauth...");
+
+ if (session_status() == PHP_SESSION_NONE) {
+ session_start ();
+ }
+
+ // add the post-authorization redirect url for the auth controller.
+ $this->setPostAuthorizationURL('/users/callback/' . $id);
+ // set the scopes that we want to request.
+ $this->setRequestedScopes([Google_Service_Calendar::CALENDAR_READONLY]);
+
+// //temp
+// $urlcheck = $_SESSION[$this->POST_AUTHORIZATION_JUMP()];
+// Log::debug('callback url found in session: ' . var_export($urlcheck, true));
+// $scopecheck = $_SESSION[$this->POST_AUTHORIZATION_JUMP()];
+// Log::debug('scopes found in session: ' . var_export($scopecheck , true));
+
+ Log::debug("before redirecting from requestGoogleOauth...");
+
+ // get the user to authorize us, and subsequently we'll record the access token.
+ $this->redirect ( [
+ 'controller' => 'Authorizer',
+ 'action' => 'googleLogin'
+ ] );
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add() {
+ session_start ();
+
+ $user = $this->Users->newEntity ();
+ if ($this->request->is ( 'post' )) {
+ $user = $this->Users->patchEntity ( $user, $this->request->getData () );
+ if ($this->Users->save ( $user )) {
+ $this->Flash->success ( __ ( 'The user has been saved.' ) );
+ // now get the oauth mojo working...
+ $this->requestGoogleOauth($user->id);
+ return;
+ }
+ $this->Flash->error ( __ ( 'The user could not be saved. Please, try again.' ) );
+ }
+ $this->set ( compact ( 'user' ) );
+ $this->set ( '_serialize', [
+ 'user'
+ ] );
+ }
+
+ /**
+ * a whole bunch of redirection happens when the oauth process starts, but this is our
+ * return point for this application after all that's done. this is registered as the
+ * post authorization redirection location, and should have a valid access token available
+ * for the specified user.
+ *
+ * @param unknown $id
+ */
+ public function callback($id) {
+ Log::debug ( 'got to the users controller callback' );
+
+ $user = $this->Users->get ( $id );
+
+ // retrieve the access token, which is hopefully totally valid now...
+ $token = $this->getLastOAuthToken ();
+ if ($token) {
+ $user->token = json_encode ( $token );
+ $this->Users->save ( $user );
+ }
+ $this->set ( 'user', $user );
+ $this->set ( '_serialize', [
+ 'user'
+ ] );
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id
+ * User id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Network\Exception\NotFoundException When record not found.
+ */
+ public function edit($id = null) {
+ $user = $this->Users->get ( $id, [
+ 'contain' => [ ]
+ ] );
+ if ($this->request->is ( [
+ 'patch',
+ 'post',
+ 'put'
+ ] )) {
+ $user = $this->Users->patchEntity ( $user, $this->request->getData () );
+ if ($this->Users->save ( $user )) {
+ $this->Flash->success ( __ ( 'The user has been saved.' ) );
+
+ return $this->redirect ( [
+ 'action' => 'index'
+ ] );
+ }
+ $this->Flash->error ( __ ( 'The user could not be saved. Please, try again.' ) );
+ }
+ $this->set ( compact ( 'user' ) );
+ $this->set ( '_serialize', [
+ 'user'
+ ] );
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id
+ * User id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null) {
+ $this->request->allowMethod ( [
+ 'post',
+ 'delete'
+ ] );
+ $user = $this->Users->get ( $id );
+ if ($this->Users->delete ( $user )) {
+ $this->Flash->success ( __ ( 'The user has been deleted.' ) );
+ } else {
+ $this->Flash->error ( __ ( 'The user could not be deleted. Please, try again.' ) );
+ }
+
+ return $this->redirect ( [
+ 'action' => 'index'
+ ] );
+ }
+
+ /**
+ * shows the upcoming appointments on the calendar.
+ */
+ public function showCalendar($id) {
+ Log::debug ( 'into the show calendar method' );
+
+ session_start ();
+
+ $user = $this->Users->get ( $id );
+
+ if (! $user->token) {
+ // apparently we need to re-acquire this for the user.
+ // NOTE: in real app, this will be a failure and a place to send email.
+ $this->requestGoogleOauth($id);
+ return;
+ }
+ $accessToken = json_decode ( $user->token, true );
+
+ $client = $this->createGoogleClient( [
+ Google_Service_Calendar::CALENDAR_READONLY
+ ] );
+
+ $client->setAccessToken ( $accessToken );
+
+ // make sure that the token is still valid, and if not, refresh it.
+ $newToken = $this->freshenTokenInClient($client);
+ if ($newToken) {
+ // save the new token in the db again.
+ $accessToken = $newToken;
+ $user->token = json_encode ( $accessToken );
+ $this->Users->save ( $user );
+ }
+
+ // start from beginning of today.
+ $start = new DateTime();
+ $start->setTime(0, 0);
+
+ // see if we have a cached calendar available.
+ $cacheKey = 'cal-' . $id . '--' . $start->format('Y-m-d_H-i-s');
+ $calEvents = Cache::read($cacheKey, 'calendar_cache');
+ if ($calEvents) {
+ Log::debug('found cached events for calendar.');
+ } else {
+ // an unfortunate kludge below; if we delay calling the google listEvents method,
+ // we can get an exception that requires reauthorization. but the view cell has no
+ // way to get to the controller to start the authorization process again, so we do
+ // it here instead.
+ $calEvents = GoogleCalendarCell::prepareCalendar($client, $start);
+ Log::debug('contacted google to get events for calendar.');
+ if (! $calEvents) {
+ // we have lost our authorization somehow.
+ $this->requestGoogleOauth($id);
+ return;
+ }
+ Cache::write($cacheKey, $calEvents, 'calendar_cache');
+ }
+ $this->set('calEvents', $calEvents);
+ $this->set ( '_serialize', [
+ 'calEvents'
+ ] );
+ }
+
+ /**
+ * revokes authorization granted by google for current token.
+ */
+ public function revoke($id) {
+ $user = $this->Users->get ( $id );
+
+ $this->set ( 'user', $user );
+ $this->set ( '_serialize', [
+ 'user'
+ ] );
+
+ $token = json_decode ( $user->token, true );
+
+ Log::debug ( 'revoking token: ' . var_export ( $token, true ) );
+
+ $this->revokeToken($token);
+ Log::debug ( 'after revoking the access token.' );
+
+ // update with no token.
+ $user->token = null;
+ $this->Users->save ( $user );
+ }
+
+
+}
diff --git a/production/example_apps/shared_calendar/src/Model/Behavior/empty b/production/example_apps/shared_calendar/src/Model/Behavior/empty
new file mode 100644
index 00000000..e69de29b
diff --git a/production/example_apps/shared_calendar/src/Model/Entity/User.php b/production/example_apps/shared_calendar/src/Model/Entity/User.php
new file mode 100644
index 00000000..316bf708
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Model/Entity/User.php
@@ -0,0 +1,40 @@
+ true,
+ 'id' => false
+ ];
+
+ /**
+ * Fields that are excluded from JSON versions of the entity.
+ *
+ * @var array
+ */
+ protected $_hidden = [
+ 'token'
+ ];
+}
diff --git a/production/example_apps/shared_calendar/src/Model/Table/UsersTable.php b/production/example_apps/shared_calendar/src/Model/Table/UsersTable.php
new file mode 100644
index 00000000..8f7040df
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Model/Table/UsersTable.php
@@ -0,0 +1,63 @@
+setTable('users');
+ $this->setDisplayField('name');
+ $this->setPrimaryKey('id');
+
+ $this->addBehavior('Timestamp');
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmpty('id', 'create');
+
+ $validator
+ ->requirePresence('name', 'create')
+ ->notEmpty('name');
+
+ $validator
+ ->allowEmpty('token');
+
+ return $validator;
+ }
+}
diff --git a/production/example_apps/shared_calendar/src/Shell/ConsoleShell.php b/production/example_apps/shared_calendar/src/Shell/ConsoleShell.php
new file mode 100644
index 00000000..c84bd97a
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Shell/ConsoleShell.php
@@ -0,0 +1,81 @@
+err('Unable to load Psy\Shell. ');
+ $this->err('');
+ $this->err('Make sure you have installed psysh as a dependency,');
+ $this->err('and that Psy\Shell is registered in your autoloader.');
+ $this->err('');
+ $this->err('If you are using composer run');
+ $this->err('');
+ $this->err('$ php composer.phar require --dev psy/psysh ');
+ $this->err('');
+
+ return self::CODE_ERROR;
+ }
+
+ $this->out("You can exit with `CTRL-C` or `exit` ");
+ $this->out('');
+
+ Log::drop('debug');
+ Log::drop('error');
+ $this->_io->setLoggers(false);
+ restore_error_handler();
+ restore_exception_handler();
+
+ $psy = new PsyShell();
+ $psy->run();
+ }
+
+ /**
+ * Display help for this console.
+ *
+ * @return \Cake\Console\ConsoleOptionParser
+ */
+ public function getOptionParser()
+ {
+ $parser = new ConsoleOptionParser('console');
+ $parser->setDescription(
+ 'This shell provides a REPL that you can use to interact ' .
+ 'with your application in an interactive fashion. You can use ' .
+ 'it to run adhoc queries with your models, or experiment ' .
+ 'and explore the features of CakePHP and your application.' .
+ "\n\n" .
+ 'You will need to have psysh installed for this Shell to work.'
+ );
+
+ return $parser;
+ }
+}
diff --git a/production/example_apps/shared_calendar/src/Template/Cell/GoogleCalendar/display.ctp b/production/example_apps/shared_calendar/src/Template/Cell/GoogleCalendar/display.ctp
new file mode 100644
index 00000000..a7d812fe
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Cell/GoogleCalendar/display.ctp
@@ -0,0 +1,27 @@
+
+
+
+
+ $events): ?>
+
+ = __(h($day)) ?>
+
+
+
+
+ = h($appt['info'] . ' at ' . $appt['start']); ?>
+
+
+
+
+
+
+
+
+
diff --git a/production/example_apps/shared_calendar/src/Template/Element/Flash/default.ctp b/production/example_apps/shared_calendar/src/Template/Element/Flash/default.ctp
new file mode 100644
index 00000000..736b27db
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Element/Flash/default.ctp
@@ -0,0 +1,10 @@
+
+= $message ?>
diff --git a/production/example_apps/shared_calendar/src/Template/Element/Flash/error.ctp b/production/example_apps/shared_calendar/src/Template/Element/Flash/error.ctp
new file mode 100644
index 00000000..e7c4af10
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Element/Flash/error.ctp
@@ -0,0 +1,6 @@
+
+= $message ?>
diff --git a/production/example_apps/shared_calendar/src/Template/Element/Flash/success.ctp b/production/example_apps/shared_calendar/src/Template/Element/Flash/success.ctp
new file mode 100644
index 00000000..becd5a1f
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Element/Flash/success.ctp
@@ -0,0 +1,6 @@
+
+= $message ?>
diff --git a/production/example_apps/shared_calendar/src/Template/Email/html/default.ctp b/production/example_apps/shared_calendar/src/Template/Email/html/default.ctp
new file mode 100644
index 00000000..386674a1
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Email/html/default.ctp
@@ -0,0 +1,22 @@
+
+ ' . $line . "
\n";
+endforeach;
+?>
diff --git a/production/example_apps/shared_calendar/src/Template/Email/text/default.ctp b/production/example_apps/shared_calendar/src/Template/Email/text/default.ctp
new file mode 100644
index 00000000..704b46f0
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Email/text/default.ctp
@@ -0,0 +1,16 @@
+
+= $content ?>
diff --git a/production/example_apps/shared_calendar/src/Template/Error/error400.ctp b/production/example_apps/shared_calendar/src/Template/Error/error400.ctp
new file mode 100644
index 00000000..2aebac6c
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Error/error400.ctp
@@ -0,0 +1,38 @@
+layout = 'error';
+
+if (Configure::read('debug')):
+ $this->layout = 'dev_error';
+
+ $this->assign('title', $message);
+ $this->assign('templateName', 'error400.ctp');
+
+ $this->start('file');
+?>
+queryString)) : ?>
+
+ SQL Query:
+ = h($error->queryString) ?>
+
+
+params)) : ?>
+ SQL Query Params:
+ params) ?>
+
+= $this->element('auto_table_warning') ?>
+end();
+endif;
+?>
+= h($message) ?>
+
+ = __d('cake', 'Error') ?>:
+ = __d('cake', 'The requested address {0} was not found on this server.', "'{$url}' ") ?>
+
diff --git a/production/example_apps/shared_calendar/src/Template/Error/error500.ctp b/production/example_apps/shared_calendar/src/Template/Error/error500.ctp
new file mode 100644
index 00000000..d8014f84
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Error/error500.ctp
@@ -0,0 +1,43 @@
+layout = 'error';
+
+if (Configure::read('debug')):
+ $this->layout = 'dev_error';
+
+ $this->assign('title', $message);
+ $this->assign('templateName', 'error500.ctp');
+
+ $this->start('file');
+?>
+queryString)) : ?>
+
+ SQL Query:
+ = h($error->queryString) ?>
+
+
+params)) : ?>
+ SQL Query Params:
+ params) ?>
+
+
+ Error in:
+ = sprintf('%s, line %s', str_replace(ROOT, 'ROOT', $error->getFile()), $error->getLine()) ?>
+
+element('auto_table_warning');
+
+ if (extension_loaded('xdebug')):
+ xdebug_print_function_stack();
+ endif;
+
+ $this->end();
+endif;
+?>
+= __d('cake', 'An Internal Error Has Occurred') ?>
+
+ = __d('cake', 'Error') ?>:
+ = h($message) ?>
+
diff --git a/production/example_apps/shared_calendar/src/Template/Layout/Email/html/default.ctp b/production/example_apps/shared_calendar/src/Template/Layout/Email/html/default.ctp
new file mode 100644
index 00000000..2b439700
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Layout/Email/html/default.ctp
@@ -0,0 +1,24 @@
+
+
+
+
+ = $this->fetch('title') ?>
+
+
+ = $this->fetch('content') ?>
+
+
diff --git a/production/example_apps/shared_calendar/src/Template/Layout/Email/text/default.ctp b/production/example_apps/shared_calendar/src/Template/Layout/Email/text/default.ctp
new file mode 100644
index 00000000..871dcfb4
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Layout/Email/text/default.ctp
@@ -0,0 +1,16 @@
+
+= $this->fetch('content') ?>
diff --git a/production/example_apps/shared_calendar/src/Template/Layout/ajax.ctp b/production/example_apps/shared_calendar/src/Template/Layout/ajax.ctp
new file mode 100644
index 00000000..871dcfb4
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Layout/ajax.ctp
@@ -0,0 +1,16 @@
+
+= $this->fetch('content') ?>
diff --git a/production/example_apps/shared_calendar/src/Template/Layout/default.ctp b/production/example_apps/shared_calendar/src/Template/Layout/default.ctp
new file mode 100644
index 00000000..8988302a
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Layout/default.ctp
@@ -0,0 +1,57 @@
+
+
+
+
+ = $this->Html->charset() ?>
+
+
+ = $cakeDescription ?>:
+ = $this->fetch('title') ?>
+
+ = $this->Html->meta('icon') ?>
+
+ = $this->Html->css('base.css') ?>
+ = $this->Html->css('cake.css') ?>
+
+ = $this->fetch('meta') ?>
+ = $this->fetch('css') ?>
+ = $this->fetch('script') ?>
+
+
+
+
+
+
+ = $this->Flash->render() ?>
+
+ = $this->fetch('content') ?>
+
+
+
+
diff --git a/production/example_apps/shared_calendar/src/Template/Layout/error.ctp b/production/example_apps/shared_calendar/src/Template/Layout/error.ctp
new file mode 100644
index 00000000..5304ec43
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Layout/error.ctp
@@ -0,0 +1,47 @@
+
+
+
+
+ = $this->Html->charset() ?>
+
+ = $this->fetch('title') ?>
+
+ = $this->Html->meta('icon') ?>
+
+ = $this->Html->css('base.css') ?>
+ = $this->Html->css('cake.css') ?>
+
+ = $this->fetch('meta') ?>
+ = $this->fetch('css') ?>
+ = $this->fetch('script') ?>
+
+
+
+
+
+ = $this->Flash->render() ?>
+
+ = $this->fetch('content') ?>
+
+
+
+
+
diff --git a/production/example_apps/shared_calendar/src/Template/Layout/rss/default.ctp b/production/example_apps/shared_calendar/src/Template/Layout/rss/default.ctp
new file mode 100644
index 00000000..5c15a198
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Layout/rss/default.ctp
@@ -0,0 +1,14 @@
+fetch('title');
+endif;
+
+echo $this->Rss->document(
+ $this->Rss->channel(
+ [], $channel, $this->fetch('content')
+ )
+);
+?>
diff --git a/production/example_apps/shared_calendar/src/Template/Pages/home.ctp b/production/example_apps/shared_calendar/src/Template/Pages/home.ctp
new file mode 100644
index 00000000..2bb441ac
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Pages/home.ctp
@@ -0,0 +1,342 @@
+layout = false;
+
+if (! Configure::read ( 'debug' )) :
+ throw new NotFoundException ( 'Please replace src/Template/Pages/home.ctp with your own version.' );
+endif;
+
+$cakeDescription = 'CakePHP: the rapid development PHP framework';
+?>
+
+
+
+ = $this->Html->charset() ?>
+
+
+ = $cakeDescription ?>
+
+
+ = $this->Html->meta('icon') ?>
+ = $this->Html->css('base.css') ?>
+ = $this->Html->css('cake.css') ?>
+ = $this->Html->css('home.css') ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Please be aware that this page will not be shown if you turn off
+ debug mode unless you replace src/Template/Pages/home.ctp with your
+ own version.
+
+
+
+
+
+
+
+
+
Environment
+
+ =')): ?>
+ Your version of PHP is 5.6.0 or higher (detected = PHP_VERSION ?>).
+
+ Your version of PHP is too low. You need PHP 5.6.0 or higher to use CakePHP (detected = PHP_VERSION ?>).
+
+
+
+ Your version of PHP has the
+ mbstring extension loaded.
+
+ Your version of PHP does NOT have
+ the mbstring extension loaded. ;
+
+
+
+ Your version of PHP has the
+ openssl extension loaded.
+
+ Your version of PHP has the
+ mcrypt extension loaded.
+
+ Your version of PHP does NOT have
+ the openssl or mcrypt extension loaded.
+
+
+
+ Your version of PHP has the intl
+ extension loaded.
+
+ Your version of PHP does NOT have
+ the intl extension loaded.
+
+
+
+
+
Filesystem
+
+
+ Your tmp directory is writable.
+
+ Your tmp directory is NOT
+ writable.
+
+
+
+ Your logs directory is writable.
+
+ Your logs directory is NOT
+ writable.
+
+
+
+
+ The = $settings['className'] ?>Engine
+ is being used for core caching. To change the config edit
+ config/app.php
+
+
+ Your cache is NOT working. Please
+ check the settings in config/app.php
+
+
+
+
+
+
+
+
+
Database
+ connect ();
+ } catch ( Exception $connectionError ) {
+ $connected = false;
+ $errorMsg = $connectionError->getMessage ();
+ if (method_exists ( $connectionError, 'getAttributes' )) :
+ $attributes = $connectionError->getAttributes ();
+ if (isset ( $errorMsg ['message'] )) :
+ $errorMsg .= '
' . $attributes ['message'];
+ endif;
+ endif;
+
+
+ }
+ ?>
+
+
+ CakePHP is able to connect to the
+ database.
+
+ CakePHP is NOT able to connect to
+ the database. = $errorMsg ?>
+
+
+
+
+
DebugKit
+
+
+ DebugKit is loaded.
+
+ DebugKit is NOT loaded. You need
+ to either install pdo_sqlite, or define the "debug_kit" connection
+ name.
+
+
+
+
+
+
+
+
+
Editing this Page
+
+ To change the content of this page, edit:
+ src/Template/Pages/home.ctp.
+ You can also add some CSS styles for your
+ pages at: webroot/css/.
+
+
+
+
Getting Started
+
+
+
+
+
+
+
+
+
More about Cake
+
+ CakePHP is a rapid development framework for PHP which uses commonly
+ known design patterns like Front Controller and MVC. Our
+ primary goal is to provide a structured framework that enables PHP
+ users at all levels to rapidly develop robust web applications,
+ without any loss to flexibility.
+
+
+
+
+
+
+
+
P
+
Help and Bug Reports
+
+
+
+
r
+
Docs and Downloads
+
+
+
+
s
+
Training and Certification
+
+
+
+
+
+
diff --git a/production/example_apps/shared_calendar/src/Template/Users/add.ctp b/production/example_apps/shared_calendar/src/Template/Users/add.ctp
new file mode 100644
index 00000000..1b7e2076
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Users/add.ctp
@@ -0,0 +1,23 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('List Users'), ['action' => 'index']) ?>
+
+
+
+ = $this->Form->create($user) ?>
+
+ = __('Add User') ?>
+ Form->control('name');
+// echo $this->Form->control('token');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/production/example_apps/shared_calendar/src/Template/Users/callback.ctp b/production/example_apps/shared_calendar/src/Template/Users/callback.ctp
new file mode 100644
index 00000000..23506e4f
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Users/callback.ctp
@@ -0,0 +1,20 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('List Users'), ['action' => 'index']) ?>
+
+
+
+
+ = h($user->token? 'Authorization successful for ' . $user->name
+ : 'Failed authorization for ' . $user->name ) ?>
+
+
+
+
diff --git a/production/example_apps/shared_calendar/src/Template/Users/edit.ctp b/production/example_apps/shared_calendar/src/Template/Users/edit.ctp
new file mode 100644
index 00000000..880cde87
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Users/edit.ctp
@@ -0,0 +1,29 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Form->postLink(
+ __('Delete'),
+ ['action' => 'delete', $user->id],
+ ['confirm' => __('Are you sure you want to delete # {0}?', $user->id)]
+ )
+ ?>
+ = $this->Html->link(__('List Users'), ['action' => 'index']) ?>
+
+
+
+ = $this->Form->create($user) ?>
+
+ = __('Edit User') ?>
+ Form->control('name');
+ echo $this->Form->control('token');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/production/example_apps/shared_calendar/src/Template/Users/index.ctp b/production/example_apps/shared_calendar/src/Template/Users/index.ctp
new file mode 100644
index 00000000..953e2adf
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Users/index.ctp
@@ -0,0 +1,55 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('New User'), ['action' => 'add']) ?>
+
+
+
+
= __('Users') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('name') ?>
+ = $this->Paginator->sort('token') ?>
+ = $this->Paginator->sort('created') ?>
+ = $this->Paginator->sort('modified') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($user->id) ?>
+ = h($user->name) ?>
+ = h($user->token) ?>
+ = h($user->created) ?>
+ = h($user->modified) ?>
+
+ = $this->Html->link(__('Calendar'), ['action' => 'showCalendar', $user->id]) ?>
+ = $this->Html->link(__('View'), ['action' => 'view', $user->id]) ?>
+
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $user->id], ['confirm' => __('Are you sure you want to delete # {0}?', $user->id)]) ?>
+ = $this->Html->link(__('Revoke'), ['action' => 'revoke', $user->id], ['confirm' => __('Are you *SURE* you want to revoke authorization # {0}? This will totally drop that authorization, which you cannot re-add unless you are the original user that stored it.', $user->id)]) ?>
+
+
+
+
+
+
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/production/example_apps/shared_calendar/src/Template/Users/revoke.ctp b/production/example_apps/shared_calendar/src/Template/Users/revoke.ctp
new file mode 100644
index 00000000..57d2e8aa
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Users/revoke.ctp
@@ -0,0 +1,16 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('List Users'), ['action' => 'index']) ?>
+
+
+
+
= h('Revoked authorization for ' . $user->name) ?>
+
+
diff --git a/production/example_apps/shared_calendar/src/Template/Users/show_calendar.ctp b/production/example_apps/shared_calendar/src/Template/Users/show_calendar.ctp
new file mode 100644
index 00000000..9a60d980
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Users/show_calendar.ctp
@@ -0,0 +1,21 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('List Users'), ['action' => 'index']) ?>
+
+
+
+
upcoming appointments
+
+ cell('GoogleCalendar', [$calEvents]);
+ ?>
+ = $cell ?>
+
+
diff --git a/production/example_apps/shared_calendar/src/Template/Users/view.ctp b/production/example_apps/shared_calendar/src/Template/Users/view.ctp
new file mode 100644
index 00000000..cdfc7085
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Template/Users/view.ctp
@@ -0,0 +1,40 @@
+
+
+
+ = __('Actions') ?>
+
+ = $this->Form->postLink(__('Delete User'), ['action' => 'delete', $user->id], ['confirm' => __('Are you sure you want to delete # {0}?', $user->id)]) ?>
+ = $this->Html->link(__('List Users'), ['action' => 'index']) ?>
+ = $this->Html->link(__('New User'), ['action' => 'add']) ?>
+
+
+
+
= h($user->name) ?>
+
+
+ = __('Name') ?>
+ = h($user->name) ?>
+
+
+ = __('Token') ?>
+ = h($user->token) ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($user->id) ?>
+
+
+ = __('Created') ?>
+ = h($user->created) ?>
+
+
+ = __('Modified') ?>
+ = h($user->modified) ?>
+
+
+
diff --git a/production/example_apps/shared_calendar/src/Traits/GoogleOauthTrait.php b/production/example_apps/shared_calendar/src/Traits/GoogleOauthTrait.php
new file mode 100644
index 00000000..847a2aea
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/Traits/GoogleOauthTrait.php
@@ -0,0 +1,230 @@
+POST_AUTHORIZATION_JUMP()] = $url;
+ }
+
+ /**
+ * retrieves any post authorization url that was registered.
+ * this destroys the item in the session also, so it is available for a single use.
+ */
+ public function getPostAuthorizationURL()
+ {
+ if (session_status() == PHP_SESSION_NONE) {
+ Log::debug('starting session for get post auth url');
+ session_start();
+ }
+ if (isset ( $_SESSION [$this->POST_AUTHORIZATION_JUMP()] ) && $_SESSION [$this->POST_AUTHORIZATION_JUMP()]) {
+ $url = $_SESSION [$this->POST_AUTHORIZATION_JUMP()];
+ Log::debug('loaded url for post auth as: ' . $url);
+ unset($_SESSION[$this->POST_AUTHORIZATION_JUMP()]);
+ return $url;
+ } else {
+ Log::debug('could not find post authorization url in session!');
+
+ return null;
+ }
+ }
+
+ /**
+ * before we can request oauth authorization, we need to know the scopes that will be used
+ * by our application. this allows them to be set in the session, where scopes should be an
+ * array of valid scope names (defined by the google oauth API).
+ */
+ public function setRequestedScopes($scopes)
+ {
+ if (session_status() == PHP_SESSION_NONE) {
+ Log::debug('starting session for set req scopes');
+ session_start();
+ }
+ $_SESSION [$this->OAUTH_SCOPES_REQUESTED()] = $scopes;
+ }
+
+ /**
+ * gets the array of scopes out of the session for use by the next oauth call.
+ * this will NOT destroy the scopes; that must be done manually with dropRequestedScopes
+ * below, since we need this session item multiple times.
+ */
+ public function getRequestedScopes()
+ {
+ if (session_status() == PHP_SESSION_NONE) {
+ Log::debug('starting session for get req scopes');
+ session_start();
+ }
+ if (isset ( $_SESSION [$this->OAUTH_SCOPES_REQUESTED()] ) && $_SESSION [$this->OAUTH_SCOPES_REQUESTED()]) {
+ $scopes = $_SESSION [$this->OAUTH_SCOPES_REQUESTED()];
+ return $scopes;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * throws the requested scopes out of the session.
+ */
+ public function dropRequestedScopes()
+ {
+ if (session_status() == PHP_SESSION_NONE) {
+ Log::debug('starting session for drop req scopes');
+ session_start();
+ }
+ unset($_SESSION[$this->OAUTH_SCOPES_REQUESTED()]);
+ }
+
+
+ /**
+ * saves the result of oauth authorization, an access token, into the session.
+ */
+ public function setLastOAuthToken($token)
+ {
+ if (session_status() == PHP_SESSION_NONE) {
+ Log::debug('starting session for set last oauth token');
+ session_start();
+ }
+ $_SESSION [$this->STORED_OAUTH_TOKEN()] = $token;
+ }
+
+ /**
+ * retrieves the last stored oauth token. this destroys the item in the session
+ * afterwards, so you get one chance for retrieval of the token.
+ */
+ public function getLastOAuthToken()
+ {
+ if (session_status() == PHP_SESSION_NONE) {
+ Log::debug('starting session for set last oauth token');
+ session_start();
+ }
+ if (isset ( $_SESSION [$this->STORED_OAUTH_TOKEN()] ) && $_SESSION [$this->STORED_OAUTH_TOKEN()]) {
+ $token = $_SESSION [$this->STORED_OAUTH_TOKEN()];
+ unset($_SESSION[$this->STORED_OAUTH_TOKEN()]);
+ return $token;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * sets up and configures the Google client object using a 'client_secret.json' file
+ * stored in the config directory. A scope name or an array of scopes should be passed
+ * in the "scopes" parameter. if the "redirectUri" parameter is not null, then this is set
+ * as the singular redirection URI (which is needed if the client secret has several redirect
+ * URIs listed).
+ */
+ public function createGoogleClient($scopes, $redirectUri = null) {
+ $client = new Google_Client ();
+
+ // see https://developers.google.com/api-client-library/php/auth/web-app for info on creating the secret.
+ $client->setAuthConfig ( 'config/client_secret.json' );
+
+ // use the redirect link if they gave us one.
+ if ($redirectUri) {
+ $client->setRedirectUri ( $redirectUri );
+ }
+
+ // register for offline access, so we don't need user to be logged in.
+ $client->setAccessType ( "offline" );
+ // enable incremental authorization.
+ $client->setIncludeGrantedScopes ( true );
+
+ // add the scope(s) we're interested in here.
+ $client->addScope ( $scopes );
+
+ return $client;
+ }
+
+ /**
+ * *deprecated* creates a google client configured by discrete parameters.
+ *
+ * note: does not free one to use just any redirect url for login; that's set at credential creation time.
+ */
+ public function createGoogleClientUsingParameters($clientId, $clientSecret, $applicationName, $redirectUri, $scopes) {
+ $client = new Google_Client ();
+
+ // see https://developers.google.com/api-client-library/php/auth/web-app for info on creating the secret.
+ $client->setClientId ( $clientId );
+ $client->setClientSecret ( $clientSecret );
+ $client->setApplicationName ( $applicationName );
+ $client->setRedirectUri ( $redirectUri );
+
+ // register for offline access, so we don't need user to be logged in.
+ $client->setAccessType ( "offline" );
+ // enable incremental authorization.
+ $client->setIncludeGrantedScopes ( true );
+
+ // add the scope we're interested in here.
+ $client->addScope ( $scopes);
+
+ return $client;
+ }
+
+ /**
+ * checks whether the google client object's token is still valid. if not, the token is refreshed.
+ * this will only work with tokens that were originally requested for offline access and that possess
+ * the refresh token.
+ * if the refresh was done, the newly revitalized token is returned and must be stored.
+ * if the token is already okay, then null is returned (which avoids tricky comparisons to
+ * determine if an update happened).
+ */
+ public function freshenTokenInClient($client)
+ {
+ if (! $client->isAccessTokenExpired ()) {
+ // no refresh needed.
+ return null;
+ }
+ // currently assuming the new access token also contains the old refresh token.
+ // this has been borne out by results from google.
+ Log::debug ( 'noticed that the access token has expired!' );
+
+ // retrieve a new access token using our refresh token.
+ $refresher = $client->getRefreshToken ();
+ $client->fetchAccessTokenWithRefreshToken ( $refresher );
+ $accessToken = $client->getAccessToken ();
+
+ //bad! do not show this in real app.
+ //Log::debug ( 'got a new access token after refresh: ' . var_export ( $accessToken, true ) );
+
+ // return the new and tasty token.
+ return $accessToken;
+ }
+
+ /**
+ * throws out the specified access token, which means that the app will have to reauthorize
+ * to get another token.
+ */
+ public function revokeToken($token)
+ {
+ $client = new Google_Client ();
+ // apparently the client needs very little setup to perform this if we have the whole token?
+ $client->revokeToken ( $token );
+ }
+}
+
+/*
+ * hmmm: still need a method for doing additive authorizations, where we request new scopes and
+ * have them bundled onto our existing access token. would need to store the token afterwards also.
+ */
+
+
diff --git a/production/example_apps/shared_calendar/src/View/AjaxView.php b/production/example_apps/shared_calendar/src/View/AjaxView.php
new file mode 100644
index 00000000..594e2d80
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/View/AjaxView.php
@@ -0,0 +1,49 @@
+response->type('ajax');
+ }
+}
diff --git a/production/example_apps/shared_calendar/src/View/AppView.php b/production/example_apps/shared_calendar/src/View/AppView.php
new file mode 100644
index 00000000..fd52ba69
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/View/AppView.php
@@ -0,0 +1,40 @@
+loadHelper('Html');`
+ *
+ * @return void
+ */
+ public function initialize()
+ {
+ }
+}
diff --git a/production/example_apps/shared_calendar/src/View/Cell/GoogleCalendarCell.php b/production/example_apps/shared_calendar/src/View/Cell/GoogleCalendarCell.php
new file mode 100644
index 00000000..b1ccf47a
--- /dev/null
+++ b/production/example_apps/shared_calendar/src/View/Cell/GoogleCalendarCell.php
@@ -0,0 +1,129 @@
+setTime(0, 0);
+ }
+
+ if (! $endTime ) {
+ $endTime = new DateTime($startTime->format('c'));
+ $endTime->modify ( "+31 day" ); // month from now (ish).
+ }
+
+ Log::debug ( 'start: ' . $startTime->format ( 'c' ) . ' end: ' . $endTime->format('c'));
+
+ $optParams = array (
+ // 'maxResults' => 100,
+ 'orderBy' => 'startTime',
+ 'singleEvents' => TRUE,
+ 'timeMin' => $startTime->format('c'),
+ 'timeMax' => $endTime->format ( 'c' )
+ );
+
+ try {
+ $results = $cal->events->listEvents ( $calendarId, $optParams );
+ } catch (\Exception $e) {
+ Log::debug('caught an exception from listing events!');
+ return null;
+ }
+
+ Log::debug ( 'after listEvents call.' );
+
+ // the calEvents array will be an associative array where the keys are the
+ // dates that events start. the value stored for each key is in turn an associative array of
+ // good stuff about the event. the good stuff includes 'info', for the appointment description,
+ // 'start' for the starting date (plus time perhaps), and 'event' for the raw google event
+ // contents.
+ $calEvents = [ ];
+
+ if (count ( $results->getItems () ) == 0) {
+ // nothing to add to array.
+ } else {
+ foreach ( $results->getItems () as $event ) {
+ $info = $event->getSummary ();
+
+ $start = $event->start->dateTime;
+ if (empty ( $start )) {
+ // simple index by date.
+ $index = $event->start->date;
+ $start = 'All Day'; // our time mutates.
+ } else {
+ // make the index from just the date portion.
+ $bits = str_split($start, strpos($start, 'T'));
+ $index = $bits[0];
+
+ // clean up the time portion for presentation.
+ $date = new DateTime($start);
+ $start = $date->format('H:i:s');
+
+ //Log::debug('chopped time of start is: ' . $start);
+ }
+
+ $existing_entry = [];
+ if (array_key_exists($index, $calEvents)) {
+ $existing_entry = $calEvents[$index];
+ }
+
+ array_push ( $existing_entry, [
+ 'info' => $info,
+ 'start' => $start,
+ 'event' => $event,
+ ] );
+
+ $calEvents[$index] = $existing_entry;
+ }
+ }
+
+ return $calEvents;
+ }
+
+ /**
+ * Default display method.
+ *
+ * needs to be passed a GoogleClient object that has already been configured with a valid
+ * access token.
+ *
+ * @return void
+ */
+ public function display($calEvents)
+ {
+
+ $this->set ( 'calEvents', $calEvents );
+ }
+}
diff --git a/production/example_apps/shared_calendar/src/View/Helper/empty b/production/example_apps/shared_calendar/src/View/Helper/empty
new file mode 100644
index 00000000..e69de29b
diff --git a/production/example_apps/shared_calendar/tests/Fixture/UsersFixture.php b/production/example_apps/shared_calendar/tests/Fixture/UsersFixture.php
new file mode 100644
index 00000000..4fdd2c16
--- /dev/null
+++ b/production/example_apps/shared_calendar/tests/Fixture/UsersFixture.php
@@ -0,0 +1,52 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null],
+ 'name' => ['type' => 'string', 'length' => 128, 'null' => false, 'default' => null, 'collate' => 'utf8_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'token' => ['type' => 'string', 'length' => 2048, 'null' => true, 'default' => null, 'collate' => 'utf8_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'modified' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ '_indexes' => [
+ 'name' => ['type' => 'index', 'columns' => ['name'], 'length' => []],
+ ],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_general_ci'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+
+ /**
+ * Records
+ *
+ * @var array
+ */
+ public $records = [
+ [
+ 'id' => 1,
+ 'name' => 'Lorem ipsum dolor sit amet',
+ 'token' => 'Lorem ipsum dolor sit amet',
+ 'created' => '2017-07-30 22:29:56',
+ 'modified' => '2017-07-30 22:29:56'
+ ],
+ ];
+}
diff --git a/production/example_apps/shared_calendar/tests/TestCase/ApplicationTest.php b/production/example_apps/shared_calendar/tests/TestCase/ApplicationTest.php
new file mode 100644
index 00000000..d397fa1c
--- /dev/null
+++ b/production/example_apps/shared_calendar/tests/TestCase/ApplicationTest.php
@@ -0,0 +1,46 @@
+middleware($middleware);
+
+ $this->assertInstanceOf(ErrorHandlerMiddleware::class, $middleware->get(0));
+ $this->assertInstanceOf(AssetMiddleware::class, $middleware->get(1));
+ $this->assertInstanceOf(RoutingMiddleware::class, $middleware->get(2));
+ }
+}
diff --git a/production/example_apps/shared_calendar/tests/TestCase/Controller/AuthorizerControllerTest.php b/production/example_apps/shared_calendar/tests/TestCase/Controller/AuthorizerControllerTest.php
new file mode 100644
index 00000000..93ee7e4f
--- /dev/null
+++ b/production/example_apps/shared_calendar/tests/TestCase/Controller/AuthorizerControllerTest.php
@@ -0,0 +1,71 @@
+markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test view method
+ *
+ * @return void
+ */
+ public function testView()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test add method
+ *
+ * @return void
+ */
+ public function testAdd()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test edit method
+ *
+ * @return void
+ */
+ public function testEdit()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test delete method
+ *
+ * @return void
+ */
+ public function testDelete()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/production/example_apps/shared_calendar/tests/TestCase/Controller/PagesControllerTest.php b/production/example_apps/shared_calendar/tests/TestCase/Controller/PagesControllerTest.php
new file mode 100644
index 00000000..1b478a31
--- /dev/null
+++ b/production/example_apps/shared_calendar/tests/TestCase/Controller/PagesControllerTest.php
@@ -0,0 +1,97 @@
+get('/');
+ $this->assertResponseOk();
+ $this->get('/');
+ $this->assertResponseOk();
+ }
+
+ /**
+ * testDisplay method
+ *
+ * @return void
+ */
+ public function testDisplay()
+ {
+ $this->get('/pages/home');
+ $this->assertResponseOk();
+ $this->assertResponseContains('CakePHP');
+ $this->assertResponseContains('');
+ }
+
+ /**
+ * Test that missing template renders 404 page in production
+ *
+ * @return void
+ */
+ public function testMissingTemplate()
+ {
+ Configure::write('debug', false);
+ $this->get('/pages/not_existing');
+
+ $this->assertResponseError();
+ $this->assertResponseContains('Error');
+ }
+
+ /**
+ * Test that missing template in debug mode renders missing_template error page
+ *
+ * @return void
+ */
+ public function testMissingTemplateInDebug()
+ {
+ Configure::write('debug', true);
+ $this->get('/pages/not_existing');
+
+ $this->assertResponseFailure();
+ $this->assertResponseContains('Missing Template');
+ $this->assertResponseContains('Stacktrace');
+ $this->assertResponseContains('not_existing.ctp');
+ }
+
+ /**
+ * Test directory traversal protection
+ *
+ * @return void
+ */
+ public function testDirectoryTraversalProtection()
+ {
+ $this->get('/pages/../Layout/ajax');
+ $this->assertResponseCode(403);
+ $this->assertResponseContains('Forbidden');
+ }
+}
diff --git a/production/example_apps/shared_calendar/tests/TestCase/Controller/UsersControllerTest.php b/production/example_apps/shared_calendar/tests/TestCase/Controller/UsersControllerTest.php
new file mode 100644
index 00000000..f07c1198
--- /dev/null
+++ b/production/example_apps/shared_calendar/tests/TestCase/Controller/UsersControllerTest.php
@@ -0,0 +1,71 @@
+markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test view method
+ *
+ * @return void
+ */
+ public function testView()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test add method
+ *
+ * @return void
+ */
+ public function testAdd()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test edit method
+ *
+ * @return void
+ */
+ public function testEdit()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test delete method
+ *
+ * @return void
+ */
+ public function testDelete()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/production/example_apps/shared_calendar/tests/TestCase/Model/Behavior/empty b/production/example_apps/shared_calendar/tests/TestCase/Model/Behavior/empty
new file mode 100644
index 00000000..e69de29b
diff --git a/production/example_apps/shared_calendar/tests/TestCase/Model/Table/UsersTableTest.php b/production/example_apps/shared_calendar/tests/TestCase/Model/Table/UsersTableTest.php
new file mode 100644
index 00000000..d745692e
--- /dev/null
+++ b/production/example_apps/shared_calendar/tests/TestCase/Model/Table/UsersTableTest.php
@@ -0,0 +1,73 @@
+ UsersTable::class];
+ $this->Users = TableRegistry::get('Users', $config);
+ }
+
+ /**
+ * tearDown method
+ *
+ * @return void
+ */
+ public function tearDown()
+ {
+ unset($this->Users);
+
+ parent::tearDown();
+ }
+
+ /**
+ * Test initialize method
+ *
+ * @return void
+ */
+ public function testInitialize()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test validationDefault method
+ *
+ * @return void
+ */
+ public function testValidationDefault()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/production/example_apps/shared_calendar/tests/TestCase/View/Cell/GoogleCalendarCellTest.php b/production/example_apps/shared_calendar/tests/TestCase/View/Cell/GoogleCalendarCellTest.php
new file mode 100644
index 00000000..c12e3bdc
--- /dev/null
+++ b/production/example_apps/shared_calendar/tests/TestCase/View/Cell/GoogleCalendarCellTest.php
@@ -0,0 +1,68 @@
+request = $this->getMockBuilder('Cake\Network\Request')->getMock();
+ $this->response = $this->getMockBuilder('Cake\Network\Response')->getMock();
+ $this->GoogleCalendar = new GoogleCalendarCell($this->request, $this->response);
+ }
+
+ /**
+ * tearDown method
+ *
+ * @return void
+ */
+ public function tearDown()
+ {
+ unset($this->GoogleCalendar);
+
+ parent::tearDown();
+ }
+
+ /**
+ * Test display method
+ *
+ * @return void
+ */
+ public function testDisplay()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/production/example_apps/shared_calendar/tests/TestCase/View/Helper/empty b/production/example_apps/shared_calendar/tests/TestCase/View/Helper/empty
new file mode 100644
index 00000000..e69de29b
diff --git a/production/example_apps/shared_calendar/tests/bootstrap.php b/production/example_apps/shared_calendar/tests/bootstrap.php
new file mode 100644
index 00000000..0ca191e4
--- /dev/null
+++ b/production/example_apps/shared_calendar/tests/bootstrap.php
@@ -0,0 +1,12 @@
+
+ RewriteEngine On
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^ index.php [L]
+
diff --git a/production/example_apps/shared_calendar/webroot/css/base.css b/production/example_apps/shared_calendar/webroot/css/base.css
new file mode 100644
index 00000000..458cd948
--- /dev/null
+++ b/production/example_apps/shared_calendar/webroot/css/base.css
@@ -0,0 +1,455 @@
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS text size adjust after orientation change, without disabling
+ * user zoom.
+ */
+
+html {
+ font-family: sans-serif; /* 1 */
+ -ms-text-size-adjust: 100%; /* 2 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove default margin.
+ */
+
+body {
+ margin: 0;
+}
+
+/* HTML5 display definitions
+ ========================================================================== */
+
+/**
+ * Correct `block` display not defined for any HTML5 element in IE 8/9.
+ * Correct `block` display not defined for `details` or `summary` in IE 10/11
+ * and Firefox.
+ * Correct `block` display not defined for `main` in IE 11.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+ display: block;
+}
+
+/**
+ * 1. Correct `inline-block` display not defined in IE 8/9.
+ * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
+ */
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block; /* 1 */
+ vertical-align: baseline; /* 2 */
+}
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+/**
+ * Address `[hidden]` styling not present in IE 8/9/10.
+ * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
+ */
+
+[hidden],
+template {
+ display: none;
+}
+
+/* Links
+ ========================================================================== */
+
+/**
+ * Remove the gray background color from active links in IE 10.
+ */
+
+a {
+ background-color: transparent;
+}
+
+/**
+ * Improve readability when focused and also mouse hovered in all browsers.
+ */
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+/* Text-level semantics
+ ========================================================================== */
+
+/**
+ * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
+ */
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
+ */
+
+b,
+strong {
+ font-weight: bold;
+}
+
+/**
+ * Address styling not present in Safari and Chrome.
+ */
+
+dfn {
+ font-style: italic;
+}
+
+/**
+ * Address variable `h1` font-size and margin within `section` and `article`
+ * contexts in Firefox 4+, Safari, and Chrome.
+ */
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+
+small {
+ font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+/* Embedded content
+ ========================================================================== */
+
+/**
+ * Remove border when inside `a` element in IE 8/9/10.
+ */
+
+img {
+ border: 0;
+}
+
+/**
+ * Correct overflow not hidden in IE 9/10/11.
+ */
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+/* Grouping content
+ ========================================================================== */
+
+/**
+ * Address margin not present in IE 8/9 and Safari.
+ */
+
+figure {
+ margin: 1em 40px;
+}
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+
+hr {
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+}
+
+/**
+ * Contain overflow in all browsers.
+ */
+
+pre {
+ overflow: auto;
+}
+
+/**
+ * Address odd `em`-unit font size rendering in all browsers.
+ */
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+/* Forms
+ ========================================================================== */
+
+/**
+ * Known limitation: by default, Chrome and Safari on OS X allow very limited
+ * styling of `select`, unless a `border` property is set.
+ */
+
+/**
+ * 1. Correct color not being inherited.
+ * Known issue: affects color of disabled elements.
+ * 2. Correct font properties not being inherited.
+ * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit; /* 1 */
+ font: inherit; /* 2 */
+ margin: 0; /* 3 */
+}
+
+/**
+ * Address `overflow` set to `hidden` in IE 8/9/10/11.
+ */
+
+button {
+ overflow: visible;
+}
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
+ * Correct `select` style inheritance in Firefox.
+ */
+
+button,
+select {
+ text-transform: none;
+}
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ * and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ * `input` and others.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button; /* 2 */
+ cursor: pointer; /* 3 */
+}
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
+ * the UA stylesheet.
+ */
+
+input {
+ line-height: normal;
+}
+
+/**
+ * It's recommended that you don't attempt to style these elements.
+ * Firefox's implementation doesn't respect box-sizing, padding, or width.
+ *
+ * 1. Address box sizing set to `content-box` in IE 8/9/10.
+ * 2. Remove excess padding in IE 8/9/10.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Fix the cursor style for Chrome's increment/decrement buttons. For certain
+ * `font-size` values of the `input`, it causes the cursor style of the
+ * decrement button to change from `default` to `text`.
+ */
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
+ * (include `-moz` to future-proof).
+ */
+
+input[type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ -moz-box-sizing: content-box;
+ -webkit-box-sizing: content-box; /* 2 */
+ box-sizing: content-box;
+}
+
+/**
+ * Remove inner padding and search cancel button in Safari and Chrome on OS X.
+ * Safari (but not Chrome) clips the cancel button when the search input has
+ * padding (and `textfield` appearance).
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9/10/11.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+
+legend {
+ border: 0; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Remove default vertical scrollbar in IE 8/9/10/11.
+ */
+
+textarea {
+ overflow: auto;
+}
+
+/**
+ * Don't inherit the `font-weight` (applied by a rule above).
+ * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
+ */
+
+optgroup {
+ font-weight: bold;
+}
+
+/* Tables
+ ========================================================================== */
+
+/**
+ * Remove most spacing between table cells.
+ */
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+td,
+th {
+ padding: 0;
+}
+
+/**
+ * Foundation for Sites by ZURB
+ * Version 5
+ */
+
+/*
+ * Copyright (c) 2013-2014 ZURB, inc.
+* MIT License
+* 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.
+*/
+
+meta.foundation-version{font-family:"{{ VERSION }}"}meta.foundation-mq-small{font-family:"/only screen/";width:0}meta.foundation-mq-small-only{font-family:"/only screen and (max-width: 40em)/";width:0}meta.foundation-mq-medium{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}meta.foundation-mq-medium-only{font-family:"/only screen and (min-width:40.0625em) and (max-width:64em)/";width:40.0625em}meta.foundation-mq-large{font-family:"/only screen and (min-width:64.0625em)/";width:64.0625em}meta.foundation-mq-large-only{font-family:"/only screen and (min-width:64.0625em) and (max-width:90em)/";width:64.0625em}meta.foundation-mq-xlarge{font-family:"/only screen and (min-width:90.0625em)/";width:90.0625em}meta.foundation-mq-xlarge-only{font-family:"/only screen and (min-width:90.0625em) and (max-width:120em)/";width:90.0625em}meta.foundation-mq-xxlarge{font-family:"/only screen and (min-width:120.0625em)/";width:120.0625em}meta.foundation-data-attribute-namespace{font-family:false}html,body{height:100%}html{box-sizing:border-box}*,*:before,*:after{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}html,body{font-size:100%}body{background:#fff;color:#222;cursor:auto;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:normal;line-height:1.5;margin:0;padding:0;position:relative}a:hover{cursor:pointer}img{max-width:100%;height:auto}img{-ms-interpolation-mode:bicubic}#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object,.mqa-display img,.mqa-display embed,.mqa-display object{max-width:none !important}.left{float:left !important}.right{float:right !important}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.hide{display:none}.invisible{visibility:hidden}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}.row{margin:0 auto;max-width:62.5rem;width:100%}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.row.collapse>.column,.row.collapse>.columns{padding-left:0;padding-right:0}.row.collapse .row{margin-left:0;margin-right:0}.row .row{margin:0 -0.9375rem;max-width:none;width:auto}.row .row:before,.row .row:after{content:" ";display:table}.row .row:after{clear:both}.row .row.collapse{margin:0;max-width:none;width:auto}.row .row.collapse:before,.row .row.collapse:after{content:" ";display:table}.row .row.collapse:after{clear:both}.column,.columns{padding-left:0.9375rem;padding-right:0.9375rem;width:100%;float:left}.column+.column:last-child,.columns+.column:last-child,.column+.columns:last-child,.columns+.columns:last-child{float:right}.column+.column.end,.columns+.column.end,.column+.columns.end,.columns+.columns.end{float:left}@media only screen{.small-push-0{position:relative;left:0;right:auto}.small-pull-0{position:relative;right:0;left:auto}.small-push-1{position:relative;left:8.33333%;right:auto}.small-pull-1{position:relative;right:8.33333%;left:auto}.small-push-2{position:relative;left:16.66667%;right:auto}.small-pull-2{position:relative;right:16.66667%;left:auto}.small-push-3{position:relative;left:25%;right:auto}.small-pull-3{position:relative;right:25%;left:auto}.small-push-4{position:relative;left:33.33333%;right:auto}.small-pull-4{position:relative;right:33.33333%;left:auto}.small-push-5{position:relative;left:41.66667%;right:auto}.small-pull-5{position:relative;right:41.66667%;left:auto}.small-push-6{position:relative;left:50%;right:auto}.small-pull-6{position:relative;right:50%;left:auto}.small-push-7{position:relative;left:58.33333%;right:auto}.small-pull-7{position:relative;right:58.33333%;left:auto}.small-push-8{position:relative;left:66.66667%;right:auto}.small-pull-8{position:relative;right:66.66667%;left:auto}.small-push-9{position:relative;left:75%;right:auto}.small-pull-9{position:relative;right:75%;left:auto}.small-push-10{position:relative;left:83.33333%;right:auto}.small-pull-10{position:relative;right:83.33333%;left:auto}.small-push-11{position:relative;left:91.66667%;right:auto}.small-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375rem;padding-right:0.9375rem;float:left}.small-1{width:8.33333%}.small-2{width:16.66667%}.small-3{width:25%}.small-4{width:33.33333%}.small-5{width:41.66667%}.small-6{width:50%}.small-7{width:58.33333%}.small-8{width:66.66667%}.small-9{width:75%}.small-10{width:83.33333%}.small-11{width:91.66667%}.small-12{width:100%}.small-offset-0{margin-left:0 !important}.small-offset-1{margin-left:8.33333% !important}.small-offset-2{margin-left:16.66667% !important}.small-offset-3{margin-left:25% !important}.small-offset-4{margin-left:33.33333% !important}.small-offset-5{margin-left:41.66667% !important}.small-offset-6{margin-left:50% !important}.small-offset-7{margin-left:58.33333% !important}.small-offset-8{margin-left:66.66667% !important}.small-offset-9{margin-left:75% !important}.small-offset-10{margin-left:83.33333% !important}.small-offset-11{margin-left:91.66667% !important}.small-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.small-centered,.columns.small-centered{margin-left:auto;margin-right:auto;float:none}.column.small-uncentered,.columns.small-uncentered{float:left;margin-left:0;margin-right:0}.column.small-centered:last-child,.columns.small-centered:last-child{float:none}.column.small-uncentered:last-child,.columns.small-uncentered:last-child{float:left}.column.small-uncentered.opposite,.columns.small-uncentered.opposite{float:right}.row.small-collapse>.column,.row.small-collapse>.columns{padding-left:0;padding-right:0}.row.small-collapse .row{margin-left:0;margin-right:0}.row.small-uncollapse>.column,.row.small-uncollapse>.columns{padding-left:0.9375rem;padding-right:0.9375rem;float:left}}@media only screen and (min-width: 40.0625em){.medium-push-0{position:relative;left:0;right:auto}.medium-pull-0{position:relative;right:0;left:auto}.medium-push-1{position:relative;left:8.33333%;right:auto}.medium-pull-1{position:relative;right:8.33333%;left:auto}.medium-push-2{position:relative;left:16.66667%;right:auto}.medium-pull-2{position:relative;right:16.66667%;left:auto}.medium-push-3{position:relative;left:25%;right:auto}.medium-pull-3{position:relative;right:25%;left:auto}.medium-push-4{position:relative;left:33.33333%;right:auto}.medium-pull-4{position:relative;right:33.33333%;left:auto}.medium-push-5{position:relative;left:41.66667%;right:auto}.medium-pull-5{position:relative;right:41.66667%;left:auto}.medium-push-6{position:relative;left:50%;right:auto}.medium-pull-6{position:relative;right:50%;left:auto}.medium-push-7{position:relative;left:58.33333%;right:auto}.medium-pull-7{position:relative;right:58.33333%;left:auto}.medium-push-8{position:relative;left:66.66667%;right:auto}.medium-pull-8{position:relative;right:66.66667%;left:auto}.medium-push-9{position:relative;left:75%;right:auto}.medium-pull-9{position:relative;right:75%;left:auto}.medium-push-10{position:relative;left:83.33333%;right:auto}.medium-pull-10{position:relative;right:83.33333%;left:auto}.medium-push-11{position:relative;left:91.66667%;right:auto}.medium-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375rem;padding-right:0.9375rem;float:left}.medium-1{width:8.33333%}.medium-2{width:16.66667%}.medium-3{width:25%}.medium-4{width:33.33333%}.medium-5{width:41.66667%}.medium-6{width:50%}.medium-7{width:58.33333%}.medium-8{width:66.66667%}.medium-9{width:75%}.medium-10{width:83.33333%}.medium-11{width:91.66667%}.medium-12{width:100%}.medium-offset-0{margin-left:0 !important}.medium-offset-1{margin-left:8.33333% !important}.medium-offset-2{margin-left:16.66667% !important}.medium-offset-3{margin-left:25% !important}.medium-offset-4{margin-left:33.33333% !important}.medium-offset-5{margin-left:41.66667% !important}.medium-offset-6{margin-left:50% !important}.medium-offset-7{margin-left:58.33333% !important}.medium-offset-8{margin-left:66.66667% !important}.medium-offset-9{margin-left:75% !important}.medium-offset-10{margin-left:83.33333% !important}.medium-offset-11{margin-left:91.66667% !important}.medium-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.medium-centered,.columns.medium-centered{margin-left:auto;margin-right:auto;float:none}.column.medium-uncentered,.columns.medium-uncentered{float:left;margin-left:0;margin-right:0}.column.medium-centered:last-child,.columns.medium-centered:last-child{float:none}.column.medium-uncentered:last-child,.columns.medium-uncentered:last-child{float:left}.column.medium-uncentered.opposite,.columns.medium-uncentered.opposite{float:right}.row.medium-collapse>.column,.row.medium-collapse>.columns{padding-left:0;padding-right:0}.row.medium-collapse .row{margin-left:0;margin-right:0}.row.medium-uncollapse>.column,.row.medium-uncollapse>.columns{padding-left:0.9375rem;padding-right:0.9375rem;float:left}.push-0{position:relative;left:0;right:auto}.pull-0{position:relative;right:0;left:auto}.push-1{position:relative;left:8.33333%;right:auto}.pull-1{position:relative;right:8.33333%;left:auto}.push-2{position:relative;left:16.66667%;right:auto}.pull-2{position:relative;right:16.66667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333%;right:auto}.pull-4{position:relative;right:33.33333%;left:auto}.push-5{position:relative;left:41.66667%;right:auto}.pull-5{position:relative;right:41.66667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333%;right:auto}.pull-7{position:relative;right:58.33333%;left:auto}.push-8{position:relative;left:66.66667%;right:auto}.pull-8{position:relative;right:66.66667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333%;right:auto}.pull-10{position:relative;right:83.33333%;left:auto}.push-11{position:relative;left:91.66667%;right:auto}.pull-11{position:relative;right:91.66667%;left:auto}}@media only screen and (min-width: 64.0625em){.large-push-0{position:relative;left:0;right:auto}.large-pull-0{position:relative;right:0;left:auto}.large-push-1{position:relative;left:8.33333%;right:auto}.large-pull-1{position:relative;right:8.33333%;left:auto}.large-push-2{position:relative;left:16.66667%;right:auto}.large-pull-2{position:relative;right:16.66667%;left:auto}.large-push-3{position:relative;left:25%;right:auto}.large-pull-3{position:relative;right:25%;left:auto}.large-push-4{position:relative;left:33.33333%;right:auto}.large-pull-4{position:relative;right:33.33333%;left:auto}.large-push-5{position:relative;left:41.66667%;right:auto}.large-pull-5{position:relative;right:41.66667%;left:auto}.large-push-6{position:relative;left:50%;right:auto}.large-pull-6{position:relative;right:50%;left:auto}.large-push-7{position:relative;left:58.33333%;right:auto}.large-pull-7{position:relative;right:58.33333%;left:auto}.large-push-8{position:relative;left:66.66667%;right:auto}.large-pull-8{position:relative;right:66.66667%;left:auto}.large-push-9{position:relative;left:75%;right:auto}.large-pull-9{position:relative;right:75%;left:auto}.large-push-10{position:relative;left:83.33333%;right:auto}.large-pull-10{position:relative;right:83.33333%;left:auto}.large-push-11{position:relative;left:91.66667%;right:auto}.large-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375rem;padding-right:0.9375rem;float:left}.large-1{width:8.33333%}.large-2{width:16.66667%}.large-3{width:25%}.large-4{width:33.33333%}.large-5{width:41.66667%}.large-6{width:50%}.large-7{width:58.33333%}.large-8{width:66.66667%}.large-9{width:75%}.large-10{width:83.33333%}.large-11{width:91.66667%}.large-12{width:100%}.large-offset-0{margin-left:0 !important}.large-offset-1{margin-left:8.33333% !important}.large-offset-2{margin-left:16.66667% !important}.large-offset-3{margin-left:25% !important}.large-offset-4{margin-left:33.33333% !important}.large-offset-5{margin-left:41.66667% !important}.large-offset-6{margin-left:50% !important}.large-offset-7{margin-left:58.33333% !important}.large-offset-8{margin-left:66.66667% !important}.large-offset-9{margin-left:75% !important}.large-offset-10{margin-left:83.33333% !important}.large-offset-11{margin-left:91.66667% !important}.large-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.large-centered,.columns.large-centered{margin-left:auto;margin-right:auto;float:none}.column.large-uncentered,.columns.large-uncentered{float:left;margin-left:0;margin-right:0}.column.large-centered:last-child,.columns.large-centered:last-child{float:none}.column.large-uncentered:last-child,.columns.large-uncentered:last-child{float:left}.column.large-uncentered.opposite,.columns.large-uncentered.opposite{float:right}.row.large-collapse>.column,.row.large-collapse>.columns{padding-left:0;padding-right:0}.row.large-collapse .row{margin-left:0;margin-right:0}.row.large-uncollapse>.column,.row.large-uncollapse>.columns{padding-left:0.9375rem;padding-right:0.9375rem;float:left}.push-0{position:relative;left:0;right:auto}.pull-0{position:relative;right:0;left:auto}.push-1{position:relative;left:8.33333%;right:auto}.pull-1{position:relative;right:8.33333%;left:auto}.push-2{position:relative;left:16.66667%;right:auto}.pull-2{position:relative;right:16.66667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333%;right:auto}.pull-4{position:relative;right:33.33333%;left:auto}.push-5{position:relative;left:41.66667%;right:auto}.pull-5{position:relative;right:41.66667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333%;right:auto}.pull-7{position:relative;right:58.33333%;left:auto}.push-8{position:relative;left:66.66667%;right:auto}.pull-8{position:relative;right:66.66667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333%;right:auto}.pull-10{position:relative;right:83.33333%;left:auto}.push-11{position:relative;left:91.66667%;right:auto}.pull-11{position:relative;right:91.66667%;left:auto}}button,.button{-webkit-appearance:none;-moz-appearance:none;border-radius:0;border-style:solid;border-width:0;cursor:pointer;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal;line-height:normal;margin:0 0 1.25rem;position:relative;text-align:center;text-decoration:none;display:inline-block;padding:1rem 2rem 1.0625rem 2rem;font-size:1rem;background-color:#008CBA;border-color:#007095;color:#fff;transition:background-color 300ms ease-out}button:hover,button:focus,.button:hover,.button:focus{background-color:#007095}button:hover,button:focus,.button:hover,.button:focus{color:#fff}button.secondary,.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{background-color:#b9b9b9}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{color:#333}button.success,.button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{background-color:#368a55}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{color:#fff}button.alert,.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{background-color:#cf2a0e}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{color:#fff}button.warning,.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{background-color:#cf6e0e}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{color:#fff}button.info,.button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{background-color:#61b6d9}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{color:#fff}button.large,.button.large{padding:1.125rem 2.25rem 1.1875rem 2.25rem;font-size:1.25rem}button.small,.button.small{padding:0.875rem 1.75rem 0.9375rem 1.75rem;font-size:0.8125rem}button.tiny,.button.tiny{padding:0.625rem 1.25rem 0.6875rem 1.25rem;font-size:0.6875rem}button.expand,.button.expand{padding-left:0;padding-right:0;width:100%}button.left-align,.button.left-align{text-align:left;text-indent:0.75rem}button.right-align,.button.right-align{text-align:right;padding-right:0.75rem}button.radius,.button.radius{border-radius:3px}button.round,.button.round{border-radius:1000px}button.disabled,button[disabled],.button.disabled,.button[disabled]{background-color:#008CBA;border-color:#007095;color:#fff;box-shadow:none;cursor:default;opacity:0.7}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#007095}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{color:#fff}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#008CBA}button.disabled.secondary,button[disabled].secondary,.button.disabled.secondary,.button[disabled].secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333;box-shadow:none;cursor:default;opacity:0.7}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#b9b9b9}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{color:#333}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#e7e7e7}button.disabled.success,button[disabled].success,.button.disabled.success,.button[disabled].success{background-color:#43AC6A;border-color:#368a55;color:#fff;box-shadow:none;cursor:default;opacity:0.7}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#368a55}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{color:#fff}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#43AC6A}button.disabled.alert,button[disabled].alert,.button.disabled.alert,.button[disabled].alert{background-color:#f04124;border-color:#cf2a0e;color:#fff;box-shadow:none;cursor:default;opacity:0.7}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#cf2a0e}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{color:#fff}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#f04124}button.disabled.warning,button[disabled].warning,.button.disabled.warning,.button[disabled].warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff;box-shadow:none;cursor:default;opacity:0.7}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#cf6e0e}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{color:#fff}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#f08a24}button.disabled.info,button[disabled].info,.button.disabled.info,.button[disabled].info{background-color:#a0d3e8;border-color:#61b6d9;color:#333;box-shadow:none;cursor:default;opacity:0.7}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#61b6d9}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{color:#fff}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#a0d3e8}button::-moz-focus-inner{border:0;padding:0}@media only screen and (min-width: 40.0625em){button,.button{display:inline-block}}form{margin:0 0 1rem}form .row .row{margin:0 -0.5rem}form .row .row .column,form .row .row .columns{padding:0 0.5rem}form .row .row.collapse{margin:0}form .row .row.collapse .column,form .row .row.collapse .columns{padding:0}form .row .row.collapse input{-webkit-border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-bottom-right-radius:0;border-top-right-radius:0}form .row input.column,form .row input.columns,form .row textarea.column,form .row textarea.columns{padding-left:0.5rem}label{color:#4d4d4d;cursor:pointer;display:block;font-size:0.875rem;font-weight:normal;line-height:1.5;margin-bottom:0}label.right{float:none !important;text-align:right}label.inline{margin:0 0 1rem 0;padding:0.5625rem 0}label small{text-transform:capitalize;color:#676767}.prefix,.postfix{border-style:solid;border-width:1px;display:block;font-size:0.875rem;height:2.3125rem;line-height:2.3125rem;overflow:visible;padding-bottom:0;padding-top:0;position:relative;text-align:center;width:100%;z-index:2}.postfix.button{border-color:true}.prefix.button{border:none;padding-left:0;padding-right:0;padding-bottom:0;padding-top:0;text-align:center}.prefix.button.radius{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.postfix.button.radius{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.prefix.button.round{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.postfix.button.round{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}span.prefix,label.prefix{background:#f2f2f2;border-right:none;color:#333;border-color:#ccc}span.postfix,label.postfix{background:#f2f2f2;color:#333;border-color:#ccc}input[type="text"],input[type="password"],input[type="date"],input[type="datetime"],input[type="datetime-local"],input[type="month"],input[type="week"],input[type="email"],input[type="number"],input[type="search"],input[type="tel"],input[type="time"],input[type="url"],input[type="color"],textarea{-webkit-appearance:none;-moz-appearance:none;border-radius:0;background-color:#fff;border-style:solid;border-width:1px;border-color:#ccc;box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);color:rgba(0,0,0,0.75);display:block;font-family:inherit;font-size:0.875rem;height:2.3125rem;margin:0 0 1rem 0;padding:0.5rem;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:border-color 0.15s linear,background 0.15s linear;-moz-transition:border-color 0.15s linear,background 0.15s linear;-ms-transition:border-color 0.15s linear,background 0.15s linear;-o-transition:border-color 0.15s linear,background 0.15s linear;transition:border-color 0.15s linear,background 0.15s linear}input[type="text"]:focus,input[type="password"]:focus,input[type="date"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="month"]:focus,input[type="week"]:focus,input[type="email"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="time"]:focus,input[type="url"]:focus,input[type="color"]:focus,textarea:focus{background:#fafafa;border-color:#999;outline:none}input[type="text"]:disabled,input[type="password"]:disabled,input[type="date"]:disabled,input[type="datetime"]:disabled,input[type="datetime-local"]:disabled,input[type="month"]:disabled,input[type="week"]:disabled,input[type="email"]:disabled,input[type="number"]:disabled,input[type="search"]:disabled,input[type="tel"]:disabled,input[type="time"]:disabled,input[type="url"]:disabled,input[type="color"]:disabled,textarea:disabled{background-color:#ddd;cursor:default}input[type="text"][disabled],input[type="text"][readonly],fieldset[disabled] input[type="text"],input[type="password"][disabled],input[type="password"][readonly],fieldset[disabled] input[type="password"],input[type="date"][disabled],input[type="date"][readonly],fieldset[disabled] input[type="date"],input[type="datetime"][disabled],input[type="datetime"][readonly],fieldset[disabled] input[type="datetime"],input[type="datetime-local"][disabled],input[type="datetime-local"][readonly],fieldset[disabled] input[type="datetime-local"],input[type="month"][disabled],input[type="month"][readonly],fieldset[disabled] input[type="month"],input[type="week"][disabled],input[type="week"][readonly],fieldset[disabled] input[type="week"],input[type="email"][disabled],input[type="email"][readonly],fieldset[disabled] input[type="email"],input[type="number"][disabled],input[type="number"][readonly],fieldset[disabled] input[type="number"],input[type="search"][disabled],input[type="search"][readonly],fieldset[disabled] input[type="search"],input[type="tel"][disabled],input[type="tel"][readonly],fieldset[disabled] input[type="tel"],input[type="time"][disabled],input[type="time"][readonly],fieldset[disabled] input[type="time"],input[type="url"][disabled],input[type="url"][readonly],fieldset[disabled] input[type="url"],input[type="color"][disabled],input[type="color"][readonly],fieldset[disabled] input[type="color"],textarea[disabled],textarea[readonly],fieldset[disabled] textarea{background-color:#ddd;cursor:default}input[type="text"].radius,input[type="password"].radius,input[type="date"].radius,input[type="datetime"].radius,input[type="datetime-local"].radius,input[type="month"].radius,input[type="week"].radius,input[type="email"].radius,input[type="number"].radius,input[type="search"].radius,input[type="tel"].radius,input[type="time"].radius,input[type="url"].radius,input[type="color"].radius,textarea.radius{border-radius:3px}form .row .prefix-radius.row.collapse input,form .row .prefix-radius.row.collapse textarea,form .row .prefix-radius.row.collapse select,form .row .prefix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-radius.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse input,form .row .postfix-radius.row.collapse textarea,form .row .postfix-radius.row.collapse select,form .row .postfix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-round.row.collapse input,form .row .prefix-round.row.collapse textarea,form .row .prefix-round.row.collapse select,form .row .prefix-round.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}form .row .prefix-round.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse input,form .row .postfix-round.row.collapse textarea,form .row .postfix-round.row.collapse select,form .row .postfix-round.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}input[type="submit"]{-webkit-appearance:none;-moz-appearance:none;border-radius:0}textarea[rows]{height:auto}textarea{max-width:100%}::-webkit-input-placeholder{color:#ccc}:-moz-placeholder{color:#ccc}::-moz-placeholder{color:#ccc}:-ms-input-placeholder{color:#ccc}select{-webkit-appearance:none !important;-moz-appearance:none !important;background-color:#FAFAFA;border-radius:0;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeD0iMTJweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzcHgiIHZpZXdCb3g9IjAgMCA2IDMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYgMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBvbHlnb24gcG9pbnRzPSI1Ljk5MiwwIDIuOTkyLDMgLTAuMDA4LDAgIi8+PC9zdmc+);background-position:100% center;background-repeat:no-repeat;border-style:solid;border-width:1px;border-color:#ccc;color:rgba(0,0,0,0.75);font-family:inherit;font-size:0.875rem;line-height:normal;padding:0.5rem;border-radius:0;height:2.3125rem}select::-ms-expand{display:none}select.radius{border-radius:3px}select:hover{background-color:#f3f3f3;border-color:#999}select:disabled{background-color:#ddd;cursor:default}select[multiple]{height:auto}input[type="file"],input[type="checkbox"],input[type="radio"],select{margin:0 0 1rem 0}input[type="checkbox"]+label,input[type="radio"]+label{display:inline-block;margin-left:0.5rem;margin-right:1rem;margin-bottom:0;vertical-align:baseline}input[type="file"]{width:100%}fieldset{border:1px solid #ddd;margin:1.125rem 0;padding:1.25rem}fieldset legend{background:#fff;font-weight:bold;margin-left:-0.1875rem;margin:0;padding:0 0.1875rem}[data-abide] .error small.error,[data-abide] .error span.error,[data-abide] span.error,[data-abide] small.error{display:block;font-size:0.75rem;font-style:italic;font-weight:normal;margin-bottom:1rem;margin-top:-1px;padding:0.375rem 0.5625rem 0.5625rem;background:#f04124;color:#fff}[data-abide] span.error,[data-abide] small.error{display:none}span.error,small.error{display:block;font-size:0.75rem;font-style:italic;font-weight:normal;margin-bottom:1rem;margin-top:-1px;padding:0.375rem 0.5625rem 0.5625rem;background:#f04124;color:#fff}.error input,.error textarea,.error select{margin-bottom:0}.error input[type="checkbox"],.error input[type="radio"]{margin-bottom:1rem}.error label,.error label.error{color:#f04124}.error small.error{display:block;font-size:0.75rem;font-style:italic;font-weight:normal;margin-bottom:1rem;margin-top:-1px;padding:0.375rem 0.5625rem 0.5625rem;background:#f04124;color:#fff}.error>label>small{background:transparent;color:#676767;display:inline;font-size:60%;font-style:normal;margin:0;padding:0;text-transform:capitalize}.error span.error-message{display:block}input.error,textarea.error,select.error{margin-bottom:0}label.error{color:#f04124}meta.foundation-mq-topbar{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}.contain-to-grid{width:100%;background:#333}.contain-to-grid .top-bar{margin-bottom:0}.fixed{position:fixed;top:0;width:100%;z-index:99;left:0}.fixed.expanded:not(.top-bar){height:auto;max-height:100%;overflow-y:auto;width:100%}.fixed.expanded:not(.top-bar) .title-area{position:fixed;width:100%;z-index:99}.fixed.expanded:not(.top-bar) .top-bar-section{margin-top:2.8125rem;z-index:98}.top-bar{background:#333;height:2.8125rem;line-height:2.8125rem;margin-bottom:0;overflow:hidden;position:relative}.top-bar ul{list-style:none;margin-bottom:0}.top-bar .row{max-width:none}.top-bar form,.top-bar input,.top-bar select{margin-bottom:0}.top-bar input,.top-bar select{font-size:0.75rem;height:1.75rem;padding-bottom:.35rem;padding-top:.35rem}.top-bar .button,.top-bar button{font-size:0.75rem;margin-bottom:0;padding-bottom:0.4125rem;padding-top:0.4125rem}@media only screen and (max-width: 40em){.top-bar .button,.top-bar button{position:relative;top:-1px}}.top-bar .title-area{margin:0;position:relative}.top-bar .name{font-size:16px;height:2.8125rem;margin:0}.top-bar .name h1,.top-bar .name h2,.top-bar .name h3,.top-bar .name h4,.top-bar .name p,.top-bar .name span{font-size:1.0625rem;line-height:2.8125rem;margin:0}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name p a,.top-bar .name span a{color:#fff;display:block;font-weight:normal;padding:0 0.9375rem;width:75%}.top-bar .toggle-topbar{position:absolute;right:0;top:0}.top-bar .toggle-topbar a{color:#fff;display:block;font-size:0.8125rem;font-weight:bold;height:2.8125rem;line-height:2.8125rem;padding:0 0.9375rem;position:relative;text-transform:uppercase}.top-bar .toggle-topbar.menu-icon{margin-top:-16px;top:50%}.top-bar .toggle-topbar.menu-icon a{color:#fff;height:34px;line-height:33px;padding:0 2.5rem 0 0.9375rem;position:relative}.top-bar .toggle-topbar.menu-icon a span::after{content:"";display:block;height:0;position:absolute;margin-top:-8px;top:50%;right:0.9375rem;box-shadow:0 0 0 1px #fff,0 7px 0 1px #fff,0 14px 0 1px #fff;width:16px}.top-bar .toggle-topbar.menu-icon a span:hover:after{box-shadow:0 0 0 1px "",0 7px 0 1px "",0 14px 0 1px ""}.top-bar.expanded{background:transparent;height:auto}.top-bar.expanded .title-area{background:#333}.top-bar.expanded .toggle-topbar a{color:#888}.top-bar.expanded .toggle-topbar a span::after{box-shadow:0 0 0 1px #888,0 7px 0 1px #888,0 14px 0 1px #888}@media screen and (-webkit-min-device-pixel-ratio: 0){.top-bar.expanded .top-bar-section .has-dropdown.moved>.dropdown,.top-bar.expanded .top-bar-section .dropdown{clip:initial}.top-bar.expanded .top-bar-section .has-dropdown:not(.moved)>ul{padding:0}}.top-bar-section{left:0;position:relative;width:auto;transition:left 300ms ease-out}.top-bar-section ul{display:block;font-size:16px;height:auto;margin:0;padding:0;width:100%}.top-bar-section .divider,.top-bar-section [role="separator"]{border-top:solid 1px #1a1a1a;clear:both;height:1px;width:100%}.top-bar-section ul li{background:#333}.top-bar-section ul li>a{color:#fff;display:block;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:0.8125rem;font-weight:normal;padding-left:0.9375rem;padding:12px 0 12px 0.9375rem;text-transform:none;width:100%}.top-bar-section ul li>a.button{font-size:0.8125rem;padding-left:0.9375rem;padding-right:0.9375rem;background-color:#008CBA;border-color:#007095;color:#fff}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{background-color:#007095}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{color:#fff}.top-bar-section ul li>a.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{color:#333}.top-bar-section ul li>a.button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{background-color:#368a55}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{color:#fff}.top-bar-section ul li>a.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{color:#fff}.top-bar-section ul li>a.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{color:#fff}.top-bar-section ul li>a.button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}.top-bar-section ul li>a.button.info:hover,.top-bar-section ul li>a.button.info:focus{background-color:#61b6d9}.top-bar-section ul li>a.button.info:hover,.top-bar-section ul li>a.button.info:focus{color:#fff}.top-bar-section ul li>button{font-size:0.8125rem;padding-left:0.9375rem;padding-right:0.9375rem;background-color:#008CBA;border-color:#007095;color:#fff}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{background-color:#007095}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{color:#fff}.top-bar-section ul li>button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{color:#333}.top-bar-section ul li>button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{background-color:#368a55}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{color:#fff}.top-bar-section ul li>button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{color:#fff}.top-bar-section ul li>button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{color:#fff}.top-bar-section ul li>button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}.top-bar-section ul li>button.info:hover,.top-bar-section ul li>button.info:focus{background-color:#61b6d9}.top-bar-section ul li>button.info:hover,.top-bar-section ul li>button.info:focus{color:#fff}.top-bar-section ul li:hover:not(.has-form)>a{background-color:#555;color:#fff;background:#222}.top-bar-section ul li.active>a{background:#008CBA;color:#fff}.top-bar-section ul li.active>a:hover{background:#0078a0;color:#fff}.top-bar-section .has-form{padding:0.9375rem}.top-bar-section .has-dropdown{position:relative}.top-bar-section .has-dropdown>a:after{border:inset 5px;content:"";display:block;height:0;width:0;border-color:transparent transparent transparent rgba(255,255,255,0.4);border-left-style:solid;margin-right:0.9375rem;margin-top:-4.5px;position:absolute;top:50%;right:0}.top-bar-section .has-dropdown.moved{position:static}.top-bar-section .has-dropdown.moved>.dropdown{position:static !important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute !important;width:100%}.top-bar-section .has-dropdown.moved>a:after{display:none}.top-bar-section .dropdown{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px;display:block;padding:0;position:absolute;top:0;z-index:99;left:100%}.top-bar-section .dropdown li{height:auto;width:100%}.top-bar-section .dropdown li a{font-weight:normal;padding:8px 0.9375rem}.top-bar-section .dropdown li a.parent-link{font-weight:normal}.top-bar-section .dropdown li.title h5,.top-bar-section .dropdown li.parent-link{margin-bottom:0;margin-top:0;font-size:1.125rem}.top-bar-section .dropdown li.title h5 a,.top-bar-section .dropdown li.parent-link a{color:#fff;display:block}.top-bar-section .dropdown li.title h5 a:hover,.top-bar-section .dropdown li.parent-link a:hover{background:none}.top-bar-section .dropdown li.has-form{padding:8px 0.9375rem}.top-bar-section .dropdown li .button,.top-bar-section .dropdown li button{top:auto}.top-bar-section .dropdown label{color:#777;font-size:0.625rem;font-weight:bold;margin-bottom:0;padding:8px 0.9375rem 2px;text-transform:uppercase}.js-generated{display:block}@media only screen and (min-width: 40.0625em){.top-bar{background:#333;overflow:visible}.top-bar:before,.top-bar:after{content:" ";display:table}.top-bar:after{clear:both}.top-bar .toggle-topbar{display:none}.top-bar .title-area{float:left}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name h5 a,.top-bar .name h6 a{width:auto}.top-bar input,.top-bar select,.top-bar .button,.top-bar button{font-size:0.875rem;height:1.75rem;position:relative;top:0.53125rem}.top-bar.expanded{background:#333}.contain-to-grid .top-bar{margin-bottom:0;margin:0 auto;max-width:62.5rem}.top-bar-section{transition:none 0 0;left:0 !important}.top-bar-section ul{display:inline;height:auto !important;width:auto}.top-bar-section ul li{float:left}.top-bar-section ul li .js-generated{display:none}.top-bar-section li.hover>a:not(.button){background-color:#555;background:#222;color:#fff}.top-bar-section li:not(.has-form) a:not(.button){background:#333;line-height:2.8125rem;padding:0 0.9375rem}.top-bar-section li:not(.has-form) a:not(.button):hover{background-color:#555;background:#222}.top-bar-section li.active:not(.has-form) a:not(.button){background:#008CBA;color:#fff;line-height:2.8125rem;padding:0 0.9375rem}.top-bar-section li.active:not(.has-form) a:not(.button):hover{background:#0078a0;color:#fff}.top-bar-section .has-dropdown>a{padding-right:2.1875rem !important}.top-bar-section .has-dropdown>a:after{border:inset 5px;content:"";display:block;height:0;width:0;border-color:rgba(255,255,255,0.4) transparent transparent transparent;border-top-style:solid;margin-top:-2.5px;top:1.40625rem}.top-bar-section .has-dropdown.moved{position:relative}.top-bar-section .has-dropdown.moved>.dropdown{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px;display:block}.top-bar-section .has-dropdown.hover>.dropdown,.top-bar-section .has-dropdown.not-click:hover>.dropdown{position:static !important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute !important}.top-bar-section .has-dropdown>a:focus+.dropdown{position:static !important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute !important}.top-bar-section .has-dropdown .dropdown li.has-dropdown>a:after{border:none;content:"\00bb";top:0.1875rem;right:5px}.top-bar-section .dropdown{left:0;background:transparent;min-width:100%;top:auto}.top-bar-section .dropdown li a{background:#333;color:#fff;line-height:2.8125rem;padding:12px 0.9375rem;white-space:nowrap}.top-bar-section .dropdown li:not(.has-form):not(.active)>a:not(.button){background:#333;color:#fff}.top-bar-section .dropdown li:not(.has-form):not(.active):hover>a:not(.button){background-color:#555;color:#fff;background:#222}.top-bar-section .dropdown li label{background:#333;white-space:nowrap}.top-bar-section .dropdown li .dropdown{left:100%;top:0}.top-bar-section>ul>.divider,.top-bar-section>ul>[role="separator"]{border-right:solid 1px #4e4e4e;border-bottom:none;border-top:none;clear:none;height:2.8125rem;width:0}.top-bar-section .has-form{background:#333;height:2.8125rem;padding:0 0.9375rem}.top-bar-section .right li .dropdown{left:auto;right:0}.top-bar-section .right li .dropdown li .dropdown{right:100%}.top-bar-section .left li .dropdown{right:auto;left:0}.top-bar-section .left li .dropdown li .dropdown{left:100%}.no-js .top-bar-section ul li:hover>a{background-color:#555;background:#222;color:#fff}.no-js .top-bar-section ul li:active>a{background:#008CBA;color:#fff}.no-js .top-bar-section .has-dropdown:hover>.dropdown{position:static !important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute !important}.no-js .top-bar-section .has-dropdown>a:focus+.dropdown{position:static !important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute !important}}.breadcrumbs{border-style:solid;border-width:1px;display:block;list-style:none;margin-left:0;overflow:hidden;padding:0.5625rem 0.875rem 0.5625rem;background-color:#f4f4f4;border-color:#dcdcdc;border-radius:3px}.breadcrumbs>*{color:#008CBA;float:left;font-size:0.6875rem;line-height:0.6875rem;margin:0;text-transform:uppercase}.breadcrumbs>*:hover a,.breadcrumbs>*:focus a{text-decoration:underline}.breadcrumbs>* a{color:#008CBA}.breadcrumbs>*.current{color:#333;cursor:default}.breadcrumbs>*.current a{color:#333;cursor:default}.breadcrumbs>*.current:hover,.breadcrumbs>*.current:hover a,.breadcrumbs>*.current:focus,.breadcrumbs>*.current:focus a{text-decoration:none}.breadcrumbs>*.unavailable{color:#999}.breadcrumbs>*.unavailable a{color:#999}.breadcrumbs>*.unavailable:hover,.breadcrumbs>*.unavailable:hover a,.breadcrumbs>*.unavailable:focus,.breadcrumbs>*.unavailable a:focus{color:#999;cursor:not-allowed;text-decoration:none}.breadcrumbs>*:before{color:#aaa;content:"/";margin:0 0.75rem;position:relative;top:1px}.breadcrumbs>*:first-child:before{content:" ";margin:0}[aria-label="breadcrumbs"] [aria-hidden="true"]:after{content:"/"}.alert-box{border-style:solid;border-width:1px;display:block;font-size:0.8125rem;font-weight:normal;margin-bottom:1.25rem;padding:0.875rem 1.5rem 0.875rem 0.875rem;position:relative;transition:opacity 300ms ease-out;background-color:#008CBA;border-color:#0078a0;color:#fff}.alert-box .close{right:0.25rem;background:inherit;color:#333;font-size:1.375rem;line-height:.9;margin-top:-0.6875rem;opacity:0.3;padding:0 6px 4px;position:absolute;top:50%}.alert-box .close:hover,.alert-box .close:focus{opacity:0.5}.alert-box.radius{border-radius:3px}.alert-box.round{border-radius:1000px}.alert-box.success{background-color:#43AC6A;border-color:#3a945b;color:#fff}.alert-box.alert{background-color:#f04124;border-color:#de2d0f;color:#fff}.alert-box.secondary{background-color:#e7e7e7;border-color:#c7c7c7;color:#4f4f4f}.alert-box.warning{background-color:#f08a24;border-color:#de770f;color:#fff}.alert-box.info{background-color:#a0d3e8;border-color:#74bfdd;color:#4f4f4f}.alert-box.alert-close{opacity:0}.inline-list{list-style:none;margin-left:-1.375rem;margin-right:0;margin:0 auto 1.0625rem auto;overflow:hidden;padding:0}.inline-list>li{display:block;float:left;list-style:none;margin-left:1.375rem}.inline-list>li>*{display:block}.button-group{list-style:none;margin:0;left:0}.button-group:before,.button-group:after{content:" ";display:table}.button-group:after{clear:both}.button-group.even-2 li{display:inline-block;margin:0 -2px;width:50%}.button-group.even-2 li>button,.button-group.even-2 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-2 li:first-child button,.button-group.even-2 li:first-child .button{border-left:0}.button-group.even-2 li button,.button-group.even-2 li .button{width:100%}.button-group.even-3 li{display:inline-block;margin:0 -2px;width:33.33333%}.button-group.even-3 li>button,.button-group.even-3 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-3 li:first-child button,.button-group.even-3 li:first-child .button{border-left:0}.button-group.even-3 li button,.button-group.even-3 li .button{width:100%}.button-group.even-4 li{display:inline-block;margin:0 -2px;width:25%}.button-group.even-4 li>button,.button-group.even-4 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-4 li:first-child button,.button-group.even-4 li:first-child .button{border-left:0}.button-group.even-4 li button,.button-group.even-4 li .button{width:100%}.button-group.even-5 li{display:inline-block;margin:0 -2px;width:20%}.button-group.even-5 li>button,.button-group.even-5 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-5 li:first-child button,.button-group.even-5 li:first-child .button{border-left:0}.button-group.even-5 li button,.button-group.even-5 li .button{width:100%}.button-group.even-6 li{display:inline-block;margin:0 -2px;width:16.66667%}.button-group.even-6 li>button,.button-group.even-6 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-6 li:first-child button,.button-group.even-6 li:first-child .button{border-left:0}.button-group.even-6 li button,.button-group.even-6 li .button{width:100%}.button-group.even-7 li{display:inline-block;margin:0 -2px;width:14.28571%}.button-group.even-7 li>button,.button-group.even-7 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-7 li:first-child button,.button-group.even-7 li:first-child .button{border-left:0}.button-group.even-7 li button,.button-group.even-7 li .button{width:100%}.button-group.even-8 li{display:inline-block;margin:0 -2px;width:12.5%}.button-group.even-8 li>button,.button-group.even-8 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-8 li:first-child button,.button-group.even-8 li:first-child .button{border-left:0}.button-group.even-8 li button,.button-group.even-8 li .button{width:100%}.button-group>li{display:inline-block;margin:0 -2px}.button-group>li>button,.button-group>li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group>li:first-child button,.button-group>li:first-child .button{border-left:0}.button-group.stack>li{display:block;margin:0;float:none}.button-group.stack>li>button,.button-group.stack>li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.stack>li:first-child button,.button-group.stack>li:first-child .button{border-left:0}.button-group.stack>li>button,.button-group.stack>li .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.stack>li>button{width:100%}.button-group.stack>li:first-child button,.button-group.stack>li:first-child .button{border-top:0}.button-group.stack-for-small>li{display:inline-block;margin:0 -2px}.button-group.stack-for-small>li>button,.button-group.stack-for-small>li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.stack-for-small>li:first-child button,.button-group.stack-for-small>li:first-child .button{border-left:0}@media only screen and (max-width: 40em){.button-group.stack-for-small>li{display:block;margin:0}.button-group.stack-for-small>li>button,.button-group.stack-for-small>li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.stack-for-small>li:first-child button,.button-group.stack-for-small>li:first-child .button{border-left:0}.button-group.stack-for-small>li>button,.button-group.stack-for-small>li .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.stack-for-small>li>button{width:100%}.button-group.stack-for-small>li:first-child button,.button-group.stack-for-small>li:first-child .button{border-top:0}}.button-group.radius>*{display:inline-block;margin:0 -2px}.button-group.radius>*>button,.button-group.radius>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.radius>*:first-child button,.button-group.radius>*:first-child .button{border-left:0}.button-group.radius>*,.button-group.radius>*>a,.button-group.radius>*>button,.button-group.radius>*>.button{border-radius:0}.button-group.radius>*:first-child,.button-group.radius>*:first-child>a,.button-group.radius>*:first-child>button,.button-group.radius>*:first-child>.button{-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.button-group.radius>*:last-child,.button-group.radius>*:last-child>a,.button-group.radius>*:last-child>button,.button-group.radius>*:last-child>.button{-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.button-group.radius.stack>*{display:block;margin:0}.button-group.radius.stack>*>button,.button-group.radius.stack>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.radius.stack>*:first-child button,.button-group.radius.stack>*:first-child .button{border-left:0}.button-group.radius.stack>*>button,.button-group.radius.stack>* .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.radius.stack>*>button{width:100%}.button-group.radius.stack>*:first-child button,.button-group.radius.stack>*:first-child .button{border-top:0}.button-group.radius.stack>*,.button-group.radius.stack>*>a,.button-group.radius.stack>*>button,.button-group.radius.stack>*>.button{border-radius:0}.button-group.radius.stack>*:first-child,.button-group.radius.stack>*:first-child>a,.button-group.radius.stack>*:first-child>button,.button-group.radius.stack>*:first-child>.button{-webkit-top-left-radius:3px;-webkit-top-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px}.button-group.radius.stack>*:last-child,.button-group.radius.stack>*:last-child>a,.button-group.radius.stack>*:last-child>button,.button-group.radius.stack>*:last-child>.button{-webkit-bottom-left-radius:3px;-webkit-bottom-right-radius:3px;border-bottom-left-radius:3px;border-bottom-right-radius:3px}@media only screen and (min-width: 40.0625em){.button-group.radius.stack-for-small>*{display:inline-block;margin:0 -2px}.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.radius.stack-for-small>*:first-child button,.button-group.radius.stack-for-small>*:first-child .button{border-left:0}.button-group.radius.stack-for-small>*,.button-group.radius.stack-for-small>*>a,.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>*>.button{border-radius:0}.button-group.radius.stack-for-small>*:first-child,.button-group.radius.stack-for-small>*:first-child>a,.button-group.radius.stack-for-small>*:first-child>button,.button-group.radius.stack-for-small>*:first-child>.button{-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.button-group.radius.stack-for-small>*:last-child,.button-group.radius.stack-for-small>*:last-child>a,.button-group.radius.stack-for-small>*:last-child>button,.button-group.radius.stack-for-small>*:last-child>.button{-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}}@media only screen and (max-width: 40em){.button-group.radius.stack-for-small>*{display:block;margin:0}.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.radius.stack-for-small>*:first-child button,.button-group.radius.stack-for-small>*:first-child .button{border-left:0}.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>* .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.radius.stack-for-small>*>button{width:100%}.button-group.radius.stack-for-small>*:first-child button,.button-group.radius.stack-for-small>*:first-child .button{border-top:0}.button-group.radius.stack-for-small>*,.button-group.radius.stack-for-small>*>a,.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>*>.button{border-radius:0}.button-group.radius.stack-for-small>*:first-child,.button-group.radius.stack-for-small>*:first-child>a,.button-group.radius.stack-for-small>*:first-child>button,.button-group.radius.stack-for-small>*:first-child>.button{-webkit-top-left-radius:3px;-webkit-top-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px}.button-group.radius.stack-for-small>*:last-child,.button-group.radius.stack-for-small>*:last-child>a,.button-group.radius.stack-for-small>*:last-child>button,.button-group.radius.stack-for-small>*:last-child>.button{-webkit-bottom-left-radius:3px;-webkit-bottom-right-radius:3px;border-bottom-left-radius:3px;border-bottom-right-radius:3px}}.button-group.round>*{display:inline-block;margin:0 -2px}.button-group.round>*>button,.button-group.round>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.round>*:first-child button,.button-group.round>*:first-child .button{border-left:0}.button-group.round>*,.button-group.round>*>a,.button-group.round>*>button,.button-group.round>*>.button{border-radius:0}.button-group.round>*:first-child,.button-group.round>*:first-child>a,.button-group.round>*:first-child>button,.button-group.round>*:first-child>.button{-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.button-group.round>*:last-child,.button-group.round>*:last-child>a,.button-group.round>*:last-child>button,.button-group.round>*:last-child>.button{-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}.button-group.round.stack>*{display:block;margin:0}.button-group.round.stack>*>button,.button-group.round.stack>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.round.stack>*:first-child button,.button-group.round.stack>*:first-child .button{border-left:0}.button-group.round.stack>*>button,.button-group.round.stack>* .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.round.stack>*>button{width:100%}.button-group.round.stack>*:first-child button,.button-group.round.stack>*:first-child .button{border-top:0}.button-group.round.stack>*,.button-group.round.stack>*>a,.button-group.round.stack>*>button,.button-group.round.stack>*>.button{border-radius:0}.button-group.round.stack>*:first-child,.button-group.round.stack>*:first-child>a,.button-group.round.stack>*:first-child>button,.button-group.round.stack>*:first-child>.button{-webkit-top-left-radius:1rem;-webkit-top-right-radius:1rem;border-top-left-radius:1rem;border-top-right-radius:1rem}.button-group.round.stack>*:last-child,.button-group.round.stack>*:last-child>a,.button-group.round.stack>*:last-child>button,.button-group.round.stack>*:last-child>.button{-webkit-bottom-left-radius:1rem;-webkit-bottom-right-radius:1rem;border-bottom-left-radius:1rem;border-bottom-right-radius:1rem}@media only screen and (min-width: 40.0625em){.button-group.round.stack-for-small>*{display:inline-block;margin:0 -2px}.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.round.stack-for-small>*:first-child button,.button-group.round.stack-for-small>*:first-child .button{border-left:0}.button-group.round.stack-for-small>*,.button-group.round.stack-for-small>*>a,.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>*>.button{border-radius:0}.button-group.round.stack-for-small>*:first-child,.button-group.round.stack-for-small>*:first-child>a,.button-group.round.stack-for-small>*:first-child>button,.button-group.round.stack-for-small>*:first-child>.button{-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.button-group.round.stack-for-small>*:last-child,.button-group.round.stack-for-small>*:last-child>a,.button-group.round.stack-for-small>*:last-child>button,.button-group.round.stack-for-small>*:last-child>.button{-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}}@media only screen and (max-width: 40em){.button-group.round.stack-for-small>*{display:block;margin:0}.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.round.stack-for-small>*:first-child button,.button-group.round.stack-for-small>*:first-child .button{border-left:0}.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>* .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.round.stack-for-small>*>button{width:100%}.button-group.round.stack-for-small>*:first-child button,.button-group.round.stack-for-small>*:first-child .button{border-top:0}.button-group.round.stack-for-small>*,.button-group.round.stack-for-small>*>a,.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>*>.button{border-radius:0}.button-group.round.stack-for-small>*:first-child,.button-group.round.stack-for-small>*:first-child>a,.button-group.round.stack-for-small>*:first-child>button,.button-group.round.stack-for-small>*:first-child>.button{-webkit-top-left-radius:1rem;-webkit-top-right-radius:1rem;border-top-left-radius:1rem;border-top-right-radius:1rem}.button-group.round.stack-for-small>*:last-child,.button-group.round.stack-for-small>*:last-child>a,.button-group.round.stack-for-small>*:last-child>button,.button-group.round.stack-for-small>*:last-child>.button{-webkit-bottom-left-radius:1rem;-webkit-bottom-right-radius:1rem;border-bottom-left-radius:1rem;border-bottom-right-radius:1rem}}.button-bar:before,.button-bar:after{content:" ";display:table}.button-bar:after{clear:both}.button-bar .button-group{float:left;margin-right:0.625rem}.button-bar .button-group div{overflow:hidden}.panel{border-style:solid;border-width:1px;border-color:#d8d8d8;margin-bottom:1.25rem;padding:1.25rem;background:#f2f2f2;color:#333}.panel>:first-child{margin-top:0}.panel>:last-child{margin-bottom:0}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6,.panel p,.panel li,.panel dl{color:#333}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6{line-height:1;margin-bottom:0.625rem}.panel h1.subheader,.panel h2.subheader,.panel h3.subheader,.panel h4.subheader,.panel h5.subheader,.panel h6.subheader{line-height:1.4}.panel.callout{border-style:solid;border-width:1px;border-color:#d8d8d8;margin-bottom:1.25rem;padding:1.25rem;background:#ecfaff;color:#333}.panel.callout>:first-child{margin-top:0}.panel.callout>:last-child{margin-bottom:0}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6,.panel.callout p,.panel.callout li,.panel.callout dl{color:#333}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6{line-height:1;margin-bottom:0.625rem}.panel.callout h1.subheader,.panel.callout h2.subheader,.panel.callout h3.subheader,.panel.callout h4.subheader,.panel.callout h5.subheader,.panel.callout h6.subheader{line-height:1.4}.panel.callout a:not(.button){color:#008CBA}.panel.callout a:not(.button):hover,.panel.callout a:not(.button):focus{color:#0078a0}.panel.radius{border-radius:3px}.dropdown.button,button.dropdown{position:relative;padding-right:3.5625rem}.dropdown.button::after,button.dropdown::after{border-color:#fff transparent transparent transparent;border-style:solid;content:"";display:block;height:0;position:absolute;top:50%;width:0}.dropdown.button::after,button.dropdown::after{border-width:0.375rem;right:1.40625rem;margin-top:-0.15625rem}.dropdown.button::after,button.dropdown::after{border-color:#fff transparent transparent transparent}.dropdown.button.tiny,button.dropdown.tiny{padding-right:2.625rem}.dropdown.button.tiny:after,button.dropdown.tiny:after{border-width:0.375rem;right:1.125rem;margin-top:-0.125rem}.dropdown.button.tiny::after,button.dropdown.tiny::after{border-color:#fff transparent transparent transparent}.dropdown.button.small,button.dropdown.small{padding-right:3.0625rem}.dropdown.button.small::after,button.dropdown.small::after{border-width:0.4375rem;right:1.3125rem;margin-top:-0.15625rem}.dropdown.button.small::after,button.dropdown.small::after{border-color:#fff transparent transparent transparent}.dropdown.button.large,button.dropdown.large{padding-right:3.625rem}.dropdown.button.large::after,button.dropdown.large::after{border-width:0.3125rem;right:1.71875rem;margin-top:-0.15625rem}.dropdown.button.large::after,button.dropdown.large::after{border-color:#fff transparent transparent transparent}.dropdown.button.secondary:after,button.dropdown.secondary:after{border-color:#333 transparent transparent transparent}.th{border:solid 4px #fff;box-shadow:0 0 0 1px rgba(0,0,0,0.2);display:inline-block;line-height:0;max-width:100%;transition:all 200ms ease-out}.th:hover,.th:focus{box-shadow:0 0 6px 1px rgba(0,140,186,0.5)}.th.radius{border-radius:3px}.pricing-table{border:solid 1px #ddd;margin-left:0;margin-bottom:1.25rem}.pricing-table *{list-style:none;line-height:1}.pricing-table .title{background-color:#333;color:#eee;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:1rem;font-weight:normal;padding:0.9375rem 1.25rem;text-align:center}.pricing-table .price{background-color:#F6F6F6;color:#333;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:2rem;font-weight:normal;padding:0.9375rem 1.25rem;text-align:center}.pricing-table .description{background-color:#fff;border-bottom:dotted 1px #ddd;color:#777;font-size:0.75rem;font-weight:normal;line-height:1.4;padding:0.9375rem;text-align:center}.pricing-table .bullet-item{background-color:#fff;border-bottom:dotted 1px #ddd;color:#333;font-size:0.875rem;font-weight:normal;padding:0.9375rem;text-align:center}.pricing-table .cta-button{background-color:#fff;padding:1.25rem 1.25rem 0;text-align:center}@-webkit-keyframes rotate{from{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{from{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}.slideshow-wrapper{position:relative}.slideshow-wrapper ul{list-style-type:none;margin:0}.slideshow-wrapper ul li,.slideshow-wrapper ul li .orbit-caption{display:none}.slideshow-wrapper ul li:first-child{display:block}.slideshow-wrapper .orbit-container{background-color:transparent}.slideshow-wrapper .orbit-container li{display:block}.slideshow-wrapper .orbit-container li .orbit-caption{display:block}.slideshow-wrapper .orbit-container .orbit-bullets li{display:inline-block}.slideshow-wrapper .preloader{border-radius:1000px;animation-duration:1.5s;animation-iteration-count:infinite;animation-name:rotate;animation-timing-function:linear;border-color:#555 #fff;border:solid 3px;display:block;height:40px;left:50%;margin-left:-20px;margin-top:-20px;position:absolute;top:50%;width:40px}.orbit-container{background:none;overflow:hidden;position:relative;width:100%}.orbit-container .orbit-slides-container{list-style:none;margin:0;padding:0;position:relative;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}.orbit-container .orbit-slides-container img{display:block;max-width:100%}.orbit-container .orbit-slides-container>*{position:absolute;top:0;width:100%;margin-left:100%}.orbit-container .orbit-slides-container>*:first-child{margin-left:0}.orbit-container .orbit-slides-container>* .orbit-caption{bottom:0;position:absolute;background-color:rgba(51,51,51,0.8);color:#fff;font-size:0.875rem;padding:0.625rem 0.875rem;width:100%}.orbit-container .orbit-slide-number{left:10px;background:transparent;color:#fff;font-size:12px;position:absolute;top:10px;z-index:10}.orbit-container .orbit-slide-number span{font-weight:700;padding:0.3125rem}.orbit-container .orbit-timer{position:absolute;top:12px;right:10px;height:6px;width:100px;z-index:10}.orbit-container .orbit-timer .orbit-progress{height:3px;background-color:rgba(255,255,255,0.3);display:block;width:0;position:relative;right:20px;top:5px}.orbit-container .orbit-timer>span{border:solid 4px #fff;border-bottom:none;border-top:none;display:none;height:14px;position:absolute;top:0;width:11px;right:0}.orbit-container .orbit-timer.paused>span{top:0;width:11px;height:14px;border:inset 8px;border-left-style:solid;border-color:transparent;border-left-color:#fff;right:-4px}.orbit-container .orbit-timer.paused>span.dark{border-left-color:#333}.orbit-container:hover .orbit-timer>span{display:block}.orbit-container .orbit-prev,.orbit-container .orbit-next{background-color:transparent;color:white;height:60px;line-height:50px;margin-top:-25px;position:absolute;text-indent:-9999px !important;top:45%;width:36px;z-index:10}.orbit-container .orbit-prev:hover,.orbit-container .orbit-next:hover{background-color:rgba(0,0,0,0.3)}.orbit-container .orbit-prev>span,.orbit-container .orbit-next>span{border:inset 10px;display:block;height:0;margin-top:-10px;position:absolute;top:50%;width:0}.orbit-container .orbit-prev{left:0}.orbit-container .orbit-prev>span{border-right-style:solid;border-color:transparent;border-right-color:#fff}.orbit-container .orbit-prev:hover>span{border-right-color:#fff}.orbit-container .orbit-next{right:0}.orbit-container .orbit-next>span{border-color:transparent;border-left-style:solid;border-left-color:#fff;left:50%;margin-left:-4px}.orbit-container .orbit-next:hover>span{border-left-color:#fff}.orbit-bullets-container{text-align:center}.orbit-bullets{display:block;float:none;margin:0 auto 30px auto;overflow:hidden;position:relative;text-align:center;top:10px}.orbit-bullets li{background:#ccc;cursor:pointer;display:inline-block;float:none;height:0.5625rem;margin-right:6px;width:0.5625rem;border-radius:1000px}.orbit-bullets li.active{background:#999}.orbit-bullets li:last-child{margin-right:0}.touch .orbit-container .orbit-prev,.touch .orbit-container .orbit-next{display:none}.touch .orbit-bullets{display:none}@media only screen and (min-width: 40.0625em){.touch .orbit-container .orbit-prev,.touch .orbit-container .orbit-next{display:inherit}.touch .orbit-bullets{display:block}}@media only screen and (max-width: 40em){.orbit-stack-on-small .orbit-slides-container{height:auto !important}.orbit-stack-on-small .orbit-slides-container>*{margin:0 !important;opacity:1 !important;position:relative}.orbit-stack-on-small .orbit-slide-number{display:none}.orbit-timer{display:none}.orbit-next,.orbit-prev{display:none}.orbit-bullets{display:none}}[data-magellan-expedition],[data-magellan-expedition-clone]{background:#fff;min-width:100%;padding:10px;z-index:50}[data-magellan-expedition] .sub-nav,[data-magellan-expedition-clone] .sub-nav{margin-bottom:0}[data-magellan-expedition] .sub-nav dd,[data-magellan-expedition-clone] .sub-nav dd{margin-bottom:0}[data-magellan-expedition] .sub-nav a,[data-magellan-expedition-clone] .sub-nav a{line-height:1.8em}.icon-bar{display:inline-block;font-size:0;width:100%;background:#333}.icon-bar>*{display:block;float:left;font-size:1rem;margin:0 auto;padding:1.25rem;text-align:center;width:25%}.icon-bar>* i,.icon-bar>* img{display:block;margin:0 auto}.icon-bar>* i+label,.icon-bar>* img+label{margin-top:.0625rem}.icon-bar>* i{font-size:1.875rem;vertical-align:middle}.icon-bar>* img{height:1.875rem;width:1.875rem}.icon-bar.label-right>* i,.icon-bar.label-right>* img{display:inline-block;margin:0 .0625rem 0 0}.icon-bar.label-right>* i+label,.icon-bar.label-right>* img+label{margin-top:0}.icon-bar.label-right>* label{display:inline-block}.icon-bar.vertical.label-right>*{text-align:left}.icon-bar.vertical,.icon-bar.small-vertical{height:100%;width:auto}.icon-bar.vertical .item,.icon-bar.small-vertical .item{float:none;margin:auto;width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.medium-vertical{height:100%;width:auto}.icon-bar.medium-vertical .item{float:none;margin:auto;width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.large-vertical{height:100%;width:auto}.icon-bar.large-vertical .item{float:none;margin:auto;width:auto}}.icon-bar>*{font-size:1rem;padding:1.25rem}.icon-bar>* i+label,.icon-bar>* img+label{margin-top:.0625rem;font-size:1rem}.icon-bar>* i{font-size:1.875rem}.icon-bar>* img{height:1.875rem;width:1.875rem}.icon-bar>* label{color:#fff}.icon-bar>* i{color:#fff}.icon-bar>a:hover{background:#008CBA}.icon-bar>a:hover label{color:#fff}.icon-bar>a:hover i{color:#fff}.icon-bar>a.active{background:#008CBA}.icon-bar>a.active label{color:#fff}.icon-bar>a.active i{color:#fff}.icon-bar .item.disabled{cursor:not-allowed;opacity:0.7;pointer-events:none}.icon-bar .item.disabled>*{opacity:0.7;cursor:not-allowed}.icon-bar.two-up .item{width:50%}.icon-bar.two-up.vertical .item,.icon-bar.two-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.two-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.two-up.large-vertical .item{width:auto}}.icon-bar.three-up .item{width:33.3333%}.icon-bar.three-up.vertical .item,.icon-bar.three-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.three-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.three-up.large-vertical .item{width:auto}}.icon-bar.four-up .item{width:25%}.icon-bar.four-up.vertical .item,.icon-bar.four-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.four-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.four-up.large-vertical .item{width:auto}}.icon-bar.five-up .item{width:20%}.icon-bar.five-up.vertical .item,.icon-bar.five-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.five-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.five-up.large-vertical .item{width:auto}}.icon-bar.six-up .item{width:16.66667%}.icon-bar.six-up.vertical .item,.icon-bar.six-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.six-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.six-up.large-vertical .item{width:auto}}.icon-bar.seven-up .item{width:14.28571%}.icon-bar.seven-up.vertical .item,.icon-bar.seven-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.seven-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.seven-up.large-vertical .item{width:auto}}.icon-bar.eight-up .item{width:12.5%}.icon-bar.eight-up.vertical .item,.icon-bar.eight-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.eight-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.eight-up.large-vertical .item{width:auto}}.icon-bar.two-up .item{width:50%}.icon-bar.two-up.vertical .item,.icon-bar.two-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.two-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.two-up.large-vertical .item{width:auto}}.icon-bar.three-up .item{width:33.3333%}.icon-bar.three-up.vertical .item,.icon-bar.three-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.three-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.three-up.large-vertical .item{width:auto}}.icon-bar.four-up .item{width:25%}.icon-bar.four-up.vertical .item,.icon-bar.four-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.four-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.four-up.large-vertical .item{width:auto}}.icon-bar.five-up .item{width:20%}.icon-bar.five-up.vertical .item,.icon-bar.five-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.five-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.five-up.large-vertical .item{width:auto}}.icon-bar.six-up .item{width:16.66667%}.icon-bar.six-up.vertical .item,.icon-bar.six-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.six-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.six-up.large-vertical .item{width:auto}}.icon-bar.seven-up .item{width:14.28571%}.icon-bar.seven-up.vertical .item,.icon-bar.seven-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.seven-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.seven-up.large-vertical .item{width:auto}}.icon-bar.eight-up .item{width:12.5%}.icon-bar.eight-up.vertical .item,.icon-bar.eight-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.eight-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.eight-up.large-vertical .item{width:auto}}.tabs{margin-bottom:0 !important;margin-left:0}.tabs:before,.tabs:after{content:" ";display:table}.tabs:after{clear:both}.tabs dd,.tabs .tab-title{float:left;list-style:none;margin-bottom:0 !important;position:relative}.tabs dd>a,.tabs .tab-title>a{display:block;background-color:#EFEFEF;color:#222;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:1rem;padding:1rem 2rem}.tabs dd>a:hover,.tabs .tab-title>a:hover{background-color:#e1e1e1}.tabs dd.active a,.tabs .tab-title.active a{background-color:#fff;color:#222}.tabs.radius dd:first-child a,.tabs.radius .tab:first-child a{-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.tabs.radius dd:last-child a,.tabs.radius .tab:last-child a{-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.tabs.vertical dd,.tabs.vertical .tab-title{position:inherit;float:none;display:block;top:auto}.tabs-content{margin-bottom:1.5rem;width:100%}.tabs-content:before,.tabs-content:after{content:" ";display:table}.tabs-content:after{clear:both}.tabs-content>.content{display:none;float:left;padding:0.9375rem 0;width:100%}.tabs-content>.content.active{display:block;float:none}.tabs-content>.content.contained{padding:0.9375rem}.tabs-content.vertical{display:block}.tabs-content.vertical>.content{padding:0 0.9375rem}@media only screen and (min-width: 40.0625em){.tabs.vertical{float:left;margin:0;margin-bottom:1.25rem !important;max-width:20%;width:20%}.tabs-content.vertical{float:left;margin-left:-1px;max-width:80%;padding-left:1rem;width:80%}}.no-js .tabs-content>.content{display:block;float:none}ul.pagination{display:block;margin-left:-0.3125rem;min-height:1.5rem}ul.pagination li{color:#222;font-size:0.875rem;height:1.5rem;margin-left:0.3125rem}ul.pagination li a,ul.pagination li button{border-radius:3px;transition:background-color 300ms ease-out;background:none;color:#999;display:block;font-size:1em;font-weight:normal;line-height:inherit;padding:0.0625rem 0.625rem 0.0625rem}ul.pagination li:hover a,ul.pagination li a:focus,ul.pagination li:hover button,ul.pagination li button:focus{background:#e6e6e6}ul.pagination li.unavailable a,ul.pagination li.unavailable button{cursor:default;color:#999}ul.pagination li.unavailable:hover a,ul.pagination li.unavailable a:focus,ul.pagination li.unavailable:hover button,ul.pagination li.unavailable button:focus{background:transparent}ul.pagination li.current a,ul.pagination li.current button{background:#008CBA;color:#fff;cursor:default;font-weight:bold}ul.pagination li.current a:hover,ul.pagination li.current a:focus,ul.pagination li.current button:hover,ul.pagination li.current button:focus{background:#008CBA}ul.pagination li{display:block;float:left}.pagination-centered{text-align:center}.pagination-centered ul.pagination li{display:inline-block;float:none}.side-nav{display:block;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;list-style-position:outside;list-style-type:none;margin:0;padding:0.875rem 0}.side-nav li{font-size:0.875rem;font-weight:normal;margin:0 0 0.4375rem 0}.side-nav li a:not(.button){color:#008CBA;display:block;margin:0;padding:0.4375rem 0.875rem}.side-nav li a:not(.button):hover,.side-nav li a:not(.button):focus{background:rgba(0,0,0,0.025);color:#1cc7ff}.side-nav li a:not(.button):active{color:#1cc7ff}.side-nav li.active>a:first-child:not(.button){color:#1cc7ff;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal}.side-nav li.divider{border-top:1px solid;height:0;list-style:none;padding:0;border-top-color:#e6e6e6}.side-nav li.heading{color:#008CBA;font-size:0.875rem;font-weight:bold;text-transform:uppercase}.accordion{margin-bottom:0}.accordion:before,.accordion:after{content:" ";display:table}.accordion:after{clear:both}.accordion .accordion-navigation,.accordion dd{display:block;margin-bottom:0 !important}.accordion .accordion-navigation.active>a,.accordion dd.active>a{background:#e8e8e8}.accordion .accordion-navigation>a,.accordion dd>a{background:#EFEFEF;color:#222;display:block;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:1rem;padding:1rem}.accordion .accordion-navigation>a:hover,.accordion dd>a:hover{background:#e3e3e3}.accordion .accordion-navigation>.content,.accordion dd>.content{display:none;padding:0.9375rem}.accordion .accordion-navigation>.content.active,.accordion dd>.content.active{background:#fff;display:block}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.text-justify{text-align:justify !important}@media only screen and (max-width: 40em){.small-only-text-left{text-align:left !important}.small-only-text-right{text-align:right !important}.small-only-text-center{text-align:center !important}.small-only-text-justify{text-align:justify !important}}@media only screen{.small-text-left{text-align:left !important}.small-text-right{text-align:right !important}.small-text-center{text-align:center !important}.small-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em) and (max-width: 64em){.medium-only-text-left{text-align:left !important}.medium-only-text-right{text-align:right !important}.medium-only-text-center{text-align:center !important}.medium-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em){.medium-text-left{text-align:left !important}.medium-text-right{text-align:right !important}.medium-text-center{text-align:center !important}.medium-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em) and (max-width: 90em){.large-only-text-left{text-align:left !important}.large-only-text-right{text-align:right !important}.large-only-text-center{text-align:center !important}.large-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em){.large-text-left{text-align:left !important}.large-text-right{text-align:right !important}.large-text-center{text-align:center !important}.large-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em) and (max-width: 120em){.xlarge-only-text-left{text-align:left !important}.xlarge-only-text-right{text-align:right !important}.xlarge-only-text-center{text-align:center !important}.xlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em){.xlarge-text-left{text-align:left !important}.xlarge-text-right{text-align:right !important}.xlarge-text-center{text-align:center !important}.xlarge-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em) and (max-width: 6249999.9375em){.xxlarge-only-text-left{text-align:left !important}.xxlarge-only-text-right{text-align:right !important}.xxlarge-only-text-center{text-align:center !important}.xxlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em){.xxlarge-text-left{text-align:left !important}.xxlarge-text-right{text-align:right !important}.xxlarge-text-center{text-align:center !important}.xxlarge-text-justify{text-align:justify !important}}div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}a{color:#008CBA;line-height:inherit;text-decoration:none}a:hover,a:focus{color:#0078a0}a img{border:none}p{font-family:inherit;font-size:1rem;font-weight:normal;line-height:1.6;margin-bottom:1.25rem;text-rendering:optimizeLegibility}p.lead{font-size:1.21875rem;line-height:1.6}p aside{font-size:0.875rem;font-style:italic;line-height:1.35}h1,h2,h3,h4,h5,h6{color:#222;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:normal;line-height:1.4;margin-bottom:0.5rem;margin-top:0.2rem;text-rendering:optimizeLegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#6f6f6f;font-size:60%;line-height:0}h1{font-size:2.125rem}h2{font-size:1.6875rem}h3{font-size:1.375rem}h4{font-size:1.125rem}h5{font-size:1.125rem}h6{font-size:1rem}.subheader{line-height:1.4;color:#6f6f6f;font-weight:normal;margin-top:0.2rem;margin-bottom:0.5rem}hr{border:solid #ddd;border-width:1px 0 0;clear:both;height:0;margin:1.25rem 0 1.1875rem}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:bold;line-height:inherit}small{font-size:60%;line-height:inherit}code{background-color:#f8f8f8;border-color:#dfdfdf;border-style:solid;border-width:1px;color:#333;font-family:Consolas,"Liberation Mono",Courier,monospace;font-weight:normal;padding:0.125rem 0.3125rem 0.0625rem}ul,ol,dl{font-family:inherit;font-size:1rem;line-height:1.6;list-style-position:outside;margin-bottom:1.25rem}ul{margin-left:1.1rem}ul.no-bullet{margin-left:0}ul.no-bullet li ul,ul.no-bullet li ol{margin-left:1.25rem;margin-bottom:0;list-style:none}ul li ul,ul li ol{margin-left:1.25rem;margin-bottom:0}ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}ul.square{list-style-type:square;margin-left:1.1rem}ul.circle{list-style-type:circle;margin-left:1.1rem}ul.disc{list-style-type:disc;margin-left:1.1rem}ul.no-bullet{list-style:none}ol{margin-left:1.4rem}ol li ul,ol li ol{margin-left:1.25rem;margin-bottom:0}dl dt{margin-bottom:0.3rem;font-weight:bold}dl dd{margin-bottom:0.75rem}abbr,acronym{text-transform:uppercase;font-size:90%;color:#222;cursor:help}abbr{text-transform:none}abbr[title]{border-bottom:1px dotted #ddd}blockquote{margin:0 0 1.25rem;padding:0.5625rem 1.25rem 0 1.1875rem;border-left:1px solid #ddd}blockquote cite{display:block;font-size:0.8125rem;color:#555}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:#555}blockquote,blockquote p{line-height:1.6;color:#6f6f6f}.vcard{display:inline-block;margin:0 0 1.25rem 0;border:1px solid #ddd;padding:0.625rem 0.75rem}.vcard li{margin:0;display:block}.vcard .fn{font-weight:bold;font-size:0.9375rem}.vevent .summary{font-weight:bold}.vevent abbr{cursor:default;text-decoration:none;font-weight:bold;border:none;padding:0 0.0625rem}@media only screen and (min-width: 40.0625em){h1,h2,h3,h4,h5,h6{line-height:1.4}h1{font-size:2.75rem}h2{font-size:2.3125rem}h3{font-size:1.6875rem}h4{font-size:1.4375rem}h5{font-size:1.125rem}h6{font-size:1rem}}.split.button{position:relative;padding-right:5.0625rem}.split.button span{display:block;height:100%;position:absolute;right:0;top:0;border-left:solid 1px}.split.button span:after{position:absolute;content:"";width:0;height:0;display:block;border-style:inset;top:50%;left:50%}.split.button span:active{background-color:rgba(0,0,0,0.1)}.split.button span{border-left-color:rgba(255,255,255,0.5)}.split.button span{width:3.09375rem}.split.button span:after{border-top-style:solid;border-width:0.375rem;margin-left:-0.375rem;top:48%}.split.button span:after{border-color:#fff transparent transparent transparent}.split.button.secondary span{border-left-color:rgba(255,255,255,0.5)}.split.button.secondary span:after{border-color:#fff transparent transparent transparent}.split.button.alert span{border-left-color:rgba(255,255,255,0.5)}.split.button.success span{border-left-color:rgba(255,255,255,0.5)}.split.button.tiny{padding-right:3.75rem}.split.button.tiny span{width:2.25rem}.split.button.tiny span:after{border-top-style:solid;border-width:0.375rem;margin-left:-0.375rem;top:48%}.split.button.small{padding-right:4.375rem}.split.button.small span{width:2.625rem}.split.button.small span:after{border-top-style:solid;border-width:0.4375rem;margin-left:-0.375rem;top:48%}.split.button.large{padding-right:5.5rem}.split.button.large span{width:3.4375rem}.split.button.large span:after{border-top-style:solid;border-width:0.3125rem;margin-left:-0.375rem;top:48%}.split.button.expand{padding-left:2rem}.split.button.secondary span:after{border-color:#333 transparent transparent transparent}.split.button.radius span{-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.split.button.round span{-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}.split.button.no-pip span:before{border-style:none}.split.button.no-pip span:after{border-style:none}.split.button.no-pip span>i{display:block;left:50%;margin-left:-0.28889em;margin-top:-0.48889em;position:absolute;top:50%}.reveal-modal-bg{background:#000;background:rgba(0,0,0,0.45);bottom:0;display:none;left:0;position:fixed;right:0;top:0;z-index:1004;left:0}.reveal-modal{border-radius:3px;display:none;position:absolute;top:0;visibility:hidden;width:100%;z-index:1005;left:0;background-color:#fff;padding:1.875rem;border:solid 1px #666;box-shadow:0 0 10px rgba(0,0,0,0.4)}@media only screen and (max-width: 40em){.reveal-modal{min-height:100vh}}.reveal-modal .column,.reveal-modal .columns{min-width:0}.reveal-modal>:first-child{margin-top:0}.reveal-modal>:last-child{margin-bottom:0}@media only screen and (min-width: 40.0625em){.reveal-modal{left:0;margin:0 auto;max-width:62.5rem;right:0;width:80%}}@media only screen and (min-width: 40.0625em){.reveal-modal{top:6.25rem}}.reveal-modal.radius{border-radius:3px}.reveal-modal.round{border-radius:1000px}.reveal-modal.collapse{padding:0}@media only screen and (min-width: 40.0625em){.reveal-modal.tiny{left:0;margin:0 auto;max-width:62.5rem;right:0;width:30%}}@media only screen and (min-width: 40.0625em){.reveal-modal.small{left:0;margin:0 auto;max-width:62.5rem;right:0;width:40%}}@media only screen and (min-width: 40.0625em){.reveal-modal.medium{left:0;margin:0 auto;max-width:62.5rem;right:0;width:60%}}@media only screen and (min-width: 40.0625em){.reveal-modal.large{left:0;margin:0 auto;max-width:62.5rem;right:0;width:70%}}@media only screen and (min-width: 40.0625em){.reveal-modal.xlarge{left:0;margin:0 auto;max-width:62.5rem;right:0;width:95%}}.reveal-modal.full{height:100vh;height:100%;left:0;margin-left:0 !important;max-width:none !important;min-height:100vh;top:0}@media only screen and (min-width: 40.0625em){.reveal-modal.full{left:0;margin:0 auto;max-width:62.5rem;right:0;width:100%}}.reveal-modal.toback{z-index:1003}.reveal-modal .close-reveal-modal{color:#aaa;cursor:pointer;font-size:2.5rem;font-weight:bold;line-height:1;position:absolute;top:0.625rem;right:1.375rem}.has-tip{border-bottom:dotted 1px #ccc;color:#333;cursor:help;font-weight:bold}.has-tip:hover,.has-tip:focus{border-bottom:dotted 1px #003f54;color:#008CBA}.has-tip.tip-left,.has-tip.tip-right{float:none !important}.tooltip{background:#333;color:#fff;display:none;font-size:0.875rem;font-weight:normal;line-height:1.3;max-width:300px;padding:0.75rem;position:absolute;width:100%;z-index:1006;left:50%}.tooltip>.nub{border-color:transparent transparent #333 transparent;border:solid 5px;display:block;height:0;pointer-events:none;position:absolute;top:-10px;width:0;left:5px}.tooltip>.nub.rtl{left:auto;right:5px}.tooltip.radius{border-radius:3px}.tooltip.round{border-radius:1000px}.tooltip.round>.nub{left:2rem}.tooltip.opened{border-bottom:dotted 1px #003f54 !important;color:#008CBA !important}.tap-to-close{color:#777;display:block;font-size:0.625rem;font-weight:normal}@media only screen and (min-width: 40.0625em){.tooltip>.nub{border-color:transparent transparent #333 transparent;top:-10px}.tooltip.tip-top>.nub{border-color:#333 transparent transparent transparent;bottom:-10px;top:auto}.tooltip.tip-left,.tooltip.tip-right{float:none !important}.tooltip.tip-left>.nub{border-color:transparent transparent transparent #333;left:auto;margin-top:-5px;right:-10px;top:50%}.tooltip.tip-right>.nub{border-color:transparent #333 transparent transparent;left:-10px;margin-top:-5px;right:auto;top:50%}}.clearing-thumbs,[data-clearing]{list-style:none;margin-left:0;margin-bottom:0}.clearing-thumbs:before,.clearing-thumbs:after,[data-clearing]:before,[data-clearing]:after{content:" ";display:table}.clearing-thumbs:after,[data-clearing]:after{clear:both}.clearing-thumbs li,[data-clearing] li{float:left;margin-right:10px}.clearing-thumbs[class*="block-grid-"] li,[data-clearing][class*="block-grid-"] li{margin-right:0}.clearing-blackout{background:#333;height:100%;position:fixed;top:0;width:100%;z-index:998;left:0}.clearing-blackout .clearing-close{display:block}.clearing-container{height:100%;margin:0;overflow:hidden;position:relative;z-index:998}.clearing-touch-label{color:#aaa;font-size:.6em;left:50%;position:absolute;top:50%}.visible-img{height:95%;position:relative}.visible-img img{position:absolute;left:50%;top:50%;-webkit-transform:translateY(-50%) translateX(-50%);-moz-transform:translateY(-50%) translateX(-50%);-ms-transform:translateY(-50%) translateX(-50%);-o-transform:translateY(-50%) translateX(-50%);transform:translateY(-50%) translateX(-50%);max-height:100%;max-width:100%}.clearing-caption{background:#333;bottom:0;color:#ccc;font-size:0.875em;line-height:1.3;margin-bottom:0;padding:10px 30px 20px;position:absolute;text-align:center;width:100%;left:0}.clearing-close{color:#ccc;display:none;font-size:30px;line-height:1;padding-left:20px;padding-top:10px;z-index:999}.clearing-close:hover,.clearing-close:focus{color:#ccc}.clearing-assembled .clearing-container{height:100%}.clearing-assembled .clearing-container .carousel>ul{display:none}.clearing-feature li{display:none}.clearing-feature li.clearing-featured-img{display:block}@media only screen and (min-width: 40.0625em){.clearing-main-prev,.clearing-main-next{height:100%;position:absolute;top:0;width:40px}.clearing-main-prev>span,.clearing-main-next>span{border:solid 12px;display:block;height:0;position:absolute;top:50%;width:0}.clearing-main-prev>span:hover,.clearing-main-next>span:hover{opacity:.8}.clearing-main-prev{left:0}.clearing-main-prev>span{left:5px;border-color:transparent;border-right-color:#ccc}.clearing-main-next{right:0}.clearing-main-next>span{border-color:transparent;border-left-color:#ccc}.clearing-main-prev.disabled,.clearing-main-next.disabled{opacity:.3}.clearing-assembled .clearing-container .carousel{background:rgba(51,51,51,0.8);height:120px;margin-top:10px;text-align:center}.clearing-assembled .clearing-container .carousel>ul{display:inline-block;z-index:999;height:100%;position:relative;float:none}.clearing-assembled .clearing-container .carousel>ul li{clear:none;cursor:pointer;display:block;float:left;margin-right:0;min-height:inherit;opacity:.4;overflow:hidden;padding:0;position:relative;width:120px}.clearing-assembled .clearing-container .carousel>ul li.fix-height img{height:100%;max-width:none}.clearing-assembled .clearing-container .carousel>ul li a.th{border:none;box-shadow:none;display:block}.clearing-assembled .clearing-container .carousel>ul li img{cursor:pointer !important;width:100% !important}.clearing-assembled .clearing-container .carousel>ul li.visible{opacity:1}.clearing-assembled .clearing-container .carousel>ul li:hover{opacity:.8}.clearing-assembled .clearing-container .visible-img{background:#333;height:85%;overflow:hidden}.clearing-close{padding-left:0;padding-top:0;position:absolute;top:10px;right:20px}}.progress{background-color:#F6F6F6;border:1px solid #fff;height:1.5625rem;margin-bottom:0.625rem;padding:0.125rem}.progress .meter{background:#008CBA;display:block;height:100%}.progress.secondary .meter{background:#e7e7e7;display:block;height:100%}.progress.success .meter{background:#43AC6A;display:block;height:100%}.progress.alert .meter{background:#f04124;display:block;height:100%}.progress.radius{border-radius:3px}.progress.radius .meter{border-radius:2px}.progress.round{border-radius:1000px}.progress.round .meter{border-radius:999px}.sub-nav{display:block;margin:-0.25rem 0 1.125rem;overflow:hidden;padding-top:0.25rem;width:auto}.sub-nav dt{text-transform:uppercase}.sub-nav dt,.sub-nav dd,.sub-nav li{color:#999;float:left;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:0.875rem;font-weight:normal;margin-left:1rem;margin-bottom:0}.sub-nav dt a,.sub-nav dd a,.sub-nav li a{color:#999;padding:0.1875rem 1rem;text-decoration:none}.sub-nav dt a:hover,.sub-nav dd a:hover,.sub-nav li a:hover{color:#737373}.sub-nav dt.active a,.sub-nav dd.active a,.sub-nav li.active a{border-radius:3px;background:#008CBA;color:#fff;cursor:default;font-weight:normal;padding:0.1875rem 1rem}.sub-nav dt.active a:hover,.sub-nav dd.active a:hover,.sub-nav li.active a:hover{background:#0078a0}.joyride-list{display:none}.joyride-tip-guide{background:#333;color:#fff;display:none;font-family:inherit;font-weight:normal;position:absolute;top:0;width:95%;z-index:101;left:2.5%}.lt-ie9 .joyride-tip-guide{margin-left:-400px;max-width:800px;left:50%}.joyride-content-wrapper{padding:1.125rem 1.25rem 1.5rem;width:100%}.joyride-content-wrapper .button{margin-bottom:0 !important}.joyride-content-wrapper .joyride-prev-tip{margin-right:10px}.joyride-tip-guide .joyride-nub{border:10px solid #333;display:block;height:0;position:absolute;width:0;left:22px}.joyride-tip-guide .joyride-nub.top{border-color:#333;border-top-color:transparent !important;border-top-style:solid;border-left-color:transparent !important;border-right-color:transparent !important;top:-20px}.joyride-tip-guide .joyride-nub.bottom{border-color:#333 !important;border-bottom-color:transparent !important;border-bottom-style:solid;border-left-color:transparent !important;border-right-color:transparent !important;bottom:-20px}.joyride-tip-guide .joyride-nub.right{right:-20px}.joyride-tip-guide .joyride-nub.left{left:-20px}.joyride-tip-guide h1,.joyride-tip-guide h2,.joyride-tip-guide h3,.joyride-tip-guide h4,.joyride-tip-guide h5,.joyride-tip-guide h6{color:#fff;font-weight:bold;line-height:1.25;margin:0}.joyride-tip-guide p{font-size:0.875rem;line-height:1.3;margin:0 0 1.125rem 0}.joyride-timer-indicator-wrap{border:solid 1px #555;bottom:1rem;height:3px;position:absolute;width:50px;right:1.0625rem}.joyride-timer-indicator{background:#666;display:block;height:inherit;width:0}.joyride-close-tip{color:#777 !important;font-size:24px;font-weight:normal;line-height:.5 !important;position:absolute;text-decoration:none;top:10px;right:12px}.joyride-close-tip:hover,.joyride-close-tip:focus{color:#eee !important}.joyride-modal-bg{background:rgba(0,0,0,0.5);cursor:pointer;display:none;height:100%;position:fixed;top:0;width:100%;z-index:100;left:0}.joyride-expose-wrapper{background-color:#fff;border-radius:3px;box-shadow:0 0 15px #fff;position:absolute;z-index:102}.joyride-expose-cover{background:transparent;border-radius:3px;left:0;position:absolute;top:0;z-index:9999}@media only screen and (min-width: 40.0625em){.joyride-tip-guide{width:300px;left:inherit}.joyride-tip-guide .joyride-nub.bottom{border-color:#333 !important;border-bottom-color:transparent !important;border-left-color:transparent !important;border-right-color:transparent !important;bottom:-20px}.joyride-tip-guide .joyride-nub.right{border-color:#333 !important;border-right-color:transparent !important;border-bottom-color:transparent !important;border-top-color:transparent !important;left:auto;right:-20px;top:22px}.joyride-tip-guide .joyride-nub.left{border-color:#333 !important;border-bottom-color:transparent !important;border-left-color:transparent !important;border-top-color:transparent !important;left:-20px;right:auto;top:22px}}.label{display:inline-block;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal;line-height:1;margin-bottom:auto;position:relative;text-align:center;text-decoration:none;white-space:nowrap;padding:0.25rem 0.5rem 0.25rem;font-size:0.6875rem;background-color:#008CBA;color:#fff}.label.radius{border-radius:3px}.label.round{border-radius:1000px}.label.alert{background-color:#f04124;color:#fff}.label.warning{background-color:#f08a24;color:#fff}.label.success{background-color:#43AC6A;color:#fff}.label.secondary{background-color:#e7e7e7;color:#333}.label.info{background-color:#a0d3e8;color:#333}.off-canvas-wrap{-webkit-backface-visibility:hidden;position:relative;width:100%;overflow:hidden}.off-canvas-wrap.move-right,.off-canvas-wrap.move-left{min-height:100%;-webkit-overflow-scrolling:touch}.inner-wrap{position:relative;width:100%;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.inner-wrap:before,.inner-wrap:after{content:" ";display:table}.inner-wrap:after{clear:both}.tab-bar{-webkit-backface-visibility:hidden;background:#333;color:#fff;height:2.8125rem;line-height:2.8125rem;position:relative}.tab-bar h1,.tab-bar h2,.tab-bar h3,.tab-bar h4,.tab-bar h5,.tab-bar h6{color:#fff;font-weight:bold;line-height:2.8125rem;margin:0}.tab-bar h1,.tab-bar h2,.tab-bar h3,.tab-bar h4{font-size:1.125rem}.left-small{height:2.8125rem;position:absolute;top:0;width:2.8125rem;border-right:solid 1px #1a1a1a;left:0}.right-small{height:2.8125rem;position:absolute;top:0;width:2.8125rem;border-left:solid 1px #1a1a1a;right:0}.tab-bar-section{height:2.8125rem;padding:0 0.625rem;position:absolute;text-align:center;top:0}.tab-bar-section.left{text-align:left}.tab-bar-section.right{text-align:right}.tab-bar-section.left{left:0;right:2.8125rem}.tab-bar-section.right{left:2.8125rem;right:0}.tab-bar-section.middle{left:2.8125rem;right:2.8125rem}.tab-bar .menu-icon{color:#fff;display:block;height:2.8125rem;padding:0;position:relative;text-indent:2.1875rem;transform:translate3d(0, 0, 0);width:2.8125rem}.tab-bar .menu-icon span::after{content:"";display:block;height:0;position:absolute;top:50%;margin-top:-0.5rem;left:0.90625rem;box-shadow:0 0 0 1px #fff,0 7px 0 1px #fff,0 14px 0 1px #fff;width:1rem}.tab-bar .menu-icon span:hover:after{box-shadow:0 0 0 1px #b3b3b3,0 7px 0 1px #b3b3b3,0 14px 0 1px #b3b3b3}.left-off-canvas-menu{-webkit-backface-visibility:hidden;background:#333;bottom:0;box-sizing:content-box;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;transition:transform 500ms ease 0s;width:15.625rem;z-index:1001;-webkit-transform:translate3d(-100%, 0, 0);-moz-transform:translate3d(-100%, 0, 0);-ms-transform:translate(-100%, 0);-ms-transform:translate3d(-100%, 0, 0);-o-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.left-off-canvas-menu *{-webkit-backface-visibility:hidden}.right-off-canvas-menu{-webkit-backface-visibility:hidden;background:#333;bottom:0;box-sizing:content-box;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;transition:transform 500ms ease 0s;width:15.625rem;z-index:1001;-webkit-transform:translate3d(100%, 0, 0);-moz-transform:translate3d(100%, 0, 0);-ms-transform:translate(100%, 0);-ms-transform:translate3d(100%, 0, 0);-o-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);right:0}.right-off-canvas-menu *{-webkit-backface-visibility:hidden}ul.off-canvas-list{list-style-type:none;margin:0;padding:0}ul.off-canvas-list li label{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;display:block;font-size:0.75rem;font-weight:bold;margin:0;padding:0.3rem 0.9375rem;text-transform:uppercase}ul.off-canvas-list li a{border-bottom:1px solid #262626;color:rgba(255,255,255,0.7);display:block;padding:0.66667rem;transition:background 300ms ease}ul.off-canvas-list li a:hover{background:#242424}ul.off-canvas-list li a:active{background:#242424}.move-right>.inner-wrap{-webkit-transform:translate3d(15.625rem, 0, 0);-moz-transform:translate3d(15.625rem, 0, 0);-ms-transform:translate(15.625rem, 0);-ms-transform:translate3d(15.625rem, 0, 0);-o-transform:translate3d(15.625rem, 0, 0);transform:translate3d(15.625rem, 0, 0)}.move-right .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.move-right .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.move-left>.inner-wrap{-webkit-transform:translate3d(-15.625rem, 0, 0);-moz-transform:translate3d(-15.625rem, 0, 0);-ms-transform:translate(-15.625rem, 0);-ms-transform:translate3d(-15.625rem, 0, 0);-o-transform:translate3d(-15.625rem, 0, 0);transform:translate3d(-15.625rem, 0, 0)}.move-left .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.move-left .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.offcanvas-overlap .left-off-canvas-menu,.offcanvas-overlap .right-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.offcanvas-overlap .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.offcanvas-overlap-left .right-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap-left .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.offcanvas-overlap-left .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.offcanvas-overlap-right .left-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap-right .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.offcanvas-overlap-right .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.no-csstransforms .left-off-canvas-menu{left:-15.625rem}.no-csstransforms .right-off-canvas-menu{right:-15.625rem}.no-csstransforms .move-left>.inner-wrap{right:15.625rem}.no-csstransforms .move-right>.inner-wrap{left:15.625rem}.left-submenu{-webkit-backface-visibility:hidden;-webkit-overflow-scrolling:touch;background:#333;bottom:0;box-sizing:content-box;margin:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;width:15.625rem;z-index:1002;-webkit-transform:translate3d(-100%, 0, 0);-moz-transform:translate3d(-100%, 0, 0);-ms-transform:translate(-100%, 0);-ms-transform:translate3d(-100%, 0, 0);-o-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.left-submenu *{-webkit-backface-visibility:hidden}.left-submenu .back>a{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;font-weight:bold;padding:0.3rem 0.9375rem;text-transform:uppercase;margin:0}.left-submenu .back>a:hover{background:#303030;border-bottom:none;border-top:1px solid #5e5e5e}.left-submenu .back>a:before{content:"\AB";margin-right:.5rem;display:inline}.left-submenu.move-right,.left-submenu.offcanvas-overlap-right,.left-submenu.offcanvas-overlap{-webkit-transform:translate3d(0%, 0, 0);-moz-transform:translate3d(0%, 0, 0);-ms-transform:translate(0%, 0);-ms-transform:translate3d(0%, 0, 0);-o-transform:translate3d(0%, 0, 0);transform:translate3d(0%, 0, 0)}.right-submenu{-webkit-backface-visibility:hidden;-webkit-overflow-scrolling:touch;background:#333;bottom:0;box-sizing:content-box;margin:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;width:15.625rem;z-index:1002;-webkit-transform:translate3d(100%, 0, 0);-moz-transform:translate3d(100%, 0, 0);-ms-transform:translate(100%, 0);-ms-transform:translate3d(100%, 0, 0);-o-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);right:0;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.right-submenu *{-webkit-backface-visibility:hidden}.right-submenu .back>a{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;font-weight:bold;padding:0.3rem 0.9375rem;text-transform:uppercase;margin:0}.right-submenu .back>a:hover{background:#303030;border-bottom:none;border-top:1px solid #5e5e5e}.right-submenu .back>a:after{content:"\BB";margin-left:.5rem;display:inline}.right-submenu.move-left,.right-submenu.offcanvas-overlap-left,.right-submenu.offcanvas-overlap{-webkit-transform:translate3d(0%, 0, 0);-moz-transform:translate3d(0%, 0, 0);-ms-transform:translate(0%, 0);-ms-transform:translate3d(0%, 0, 0);-o-transform:translate3d(0%, 0, 0);transform:translate3d(0%, 0, 0)}.left-off-canvas-menu ul.off-canvas-list li.has-submenu>a:after{content:"\BB";margin-left:.5rem;display:inline}.right-off-canvas-menu ul.off-canvas-list li.has-submenu>a:before{content:"\AB";margin-right:.5rem;display:inline}.f-dropdown{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ccc;font-size:0.875rem;height:auto;max-height:none;width:100%;z-index:89;margin-top:2px;max-width:200px}.f-dropdown.open{display:block}.f-dropdown>*:first-child{margin-top:0}.f-dropdown>*:last-child{margin-bottom:0}.f-dropdown:before{border:inset 6px;content:"";display:block;height:0;width:0;border-color:transparent transparent #fff transparent;border-bottom-style:solid;position:absolute;top:-12px;left:10px;z-index:89}.f-dropdown:after{border:inset 7px;content:"";display:block;height:0;width:0;border-color:transparent transparent #ccc transparent;border-bottom-style:solid;position:absolute;top:-14px;left:9px;z-index:88}.f-dropdown.right:before{left:auto;right:10px}.f-dropdown.right:after{left:auto;right:9px}.f-dropdown.drop-right{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ccc;font-size:0.875rem;height:auto;max-height:none;width:100%;z-index:89;margin-top:0;margin-left:2px;max-width:200px}.f-dropdown.drop-right.open{display:block}.f-dropdown.drop-right>*:first-child{margin-top:0}.f-dropdown.drop-right>*:last-child{margin-bottom:0}.f-dropdown.drop-right:before{border:inset 6px;content:"";display:block;height:0;width:0;border-color:transparent #fff transparent transparent;border-right-style:solid;position:absolute;top:10px;left:-12px;z-index:89}.f-dropdown.drop-right:after{border:inset 7px;content:"";display:block;height:0;width:0;border-color:transparent #ccc transparent transparent;border-right-style:solid;position:absolute;top:9px;left:-14px;z-index:88}.f-dropdown.drop-left{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ccc;font-size:0.875rem;height:auto;max-height:none;width:100%;z-index:89;margin-top:0;margin-left:-2px;max-width:200px}.f-dropdown.drop-left.open{display:block}.f-dropdown.drop-left>*:first-child{margin-top:0}.f-dropdown.drop-left>*:last-child{margin-bottom:0}.f-dropdown.drop-left:before{border:inset 6px;content:"";display:block;height:0;width:0;border-color:transparent transparent transparent #fff;border-left-style:solid;position:absolute;top:10px;right:-12px;left:auto;z-index:89}.f-dropdown.drop-left:after{border:inset 7px;content:"";display:block;height:0;width:0;border-color:transparent transparent transparent #ccc;border-left-style:solid;position:absolute;top:9px;right:-14px;left:auto;z-index:88}.f-dropdown.drop-top{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ccc;font-size:0.875rem;height:auto;max-height:none;width:100%;z-index:89;margin-left:0;margin-top:-2px;max-width:200px}.f-dropdown.drop-top.open{display:block}.f-dropdown.drop-top>*:first-child{margin-top:0}.f-dropdown.drop-top>*:last-child{margin-bottom:0}.f-dropdown.drop-top:before{border:inset 6px;content:"";display:block;height:0;width:0;border-color:#fff transparent transparent transparent;border-top-style:solid;bottom:-12px;position:absolute;top:auto;left:10px;right:auto;z-index:89}.f-dropdown.drop-top:after{border:inset 7px;content:"";display:block;height:0;width:0;border-color:#ccc transparent transparent transparent;border-top-style:solid;bottom:-14px;position:absolute;top:auto;left:9px;right:auto;z-index:88}.f-dropdown li{cursor:pointer;font-size:0.875rem;line-height:1.125rem;margin:0}.f-dropdown li:hover,.f-dropdown li:focus{background:#eee}.f-dropdown li.radius{border-radius:3px}.f-dropdown li a{display:block;padding:0.5rem;color:#555}.f-dropdown.content{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ccc;font-size:0.875rem;height:auto;max-height:none;padding:1.25rem;width:100%;z-index:89;max-width:200px}.f-dropdown.content.open{display:block}.f-dropdown.content>*:first-child{margin-top:0}.f-dropdown.content>*:last-child{margin-bottom:0}.f-dropdown.tiny{max-width:200px}.f-dropdown.small{max-width:300px}.f-dropdown.medium{max-width:500px}.f-dropdown.large{max-width:800px}.f-dropdown.mega{width:100% !important;max-width:100% !important}.f-dropdown.mega.open{left:0 !important}table{background:#fff;border:solid 1px #ddd;margin-bottom:1.25rem;table-layout:auto}table caption{background:transparent;color:#222;font-size:1rem;font-weight:bold}table thead{background:#F5F5F5}table thead tr th,table thead tr td{color:#222;font-size:0.875rem;font-weight:bold;padding:0.5rem 0.625rem 0.625rem}table tfoot{background:#F5F5F5}table tfoot tr th,table tfoot tr td{color:#222;font-size:0.875rem;font-weight:bold;padding:0.5rem 0.625rem 0.625rem}table tr th,table tr td{color:#222;font-size:0.875rem;padding:0.5625rem 0.625rem;text-align:left}table tr.even,table tr.alt,table tr:nth-of-type(even){background:#F9F9F9}table thead tr th,table tfoot tr th,table tfoot tr td,table tbody tr th,table tbody tr td,table tr td{display:table-cell;line-height:1.125rem}.range-slider{border:1px solid #ddd;margin:1.25rem 0;position:relative;-ms-touch-action:none;touch-action:none;display:block;height:1rem;width:100%;background:#FAFAFA}.range-slider.vertical-range{border:1px solid #ddd;margin:1.25rem 0;position:relative;-ms-touch-action:none;touch-action:none;display:inline-block;height:12.5rem;width:1rem}.range-slider.vertical-range .range-slider-handle{bottom:-10.5rem;margin-left:-0.5rem;margin-top:0;position:absolute}.range-slider.vertical-range .range-slider-active-segment{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top-left-radius:initial;bottom:0;height:auto;width:0.875rem}.range-slider.radius{background:#FAFAFA;border-radius:3px}.range-slider.radius .range-slider-handle{background:#008CBA;border-radius:3px}.range-slider.radius .range-slider-handle:hover{background:#007ba4}.range-slider.round{background:#FAFAFA;border-radius:1000px}.range-slider.round .range-slider-handle{background:#008CBA;border-radius:1000px}.range-slider.round .range-slider-handle:hover{background:#007ba4}.range-slider.disabled,.range-slider[disabled]{background:#FAFAFA;cursor:not-allowed;opacity:0.7}.range-slider.disabled .range-slider-handle,.range-slider[disabled] .range-slider-handle{background:#008CBA;cursor:default;opacity:0.7}.range-slider.disabled .range-slider-handle:hover,.range-slider[disabled] .range-slider-handle:hover{background:#007ba4}.range-slider-active-segment{background:#e5e5e5;border-bottom-left-radius:inherit;border-top-left-radius:inherit;display:inline-block;height:0.875rem;position:absolute}.range-slider-handle{border:1px solid none;cursor:pointer;display:inline-block;height:1.375rem;position:absolute;top:-0.3125rem;width:2rem;z-index:1;-ms-touch-action:manipulation;touch-action:manipulation;background:#008CBA}.range-slider-handle:hover{background:#007ba4}[class*="block-grid-"]{display:block;padding:0;margin:0 -0.625rem}[class*="block-grid-"]:before,[class*="block-grid-"]:after{content:" ";display:table}[class*="block-grid-"]:after{clear:both}[class*="block-grid-"]>li{display:block;float:left;height:auto;padding:0 0.625rem 1.25rem}@media only screen{.small-block-grid-1>li{list-style:none;width:100%}.small-block-grid-1>li:nth-of-type(1n){clear:none}.small-block-grid-1>li:nth-of-type(1n+1){clear:both}.small-block-grid-2>li{list-style:none;width:50%}.small-block-grid-2>li:nth-of-type(1n){clear:none}.small-block-grid-2>li:nth-of-type(2n+1){clear:both}.small-block-grid-3>li{list-style:none;width:33.33333%}.small-block-grid-3>li:nth-of-type(1n){clear:none}.small-block-grid-3>li:nth-of-type(3n+1){clear:both}.small-block-grid-4>li{list-style:none;width:25%}.small-block-grid-4>li:nth-of-type(1n){clear:none}.small-block-grid-4>li:nth-of-type(4n+1){clear:both}.small-block-grid-5>li{list-style:none;width:20%}.small-block-grid-5>li:nth-of-type(1n){clear:none}.small-block-grid-5>li:nth-of-type(5n+1){clear:both}.small-block-grid-6>li{list-style:none;width:16.66667%}.small-block-grid-6>li:nth-of-type(1n){clear:none}.small-block-grid-6>li:nth-of-type(6n+1){clear:both}.small-block-grid-7>li{list-style:none;width:14.28571%}.small-block-grid-7>li:nth-of-type(1n){clear:none}.small-block-grid-7>li:nth-of-type(7n+1){clear:both}.small-block-grid-8>li{list-style:none;width:12.5%}.small-block-grid-8>li:nth-of-type(1n){clear:none}.small-block-grid-8>li:nth-of-type(8n+1){clear:both}.small-block-grid-9>li{list-style:none;width:11.11111%}.small-block-grid-9>li:nth-of-type(1n){clear:none}.small-block-grid-9>li:nth-of-type(9n+1){clear:both}.small-block-grid-10>li{list-style:none;width:10%}.small-block-grid-10>li:nth-of-type(1n){clear:none}.small-block-grid-10>li:nth-of-type(10n+1){clear:both}.small-block-grid-11>li{list-style:none;width:9.09091%}.small-block-grid-11>li:nth-of-type(1n){clear:none}.small-block-grid-11>li:nth-of-type(11n+1){clear:both}.small-block-grid-12>li{list-style:none;width:8.33333%}.small-block-grid-12>li:nth-of-type(1n){clear:none}.small-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 40.0625em){.medium-block-grid-1>li{list-style:none;width:100%}.medium-block-grid-1>li:nth-of-type(1n){clear:none}.medium-block-grid-1>li:nth-of-type(1n+1){clear:both}.medium-block-grid-2>li{list-style:none;width:50%}.medium-block-grid-2>li:nth-of-type(1n){clear:none}.medium-block-grid-2>li:nth-of-type(2n+1){clear:both}.medium-block-grid-3>li{list-style:none;width:33.33333%}.medium-block-grid-3>li:nth-of-type(1n){clear:none}.medium-block-grid-3>li:nth-of-type(3n+1){clear:both}.medium-block-grid-4>li{list-style:none;width:25%}.medium-block-grid-4>li:nth-of-type(1n){clear:none}.medium-block-grid-4>li:nth-of-type(4n+1){clear:both}.medium-block-grid-5>li{list-style:none;width:20%}.medium-block-grid-5>li:nth-of-type(1n){clear:none}.medium-block-grid-5>li:nth-of-type(5n+1){clear:both}.medium-block-grid-6>li{list-style:none;width:16.66667%}.medium-block-grid-6>li:nth-of-type(1n){clear:none}.medium-block-grid-6>li:nth-of-type(6n+1){clear:both}.medium-block-grid-7>li{list-style:none;width:14.28571%}.medium-block-grid-7>li:nth-of-type(1n){clear:none}.medium-block-grid-7>li:nth-of-type(7n+1){clear:both}.medium-block-grid-8>li{list-style:none;width:12.5%}.medium-block-grid-8>li:nth-of-type(1n){clear:none}.medium-block-grid-8>li:nth-of-type(8n+1){clear:both}.medium-block-grid-9>li{list-style:none;width:11.11111%}.medium-block-grid-9>li:nth-of-type(1n){clear:none}.medium-block-grid-9>li:nth-of-type(9n+1){clear:both}.medium-block-grid-10>li{list-style:none;width:10%}.medium-block-grid-10>li:nth-of-type(1n){clear:none}.medium-block-grid-10>li:nth-of-type(10n+1){clear:both}.medium-block-grid-11>li{list-style:none;width:9.09091%}.medium-block-grid-11>li:nth-of-type(1n){clear:none}.medium-block-grid-11>li:nth-of-type(11n+1){clear:both}.medium-block-grid-12>li{list-style:none;width:8.33333%}.medium-block-grid-12>li:nth-of-type(1n){clear:none}.medium-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 64.0625em){.large-block-grid-1>li{list-style:none;width:100%}.large-block-grid-1>li:nth-of-type(1n){clear:none}.large-block-grid-1>li:nth-of-type(1n+1){clear:both}.large-block-grid-2>li{list-style:none;width:50%}.large-block-grid-2>li:nth-of-type(1n){clear:none}.large-block-grid-2>li:nth-of-type(2n+1){clear:both}.large-block-grid-3>li{list-style:none;width:33.33333%}.large-block-grid-3>li:nth-of-type(1n){clear:none}.large-block-grid-3>li:nth-of-type(3n+1){clear:both}.large-block-grid-4>li{list-style:none;width:25%}.large-block-grid-4>li:nth-of-type(1n){clear:none}.large-block-grid-4>li:nth-of-type(4n+1){clear:both}.large-block-grid-5>li{list-style:none;width:20%}.large-block-grid-5>li:nth-of-type(1n){clear:none}.large-block-grid-5>li:nth-of-type(5n+1){clear:both}.large-block-grid-6>li{list-style:none;width:16.66667%}.large-block-grid-6>li:nth-of-type(1n){clear:none}.large-block-grid-6>li:nth-of-type(6n+1){clear:both}.large-block-grid-7>li{list-style:none;width:14.28571%}.large-block-grid-7>li:nth-of-type(1n){clear:none}.large-block-grid-7>li:nth-of-type(7n+1){clear:both}.large-block-grid-8>li{list-style:none;width:12.5%}.large-block-grid-8>li:nth-of-type(1n){clear:none}.large-block-grid-8>li:nth-of-type(8n+1){clear:both}.large-block-grid-9>li{list-style:none;width:11.11111%}.large-block-grid-9>li:nth-of-type(1n){clear:none}.large-block-grid-9>li:nth-of-type(9n+1){clear:both}.large-block-grid-10>li{list-style:none;width:10%}.large-block-grid-10>li:nth-of-type(1n){clear:none}.large-block-grid-10>li:nth-of-type(10n+1){clear:both}.large-block-grid-11>li{list-style:none;width:9.09091%}.large-block-grid-11>li:nth-of-type(1n){clear:none}.large-block-grid-11>li:nth-of-type(11n+1){clear:both}.large-block-grid-12>li{list-style:none;width:8.33333%}.large-block-grid-12>li:nth-of-type(1n){clear:none}.large-block-grid-12>li:nth-of-type(12n+1){clear:both}}.flex-video{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:67.5%;padding-top:1.5625rem;position:relative}.flex-video.widescreen{padding-bottom:56.34%}.flex-video.vimeo{padding-top:0}.flex-video iframe,.flex-video object,.flex-video embed,.flex-video video{height:100%;position:absolute;top:0;width:100%;left:0}.keystroke,kbd{background-color:#ededed;border-color:#ddd;color:#222;border-style:solid;border-width:1px;font-family:"Consolas","Menlo","Courier",monospace;font-size:inherit;margin:0;padding:0.125rem 0.25rem 0;border-radius:3px}.switch{border:none;margin-bottom:1.5rem;outline:0;padding:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch label{background:#ddd;color:transparent;cursor:pointer;display:block;margin-bottom:1rem;position:relative;text-indent:100%;width:4rem;height:2rem;transition:left 0.15s ease-out}.switch input{left:10px;opacity:0;padding:0;position:absolute;top:9px}.switch input+label{margin-left:0;margin-right:0}.switch label:after{background:#fff;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;width:1.5rem;-webkit-transition:left 0.15s ease-out;-moz-transition:left 0.15s ease-out;-o-transition:translate3d(0, 0, 0);transition:left 0.15s ease-out;-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.switch input:checked+label{background:#008CBA}.switch input:checked+label:after{left:2.25rem}.switch label{height:2rem;width:4rem}.switch label:after{height:1.5rem;width:1.5rem}.switch input:checked+label:after{left:2.25rem}.switch label{color:transparent;background:#ddd}.switch label:after{background:#fff}.switch input:checked+label{background:#008CBA}.switch.large label{height:2.5rem;width:5rem}.switch.large label:after{height:2rem;width:2rem}.switch.large input:checked+label:after{left:2.75rem}.switch.small label{height:1.75rem;width:3.5rem}.switch.small label:after{height:1.25rem;width:1.25rem}.switch.small input:checked+label:after{left:2rem}.switch.tiny label{height:1.5rem;width:3rem}.switch.tiny label:after{height:1rem;width:1rem}.switch.tiny input:checked+label:after{left:1.75rem}.switch.radius label{border-radius:4px}.switch.radius label:after{border-radius:3px}.switch.round{border-radius:1000px}.switch.round label{border-radius:2rem}.switch.round label:after{border-radius:2rem}@media only screen{.show-for-small-only,.show-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.hide-for-small-only,.hide-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.visible-for-small-only,.visible-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.hidden-for-small-only,.hidden-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.show-for-small-only,table.show-for-small-up,table.show-for-small,table.show-for-small-down,table.hide-for-medium-only,table.hide-for-medium-up,table.hide-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.show-for-small-only,thead.show-for-small-up,thead.show-for-small,thead.show-for-small-down,thead.hide-for-medium-only,thead.hide-for-medium-up,thead.hide-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.show-for-small-only,tbody.show-for-small-up,tbody.show-for-small,tbody.show-for-small-down,tbody.hide-for-medium-only,tbody.hide-for-medium-up,tbody.hide-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.show-for-small-only,tr.show-for-small-up,tr.show-for-small,tr.show-for-small-down,tr.hide-for-medium-only,tr.hide-for-medium-up,tr.hide-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.show-for-small-only,td.show-for-small-only,th.show-for-small-up,td.show-for-small-up,th.show-for-small,td.show-for-small,th.show-for-small-down,td.show-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.hide-for-medium-up,td.hide-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 40.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.show-for-medium-only,table.show-for-medium-up,table.show-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.show-for-medium-only,thead.show-for-medium-up,thead.show-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.show-for-medium-only,tbody.show-for-medium-up,tbody.show-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.show-for-medium-only,tr.show-for-medium-up,tr.show-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.show-for-medium-only,td.show-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.show-for-medium,td.show-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 64.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.show-for-large-only,table.show-for-large-up,table.show-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.show-for-large-only,thead.show-for-large-up,thead.show-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.show-for-large-only,tbody.show-for-large-up,tbody.show-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.show-for-large-only,tr.show-for-large-up,tr.show-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.show-for-large-only,td.show-for-large-only,th.show-for-large-up,td.show-for-large-up,th.show-for-large,td.show-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 90.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.show-for-xlarge-only,table.show-for-xlarge-up,table.show-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.show-for-xlarge-only,thead.show-for-xlarge-up,thead.show-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.show-for-xlarge-only,tbody.show-for-xlarge-up,tbody.show-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.show-for-xlarge-only,tr.show-for-xlarge-up,tr.show-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.show-for-xlarge-only,td.show-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.show-for-xlarge,td.show-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 120.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.hide-for-xlarge-only,.show-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.show-for-xlarge-only,.hide-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.hidden-for-xlarge-only,.visible-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.visible-for-xlarge-only,.hidden-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.hide-for-xlarge-only,table.show-for-xlarge-up,table.hide-for-xlarge,table.hide-for-xlarge-down,table.show-for-xxlarge-only,table.show-for-xxlarge-up,table.show-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.hide-for-xlarge-only,thead.show-for-xlarge-up,thead.hide-for-xlarge,thead.hide-for-xlarge-down,thead.show-for-xxlarge-only,thead.show-for-xxlarge-up,thead.show-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.hide-for-xlarge-only,tbody.show-for-xlarge-up,tbody.hide-for-xlarge,tbody.hide-for-xlarge-down,tbody.show-for-xxlarge-only,tbody.show-for-xxlarge-up,tbody.show-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.hide-for-xlarge-only,tr.show-for-xlarge-up,tr.hide-for-xlarge,tr.hide-for-xlarge-down,tr.show-for-xxlarge-only,tr.show-for-xxlarge-up,tr.show-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.hide-for-xlarge-down,td.hide-for-xlarge-down,th.show-for-xxlarge-only,td.show-for-xxlarge-only,th.show-for-xxlarge-up,td.show-for-xxlarge-up,th.show-for-xxlarge,td.show-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.hide-for-landscape,table.show-for-portrait{display:table !important}thead.hide-for-landscape,thead.show-for-portrait{display:table-header-group !important}tbody.hide-for-landscape,tbody.show-for-portrait{display:table-row-group !important}tr.hide-for-landscape,tr.show-for-portrait{display:table-row !important}td.hide-for-landscape,td.show-for-portrait,th.hide-for-landscape,th.show-for-portrait{display:table-cell !important}@media only screen and (orientation: landscape){.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.show-for-landscape,table.hide-for-portrait{display:table !important}thead.show-for-landscape,thead.hide-for-portrait{display:table-header-group !important}tbody.show-for-landscape,tbody.hide-for-portrait{display:table-row-group !important}tr.show-for-landscape,tr.hide-for-portrait{display:table-row !important}td.show-for-landscape,td.hide-for-portrait,th.show-for-landscape,th.hide-for-portrait{display:table-cell !important}}@media only screen and (orientation: portrait){.show-for-portrait,.hide-for-landscape{display:inherit !important}.hide-for-portrait,.show-for-landscape{display:none !important}table.show-for-portrait,table.hide-for-landscape{display:table !important}thead.show-for-portrait,thead.hide-for-landscape{display:table-header-group !important}tbody.show-for-portrait,tbody.hide-for-landscape{display:table-row-group !important}tr.show-for-portrait,tr.hide-for-landscape{display:table-row !important}td.show-for-portrait,td.hide-for-landscape,th.show-for-portrait,th.hide-for-landscape{display:table-cell !important}}.show-for-touch{display:none !important}.hide-for-touch{display:inherit !important}.touch .show-for-touch{display:inherit !important}.touch .hide-for-touch{display:none !important}table.hide-for-touch{display:table !important}.touch table.show-for-touch{display:table !important}thead.hide-for-touch{display:table-header-group !important}.touch thead.show-for-touch{display:table-header-group !important}tbody.hide-for-touch{display:table-row-group !important}.touch tbody.show-for-touch{display:table-row-group !important}tr.hide-for-touch{display:table-row !important}.touch tr.show-for-touch{display:table-row !important}td.hide-for-touch{display:table-cell !important}.touch td.show-for-touch{display:table-cell !important}th.hide-for-touch{display:table-cell !important}.touch th.show-for-touch{display:table-cell !important}.show-for-sr{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}.show-on-focus{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}.show-on-focus:focus,.show-on-focus:active{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.print-only{display:none !important}@media print{*{background:transparent !important;box-shadow:none !important;color:#000 !important;text-shadow:none !important}.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.hide-on-print{display:none !important}.print-only{display:block !important}.hide-for-print{display:none !important}.show-for-print{display:inherit !important}}@media print{.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}}@media not print{.show-for-print{display:none !important}}
diff --git a/production/example_apps/shared_calendar/webroot/css/cake.css b/production/example_apps/shared_calendar/webroot/css/cake.css
new file mode 100644
index 00000000..10841c89
--- /dev/null
+++ b/production/example_apps/shared_calendar/webroot/css/cake.css
@@ -0,0 +1,525 @@
+.disabled a,
+a.disabled {
+ pointer-events: none;
+}
+
+a:hover {
+ color: #15848F;
+}
+
+a {
+ color: #1798A5;
+}
+
+.side-nav li a:not(.button) {
+ color: #15848F;
+}
+
+.side-nav li a:not(.button):hover {
+ color: #15848F;
+}
+
+header {
+ background-color: #D33C44;
+ color: #ffffff;
+ font-size: 30px;
+ height: 84px;
+ line-height: 64px;
+ padding: 16px 0px;
+ box-shadow: 0px 1px rgba(0, 0, 0, 0.24);
+}
+
+header .header-title {
+ padding-left:80px
+}
+
+legend {
+ color:#15848F;
+}
+
+.row {
+ max-width: 80rem;
+}
+
+.actions.columns {
+ margin-top:1rem;
+ border-left: 5px solid #15848F;
+ padding-left: 15px;
+ padding: 32px 20px;
+}
+
+.actions.columns h3 {
+ color:#15848F;
+}
+
+.related table {
+ border: 0;
+ width: 100%;
+ table-layout: fixed;
+}
+
+.index table thead {
+ height: 3.5rem;
+}
+
+.header-help {
+ float: right;
+ margin-right:2rem;
+ margin-top: -80px;
+ font-size:16px;
+}
+
+.header-help span {
+ font-weight: normal;
+ text-align: center;
+ text-decoration: none;
+ line-height: 1;
+ white-space: nowrap;
+ display: inline-block;
+ padding: 0.25rem 0.5rem 0.375rem;
+ font-size: 0.8rem;
+ background-color: #0097a7;
+ color: #FFF;
+ border-radius: 1000px;
+}
+
+.header-help a {
+ color: #fff;
+}
+
+ul.pagination li a {
+ color: rgba(0, 0 ,0 , 0.54);
+}
+
+ul.pagination li.active a {
+ background-color: #DCE47E;
+ color: #FFF;
+ font-weight: bold;
+ cursor: default;
+}
+ul.pagination .disabled:hover a {
+ background: none;
+}
+
+.paginator {
+ text-align: center;
+}
+
+.paginator ul.pagination li {
+ float: none;
+ display: inline-block;
+}
+
+.paginator p {
+ text-align: right;
+ color: rgba(0, 0 ,0 , 0.54);
+}
+
+.asc:after {
+ content: " \2193";
+}
+.desc:after {
+ content: " \2191";
+}
+
+.form .error-message {
+ display: block;
+ padding: 0.375rem 0.5625rem 0.5625rem;
+ margin-top: -1px;
+ margin-bottom: 1rem;
+ font-size: 0.75rem;
+ font-weight: normal;
+ font-style: italic;
+ color: rgba(0, 0, 0, 0.54);
+}
+
+.required > label {
+ font-weight: bold;
+}
+.required > label:after {
+ content: ' *';
+ color: #C3232D;
+}
+
+select[multiple] {
+ min-height:150px;
+ background: none;
+}
+input[type=checkbox],
+input[type=radio] {
+ margin-right: 0.5em;
+}
+
+.date select,
+.time select,
+.datetime select {
+ display: inline;
+ width: auto;
+ margin-right: 10px;
+}
+
+.error label,
+.error label.error {
+ color: #C3232D;
+}
+
+.view h2 {
+ color: #6F6F6F;
+}
+
+.view .columns.strings {
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin-right:0.7rem;
+}
+
+.view .numbers {
+ background-color: #B7E3EC;
+ color: #FFF;
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin-right: 0.7rem;
+}
+
+.view .columns.dates {
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin-right:0.7rem;
+ background-color:#DCE47E;
+ color: #fff;
+}
+
+.view .columns.booleans {
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin-right:0.7rem;
+ background-color: #8D6E65;
+ color: #fff;
+}
+
+.view .strings p {
+ border-bottom: 1px solid #eee;
+}
+.view .numbers .subheader, .view .dates .subheader {
+ color:#747474;
+}
+.view .booleans .subheader {
+ color: #E9E9E9
+}
+
+.view .texts .columns {
+ margin-top:1.2rem;
+ border-bottom: 1px solid #eee;
+}
+
+/** Notices and Errors **/
+.cake-error,
+.cake-debug,
+.notice,
+p.error,
+p.notice {
+ display: block;
+ clear: both;
+ background-repeat: repeat-x;
+ margin-bottom: 18px;
+ padding: 7px 14px;
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+}
+
+.cake-debug,
+.notice,
+p.notice {
+ color: #000000;
+ background: #ffcc00;
+}
+
+.cake-error,
+p.error {
+ color: #fff;
+ background: #C3232D;
+}
+
+pre {
+ background: none repeat scroll 0% 0% #FFF;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin: 15px 0px;
+ color: rgba(0, 0 ,0 , 0.74);
+ padding:5px;
+}
+
+.cake-error .cake-stack-trace {
+ margin-top:10px;
+}
+
+.cake-stack-trace code {
+ background: inherit;
+ border:0;
+}
+
+.cake-code-dump .code-highlight {
+ display: block;
+ background-color: #FFC600;
+}
+
+.cake-error a,
+.cake-error a:hover {
+ color:#fff;
+ text-decoration: underline;
+}
+
+.checks {
+ padding:30px;
+ color: #626262;
+ background-color: #B7E3EC;
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin-bottom: 2em;
+}
+
+.checks h4 {
+ margin-bottom: 1.5rem;
+}
+
+.checks hr {
+ border: 0;
+ height: 0;
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
+ border-bottom: 1px solid rgba(255, 255, 255, 0.3);
+}
+
+.checks .success,
+.checks .problem {
+ margin-left: 10px;
+}
+.checks .success:before,
+.checks .problem:before {
+ line-height: 0px;
+ font-size: 28px;
+ height: 12px;
+ width: 12px;
+ border-radius: 15px;
+ text-align: center;
+ vertical-align: middle;
+ display: inline-block;
+ position: relative;
+ left: -11px;
+}
+
+.checks .success:before {
+ content: "â";
+ color: green;
+ margin-right: 9px;
+}
+
+.checks .problem:before {
+ content: "â";
+ color: red;
+ margin-right: 9px;
+}
+
+.top-bar.expanded .title-area {
+ background: #01545b;
+}
+
+.top-bar.expanded, .top-bar,.top-bar-section ul li,.top-bar-section li:not(.has-form) a:not(.button) {
+ background: #116d76;
+}
+
+.top-bar-section li:not(.has-form) a:not(.button):hover {
+ background-color: #308e97;
+ background: #308e97;
+}
+
+.side-nav li.heading {
+ color: #1798A5;
+ font-size: 0.875rem;
+ font-weight: bold;
+ text-transform: uppercase;
+ padding: 0.4375rem 0.875rem;
+}
+
+#actions-sidebar {
+ background: #fafafa;
+}
+
+.index table {
+ margin-top: 0rem;
+ border: 0;
+ width: 100%;
+ table-layout: fixed;
+}
+
+table {
+ background: #fff;
+ margin-bottom: 1.25rem;
+ border: none;
+ table-layout: fixed;
+ width: 100%;
+}
+
+table thead {
+ background: none;
+}
+
+table tr {
+ border-bottom: 1px solid #ebebec;
+}
+
+table thead tr {
+ border-bottom: 1px solid #1798A5;
+}
+
+table tr th {
+ padding: 0.5625rem 0.625rem;
+ font-size: 0.875rem;
+ color: #1798A5;
+ text-align: left;
+ border-bottom: 2px solid #1798A5;
+}
+
+table tr:nth-of-type(even) {
+ background: none;
+}
+
+fieldset {
+ border: none;
+ padding: 1.25rem;
+ margin: 1.125rem 0;
+}
+
+fieldset legend {
+ border-bottom: 2px solid #1798A5;
+ width: 100%;
+ line-height: 2rem;
+}
+
+.form button[type="submit"] {
+ float: right;
+ text-transform: uppercase;
+ box-shadow: none;
+}
+
+.form button:hover, .form button:focus {
+ background: #BE840B;
+ box-shadow: none;
+}
+
+button {
+ background: #966600;
+}
+
+div.message {
+ text-align: center;
+ cursor: pointer;
+ display: block;
+ font-weight: normal;
+ padding: 0 1.5rem 0 1.5rem;
+ transition: height 300ms ease-out 0s;
+ background-color: #a0d3e8;
+ color: #626262;
+ top: 15px;
+ right: 15px;
+ z-index: 999;
+ overflow: hidden;
+ height: 50px;
+ line-height: 2.5em;
+ box-radius: 5px;
+}
+
+div.message:before {
+ line-height: 0px;
+ font-size: 20px;
+ height: 12px;
+ width: 12px;
+ border-radius: 15px;
+ text-align: center;
+ vertical-align: middle;
+ display: inline-block;
+ position: relative;
+ left: -11px;
+ background-color: #FFF;
+ padding: 12px 14px 12px 10px;
+ content: "i";
+ color: #a0d3e8;
+}
+
+div.message.error {
+ background-color: #C3232D;
+ color: #FFF;
+}
+
+div.message.error:before {
+ padding: 11px 16px 14px 7px;
+ color: #C3232D;
+ content: "x";
+}
+div.message.hidden {
+ height: 0;
+}
+
+
+.vertical-table th {
+ padding: 0.5625rem 0.625rem;
+ font-size: 0.875rem;
+ color: #1798A5;
+ border: none;
+ text-align: left;
+}
+
+.vertical-table {
+ vertical-align: middle;
+}
+
+.vertical-table td {
+ text-align: right;
+}
+
+.content {
+ padding: 2rem;
+}
+
+/* Use 'one true layout' methods to get equal height columns */
+.container {
+ overflow: hidden;
+ min-height: 92%; /* full height almost always */
+}
+
+/* Force equal height by overflowing */
+.content,
+#actions-sidebar {
+ margin-bottom: -99999px;
+ padding-bottom: 99999px;
+}
+@media(max-width: 640px) {
+ #actions-sidebar {
+ padding-bottom: 2rem;
+ margin-bottom: 0;
+ }
+}
+
+.content h3 {
+ color: #be140b;
+ padding-bottom: 0.5rem;
+ margin-bottom: 20px;
+}
+
+.content h4 {
+ color: #be140b;
+ padding-bottom: 0.5rem;
+ margin-bottom: 20px;
+ border-bottom: 2px solid #be140b;
+}
+
+.content .related h4 {
+ color: #4d8f97;
+ padding-bottom: 0.5rem;
+ margin-top: 20px;
+ margin-bottom: 10px;
+ border-bottom: 0px;
+}
+
+table td {
+ vertical-align: top;
+ word-break: break-all;
+}
diff --git a/production/example_apps/shared_calendar/webroot/css/home.css b/production/example_apps/shared_calendar/webroot/css/home.css
new file mode 100644
index 00000000..d1db7780
--- /dev/null
+++ b/production/example_apps/shared_calendar/webroot/css/home.css
@@ -0,0 +1,250 @@
+@font-face {
+ font-family: 'cakefont';
+ src: url('../font/cakedingbats-webfont.eot');
+ src: url('../font/cakedingbats-webfont.eot?#iefix') format('embedded-opentype'),
+ url('../font/cakedingbats-webfont.woff2') format('woff2'),
+ url('../font/cakedingbats-webfont.woff') format('woff'),
+ url('../font/cakedingbats-webfont.ttf') format('truetype'),
+ url('../font/cakedingbats-webfont.svg#cake_dingbatsregular') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+.home {
+ font-family: 'Roboto', sans-serif;
+ font-size: 14px;
+ line-height: 27px;
+ color: #404041;
+}
+
+.fredmenu {
+ font-size: 28px;
+ text-align: center;
+}
+
+.fredmenu li {
+ font-size: 28px;
+}
+
+a {
+ color: #0071BC;
+ -webkit-transition: all 0.2s;
+ -moz-transition: all 0.2s;
+ -ms-transition: all 0.2s;
+ -o-transition: all 0.2s;
+ transition: all 0.2s;
+}
+
+a:hover, a:active {
+ color: #d33d44;
+ -webkit-transition: all 0.2s;
+ -moz-transition: all 0.2s;
+ -ms-transition: all 0.2s;
+ -o-transition: all 0.2s;
+ transition: all 0.2s;
+}
+
+ul, ol, dl, p {
+ font-size: 0.85rem;
+}
+
+p {
+ line-height: 2;
+}
+
+header {
+ height: auto;
+ line-height: 1em;
+ padding: 0;
+ box-shadow: none;
+}
+
+header.row {
+ margin-bottom: 30px;
+}
+
+header .header-image {
+ text-align: center;
+ padding: 64px 0;
+ background: #b060f1;
+}
+
+header .header-title {
+ padding: 0;
+ display: block;
+ background: #404041;
+ text-align: center;
+}
+
+header .header-title h1 {
+ font-family: 'Raleway', sans-serif;
+ margin: 0;
+ font-style: italic;
+ font-size: 18px;
+ font-weight: 500;
+ padding: 18px 30px;
+ color: #DEDED5;
+}
+
+header h1 {
+ color: #fff;
+}
+
+h3, h4 {
+ font-family: 'Roboto', sans-serif;
+ font-size: 27px;
+ line-height: 30px;
+ font-weight: 300;
+ -webkit-font-smoothing: antialiased;
+ margin-top: 0;
+ margin-bottom: 20px;
+}
+
+.more {
+ color: #ffffff;
+ background-color: #d33d44;
+ padding: 15px;
+ margin-top: 10px;
+}
+
+.row {
+ max-width: 1000px;
+}
+
+.alert {
+ background-color: #fff9e1;
+ font-size: 12px;
+ text-align: center;
+ display: block;
+ padding: 12px;
+ border-bottom: 2px solid #ffcf06;
+}
+
+.alert {
+ background-color: #fff9e1;
+ font-size: 12px;
+ display: block;
+ padding: 12px;
+ border-bottom: 2px solid #ffcf06;
+ margin-bottom: 30px;
+ color: #404041;
+}
+
+.alert p {
+ margin: 0;
+ font-size: 12px;
+ line-height: 1.4;
+}
+
+.alert p:before {
+ color: #ffcf06;
+ content: "\0055";
+ font-family: 'cakefont', sans-serif;
+ font-size: 21px;
+ margin-left: -0.8em;
+ width: 2.3em;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ padding: 0 10px 0 15px;
+ vertical-align: -2px;
+}
+
+.alert ul {
+ margin: 0;
+ font-size: 12px;
+}
+
+.alert.url-rewriting {
+ background-color: #F0F0F0;
+ border-color: #cccccc;
+ display: none;
+}
+
+.text-center {
+ text-align: center;
+}
+
+ul {
+ list-style-type: none;
+ margin: 0 0 30px 0;
+}
+
+li {
+ padding-left: 1.8em;
+}
+
+ul li ul, ul li ul li {
+ margin: 0;
+ padding: 0;
+}
+
+.bullet:before {
+ font-family: 'cakefont', sans-serif;
+ font-size: 18px;
+ display: inline-block;
+ margin-left: -1.3em;
+ width: 1.2em;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ vertical-align: -1px;
+}
+
+.success:before {
+ color: #88c671;
+ content: "\0056";
+}
+
+.problem:before {
+ color: #d33d44;
+ content: "\0057";
+}
+
+.cutlery:before {
+ color: #404041;
+ content: "\0059";
+}
+
+.book:before {
+ color: #404041;
+ content: "\0042";
+ width: 1.7em;
+}
+
+hr {
+ border-bottom: 1px solid #e7e7e7;
+ border-top: 0;
+ margin-bottom: 35px;
+ margin-left: 30px;
+ margin-right: 30px;
+}
+
+
+.icon {
+ color: #404041;
+ font-style: normal;
+ font-family: 'cakefont', sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.icon.support {
+ font-size: 60px;
+}
+.icon.docs {
+ font-size: 57px;
+}
+.icon.training {
+ font-size: 39px;
+}
+
+@media (min-width: 768px) {
+ .columns {
+ padding-left: 30px;
+ padding-right: 30px;
+ }
+}
+
+@media (min-width: 992px) {
+ header.row {
+ max-width: 940px;
+ }
+}
diff --git a/production/example_apps/shared_calendar/webroot/favicon.ico b/production/example_apps/shared_calendar/webroot/favicon.ico
new file mode 100644
index 00000000..49a060fc
Binary files /dev/null and b/production/example_apps/shared_calendar/webroot/favicon.ico differ
diff --git a/production/example_apps/shared_calendar/webroot/font/cakedingbats-webfont.eot b/production/example_apps/shared_calendar/webroot/font/cakedingbats-webfont.eot
new file mode 100644
index 00000000..e8605d92
Binary files /dev/null and b/production/example_apps/shared_calendar/webroot/font/cakedingbats-webfont.eot differ
diff --git a/production/example_apps/shared_calendar/webroot/font/cakedingbats-webfont.svg b/production/example_apps/shared_calendar/webroot/font/cakedingbats-webfont.svg
new file mode 100644
index 00000000..d1e0c98f
--- /dev/null
+++ b/production/example_apps/shared_calendar/webroot/font/cakedingbats-webfont.svg
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/production/example_apps/shared_calendar/webroot/font/cakedingbats-webfont.ttf b/production/example_apps/shared_calendar/webroot/font/cakedingbats-webfont.ttf
new file mode 100644
index 00000000..13d54454
Binary files /dev/null and b/production/example_apps/shared_calendar/webroot/font/cakedingbats-webfont.ttf differ
diff --git a/production/example_apps/shared_calendar/webroot/font/cakedingbats-webfont.woff b/production/example_apps/shared_calendar/webroot/font/cakedingbats-webfont.woff
new file mode 100644
index 00000000..073baab1
Binary files /dev/null and b/production/example_apps/shared_calendar/webroot/font/cakedingbats-webfont.woff differ
diff --git a/production/example_apps/shared_calendar/webroot/font/cakedingbats-webfont.woff2 b/production/example_apps/shared_calendar/webroot/font/cakedingbats-webfont.woff2
new file mode 100644
index 00000000..6e71eaf5
Binary files /dev/null and b/production/example_apps/shared_calendar/webroot/font/cakedingbats-webfont.woff2 differ
diff --git a/production/example_apps/shared_calendar/webroot/img/cake-logo.png b/production/example_apps/shared_calendar/webroot/img/cake-logo.png
new file mode 100644
index 00000000..41939ef5
Binary files /dev/null and b/production/example_apps/shared_calendar/webroot/img/cake-logo.png differ
diff --git a/production/example_apps/shared_calendar/webroot/img/cake.icon.png b/production/example_apps/shared_calendar/webroot/img/cake.icon.png
new file mode 100644
index 00000000..394fa42d
Binary files /dev/null and b/production/example_apps/shared_calendar/webroot/img/cake.icon.png differ
diff --git a/production/example_apps/shared_calendar/webroot/img/cake.logo.svg b/production/example_apps/shared_calendar/webroot/img/cake.logo.svg
new file mode 100644
index 00000000..e73abb54
--- /dev/null
+++ b/production/example_apps/shared_calendar/webroot/img/cake.logo.svg
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/production/example_apps/shared_calendar/webroot/img/cake.power.gif b/production/example_apps/shared_calendar/webroot/img/cake.power.gif
new file mode 100644
index 00000000..8f8d570a
Binary files /dev/null and b/production/example_apps/shared_calendar/webroot/img/cake.power.gif differ
diff --git a/production/example_apps/shared_calendar/webroot/index.php b/production/example_apps/shared_calendar/webroot/index.php
new file mode 100644
index 00000000..6791f475
--- /dev/null
+++ b/production/example_apps/shared_calendar/webroot/index.php
@@ -0,0 +1,37 @@
+emit($server->run());
diff --git a/production/example_apps/shared_calendar/webroot/js/empty b/production/example_apps/shared_calendar/webroot/js/empty
new file mode 100644
index 00000000..e69de29b
diff --git a/production/example_apps/zippy_maps/.buildpath b/production/example_apps/zippy_maps/.buildpath
new file mode 100644
index 00000000..8bcb4b5f
--- /dev/null
+++ b/production/example_apps/zippy_maps/.buildpath
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/production/example_apps/zippy_maps/.editorconfig b/production/example_apps/zippy_maps/.editorconfig
new file mode 100644
index 00000000..70619017
--- /dev/null
+++ b/production/example_apps/zippy_maps/.editorconfig
@@ -0,0 +1,18 @@
+; This file is for unifying the coding style for different editors and IDEs.
+; More information at http://editorconfig.org
+
+root = true
+
+[*]
+indent_style = space
+indent_size = 4
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.bat]
+end_of_line = crlf
+
+[*.yml]
+indent_style = space
+indent_size = 2
diff --git a/production/example_apps/zippy_maps/.gitattributes b/production/example_apps/zippy_maps/.gitattributes
new file mode 100644
index 00000000..6dedcf58
--- /dev/null
+++ b/production/example_apps/zippy_maps/.gitattributes
@@ -0,0 +1,48 @@
+# Define the line ending behavior of the different file extensions
+# Set default behaviour, in case users don't have core.autocrlf set.
+* text=auto
+* text eol=lf
+
+# Explicitly declare text files we want to always be normalized and converted
+# to native line endings on checkout.
+*.php text
+*.default text
+*.ctp text
+*.sql text
+*.md text
+*.po text
+*.js text
+*.css text
+*.ini text
+*.properties text
+*.txt text
+*.xml text
+*.svg text
+*.yml text
+.htaccess text
+
+# Declare files that will always have CRLF line endings on checkout.
+*.bat eol=crlf
+
+# Declare files that will always have LF line endings on checkout.
+*.pem eol=lf
+
+# Denote all files that are truly binary and should not be modified.
+*.png binary
+*.jpg binary
+*.gif binary
+*.ico binary
+*.mo binary
+*.pdf binary
+*.phar binary
+*.woff binary
+*.woff2 binary
+*.ttf binary
+*.otf binary
+*.eot binary
+*.gz binary
+
+# ahem, zip files binary too. --fred
+*.zip binary
+
+
diff --git a/production/example_apps/zippy_maps/.github/ISSUE_TEMPLATE.md b/production/example_apps/zippy_maps/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000..92c77d6b
--- /dev/null
+++ b/production/example_apps/zippy_maps/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,23 @@
+This is a (multiple allowed):
+
+* [x] bug
+* [ ] enhancement
+* [ ] feature-discussion (RFC)
+
+* CakePHP Application Skeleton Version: EXACT RELEASE VERSION OR COMMIT HASH, HERE.
+* Platform and Target: YOUR WEB-SERVER, DATABASE AND OTHER RELEVANT INFO AND HOW THE REQUEST IS BEING MADE, HERE.
+
+### What you did
+EXPLAIN WHAT YOU DID, PREFERABLY WITH CODE EXAMPLES, HERE.
+
+### What happened
+EXPLAIN WHAT IS ACTUALLY HAPPENING, HERE.
+
+### What you expected to happen
+EXPLAIN WHAT IS TO BE EXPECTED, HERE.
+
+P.S. Remember, an issue is not the place to ask questions. You can use [Stack Overflow](http://stackoverflow.com/questions/tagged/cakephp)
+for that or join the #cakephp channel on irc.freenode.net, where we will be more
+than happy to help answer your questions.
+
+Before you open an issue, please check if a similar issue already exists or has been closed before.
\ No newline at end of file
diff --git a/production/example_apps/zippy_maps/.github/PULL_REQUEST_TEMPLATE.md b/production/example_apps/zippy_maps/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 00000000..05ca9eb6
--- /dev/null
+++ b/production/example_apps/zippy_maps/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,10 @@
+**PLEASE NOTE:**
+
+This is only a issue tracker for issues related to the CakePHP Application Skeleton.
+For CakePHP Framework issues please use this [issue tracker](https://github.com/cakephp/cakephp/issues).
+
+Describe the big picture of your changes here to communicate to the maintainers why we should accept this pull request. If it fixes a bug or resolves a feature request, be sure to link to that issue.
+
+The best way to propose a feature is to open an issue first and discuss your ideas there before implementing them.
+
+Always follow the [contribution guidelines](https://github.com/cakephp/cakephp/blob/master/.github/CONTRIBUTING.md) guidelines when submitting a pull request. In particular, make sure existing tests still pass, and add tests for all new behavior. When fixing a bug, you may want to add a test to verify the fix.
\ No newline at end of file
diff --git a/production/example_apps/zippy_maps/.gitignore b/production/example_apps/zippy_maps/.gitignore
new file mode 100644
index 00000000..8a18ddc3
--- /dev/null
+++ b/production/example_apps/zippy_maps/.gitignore
@@ -0,0 +1,10 @@
+/vendor/*
+/config/app.php
+/config/*secret*
+/config/config_google.php
+/tmp/*
+/logs/*
+/vendor/
+/webroot/avmaps
+/webroot/debug_kit
+
diff --git a/production/example_apps/zippy_maps/.htaccess b/production/example_apps/zippy_maps/.htaccess
new file mode 100644
index 00000000..bc1dd9c0
--- /dev/null
+++ b/production/example_apps/zippy_maps/.htaccess
@@ -0,0 +1,11 @@
+# Uncomment the following to prevent the httpoxy vulnerability
+# See: https://httpoxy.org/
+#
+# RequestHeader unset Proxy
+#
+
+
+ RewriteEngine on
+ RewriteRule ^$ webroot/ [L]
+ RewriteRule (.*) webroot/$1 [L]
+
diff --git a/production/example_apps/zippy_maps/.project b/production/example_apps/zippy_maps/.project
new file mode 100644
index 00000000..7049fd51
--- /dev/null
+++ b/production/example_apps/zippy_maps/.project
@@ -0,0 +1,28 @@
+
+
+ zip_code_maps
+
+
+
+
+
+ org.eclipse.wst.common.project.facet.core.builder
+
+
+
+
+ org.eclipse.wst.validation.validationbuilder
+
+
+
+
+ org.eclipse.dltk.core.scriptbuilder
+
+
+
+
+
+ org.eclipse.php.core.PHPNature
+ org.eclipse.wst.common.project.facet.core.nature
+
+
diff --git a/production/example_apps/zippy_maps/.settings/org.eclipse.php.core.prefs b/production/example_apps/zippy_maps/.settings/org.eclipse.php.core.prefs
new file mode 100644
index 00000000..7354a248
--- /dev/null
+++ b/production/example_apps/zippy_maps/.settings/org.eclipse.php.core.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+include_path=0;/zip_code_maps
diff --git a/production/example_apps/zippy_maps/.settings/org.eclipse.wst.common.project.facet.core.xml b/production/example_apps/zippy_maps/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 00000000..4743dbb5
--- /dev/null
+++ b/production/example_apps/zippy_maps/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/production/example_apps/zippy_maps/.travis.yml b/production/example_apps/zippy_maps/.travis.yml
new file mode 100644
index 00000000..befdb98e
--- /dev/null
+++ b/production/example_apps/zippy_maps/.travis.yml
@@ -0,0 +1,30 @@
+language: php
+
+dist: trusty
+
+sudo: false
+
+php:
+ - 5.6
+ - 7.0
+ - 7.1
+
+matrix:
+ fast_finish: true
+
+ include:
+ - php: 7.0
+ env: PHPCS=1
+
+before_script:
+ - if [[ $PHPCS = 1 ]]; then composer require cakephp/cakephp-codesniffer:~2.1; fi
+ - if [[ $PHPCS != 1 ]]; then composer install; fi
+ - if [[ $PHPCS != 1 ]]; then composer require phpunit/phpunit:"^5.7|^6.0"; fi
+ - if [[ $PHPCS != 1 ]]; then composer run-script post-install-cmd --no-interaction; fi
+
+script:
+ - if [[ $PHPCS != 1 ]]; then vendor/bin/phpunit; fi
+ - if [[ $PHPCS = 1 ]]; then vendor/bin/phpcs -p --extensions=php --standard=vendor/cakephp/cakephp-codesniffer/CakePHP ./src ./tests ./config ./webroot; fi
+
+notifications:
+ email: false
diff --git a/production/example_apps/zippy_maps/bin/cake b/production/example_apps/zippy_maps/bin/cake
new file mode 100644
index 00000000..6801c45b
--- /dev/null
+++ b/production/example_apps/zippy_maps/bin/cake
@@ -0,0 +1,46 @@
+#!/usr/bin/env sh
+################################################################################
+#
+# Cake is a shell script for invoking CakePHP shell commands
+#
+# CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
+# Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+#
+# Licensed under The MIT License
+# For full copyright and license information, please see the LICENSE.txt
+# Redistributions of files must retain the above copyright notice.
+#
+# @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+# @link http://cakephp.org CakePHP(tm) Project
+# @since 1.2.0
+# @license http://www.opensource.org/licenses/mit-license.php MIT License
+#
+################################################################################
+
+# Canonicalize by following every symlink of the given name recursively
+canonicalize() {
+ NAME="$1"
+ if [ -f "$NAME" ]
+ then
+ DIR=$(dirname -- "$NAME")
+ NAME=$(cd -P "$DIR" > /dev/null && pwd -P)/$(basename -- "$NAME")
+ fi
+ while [ -h "$NAME" ]; do
+ DIR=$(dirname -- "$NAME")
+ SYM=$(readlink "$NAME")
+ NAME=$(cd "$DIR" > /dev/null && cd $(dirname -- "$SYM") > /dev/null && pwd)/$(basename -- "$SYM")
+ done
+ echo "$NAME"
+}
+
+CONSOLE=$(dirname -- "$(canonicalize "$0")")
+APP=$(dirname "$CONSOLE")
+
+if [ $(basename $0) != 'cake' ]
+then
+ exec php "$CONSOLE"/cake.php $(basename $0) "$@"
+else
+ exec php "$CONSOLE"/cake.php "$@"
+fi
+
+exit
diff --git a/production/example_apps/zippy_maps/bin/cake.bat b/production/example_apps/zippy_maps/bin/cake.bat
new file mode 100644
index 00000000..d4512dbf
--- /dev/null
+++ b/production/example_apps/zippy_maps/bin/cake.bat
@@ -0,0 +1,27 @@
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+::
+:: Cake is a Windows batch script for invoking CakePHP shell commands
+::
+:: CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
+:: Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+::
+:: Licensed under The MIT License
+:: Redistributions of files must retain the above copyright notice.
+::
+:: @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+:: @link http://cakephp.org CakePHP(tm) Project
+:: @since 2.0.0
+:: @license http://www.opensource.org/licenses/mit-license.php MIT License
+::
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+@echo off
+
+SET app=%0
+SET lib=%~dp0
+
+php "%lib%cake.php" %*
+
+echo.
+
+exit /B %ERRORLEVEL%
diff --git a/production/example_apps/zippy_maps/bin/cake.php b/production/example_apps/zippy_maps/bin/cake.php
new file mode 100644
index 00000000..5ee314c9
--- /dev/null
+++ b/production/example_apps/zippy_maps/bin/cake.php
@@ -0,0 +1,34 @@
+#!/usr/bin/php -q
+require->php)) {
+ $minVersion = preg_replace('/([^0-9\.])/', '', $composer->require->php);
+ }
+}
+if (version_compare(phpversion(), $minVersion, '<')) {
+ fwrite(STDERR, sprintf("Minimum PHP version: %s. You are using: %s.\n", $minVersion, phpversion()));
+ exit(-1);
+}
+
+require dirname(__DIR__) . '/vendor/autoload.php';
+include dirname(__DIR__) . '/config/bootstrap.php';
+
+exit(Cake\Console\ShellDispatcher::run($argv));
diff --git a/production/example_apps/zippy_maps/composer.json b/production/example_apps/zippy_maps/composer.json
new file mode 100644
index 00000000..686227de
--- /dev/null
+++ b/production/example_apps/zippy_maps/composer.json
@@ -0,0 +1,52 @@
+{
+ "name": "cakephp/app",
+ "description": "CakePHP skeleton app",
+ "homepage": "http://cakephp.org",
+ "type": "project",
+ "license": "MIT",
+ "require": {
+ "php": ">=5.6",
+ "cakephp/cakephp": "3.5.*",
+ "mobiledetect/mobiledetectlib": "2.*",
+ "cakephp/migrations": "@stable",
+ "cakephp/plugin-installer": "*",
+ "dereuromark/cakephp-geo": "^1.1",
+ "siteavenger/avmaps" : "dev-master"
+ },
+ "require-dev": {
+ "psy/psysh": "@stable",
+ "cakephp/debug_kit": "~3.0",
+ "cakephp/bake": "~1.1"
+ },
+ "suggest": {
+ "markstory/asset_compress": "An asset compression plugin which provides file concatenation and a flexible filter system for preprocessing and minification.",
+ "phpunit/phpunit": "Allows automated tests to be run without system-wide install.",
+ "cakephp/cakephp-codesniffer": "Allows to check the code against the coding standards used in CakePHP."
+ },
+ "autoload": {
+ "psr-4": {
+ "App\\": "src",
+ "Avmaps\\": "./plugins/Avmaps/src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "App\\Test\\": "tests",
+ "Cake\\Test\\": "./vendor/cakephp/cakephp/tests",
+ "Avmaps\\Test\\": "./plugins/Avmaps/tests"
+ }
+ },
+ "scripts": {
+ "post-install-cmd": "App\\Console\\Installer::postInstall",
+ "post-create-project-cmd": "App\\Console\\Installer::postInstall",
+ "post-autoload-dump": "Cake\\Composer\\Installer\\PluginInstaller::postAutoloadDump",
+ "check": [
+ "@test",
+ "@cs-check"
+ ],
+ "cs-check": "phpcs --colors -p --standard=vendor/cakephp/cakephp-codesniffer/CakePHP ./src ./tests",
+ "cs-fix": "phpcbf --colors --standard=vendor/cakephp/cakephp-codesniffer/CakePHP ./src ./tests",
+ "test": "phpunit --colors=always"
+ },
+ "prefer-stable": true
+}
diff --git a/production/example_apps/zippy_maps/composer.lock b/production/example_apps/zippy_maps/composer.lock
new file mode 100644
index 00000000..e9706f39
--- /dev/null
+++ b/production/example_apps/zippy_maps/composer.lock
@@ -0,0 +1,2767 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "ad82b7437385dd5bc72c500c0a1a1793",
+ "packages": [
+ {
+ "name": "aura/intl",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/auraphp/Aura.Intl.git",
+ "reference": "7fce228980b19bf4dee2d7bbd6202a69b0dde926"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/auraphp/Aura.Intl/zipball/7fce228980b19bf4dee2d7bbd6202a69b0dde926",
+ "reference": "7fce228980b19bf4dee2d7bbd6202a69b0dde926",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Aura\\Intl\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aura.Intl Contributors",
+ "homepage": "https://github.com/auraphp/Aura.Intl/contributors"
+ }
+ ],
+ "description": "The Aura Intl package provides internationalization tools, specifically message translation.",
+ "homepage": "https://github.com/auraphp/Aura.Intl",
+ "keywords": [
+ "g11n",
+ "globalization",
+ "i18n",
+ "internationalization",
+ "intl",
+ "l10n",
+ "localization"
+ ],
+ "time": "2017-01-20T05:00:11+00:00"
+ },
+ {
+ "name": "cakephp/cakephp",
+ "version": "3.5.17",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/cakephp.git",
+ "reference": "7727f122bac708a6b5883472bb3b22aad1e68e3b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/cakephp/zipball/7727f122bac708a6b5883472bb3b22aad1e68e3b",
+ "reference": "7727f122bac708a6b5883472bb3b22aad1e68e3b",
+ "shasum": ""
+ },
+ "require": {
+ "aura/intl": "^3.0.0",
+ "cakephp/chronos": "^1.0.1",
+ "ext-intl": "*",
+ "ext-mbstring": "*",
+ "php": ">=5.6.0",
+ "psr/log": "^1.0.0",
+ "zendframework/zend-diactoros": "^1.4.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<5.7"
+ },
+ "replace": {
+ "cakephp/cache": "self.version",
+ "cakephp/collection": "self.version",
+ "cakephp/core": "self.version",
+ "cakephp/database": "self.version",
+ "cakephp/datasource": "self.version",
+ "cakephp/event": "self.version",
+ "cakephp/filesystem": "self.version",
+ "cakephp/form": "self.version",
+ "cakephp/i18n": "self.version",
+ "cakephp/log": "self.version",
+ "cakephp/orm": "self.version",
+ "cakephp/utility": "self.version",
+ "cakephp/validation": "self.version"
+ },
+ "require-dev": {
+ "cakephp/cakephp-codesniffer": "^3.0",
+ "phpunit/phpunit": "^5.7.14|^6.0"
+ },
+ "suggest": {
+ "ext-openssl": "To use Security::encrypt() or have secure CSRF token generation.",
+ "lib-ICU": "The intl PHP library, to use Text::transliterate() or Text::slug()"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Cake\\": "src/"
+ },
+ "files": [
+ "src/Core/functions.php",
+ "src/Collection/functions.php",
+ "src/I18n/functions.php",
+ "src/Utility/bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "CakePHP Community",
+ "homepage": "https://github.com/cakephp/cakephp/graphs/contributors"
+ }
+ ],
+ "description": "The CakePHP framework",
+ "homepage": "https://cakephp.org",
+ "keywords": [
+ "conventions over configuration",
+ "dry",
+ "form",
+ "framework",
+ "mvc",
+ "orm",
+ "psr-7",
+ "rapid-development",
+ "validation"
+ ],
+ "time": "2018-05-21T01:31:33+00:00"
+ },
+ {
+ "name": "cakephp/chronos",
+ "version": "1.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/chronos.git",
+ "reference": "30f5b26bcf76a5e53ecc274700ad1ec49dc05567"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/chronos/zipball/30f5b26bcf76a5e53ecc274700ad1ec49dc05567",
+ "reference": "30f5b26bcf76a5e53ecc274700ad1ec49dc05567",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9|^7"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1",
+ "cakephp/cakephp-codesniffer": "^3.0",
+ "phpbench/phpbench": "@dev",
+ "phpstan/phpstan": "^0.6.4",
+ "phpunit/phpunit": "<6.0 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Cake\\Chronos\\": "src/"
+ },
+ "files": [
+ "src/carbon_compat.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brian Nesbitt",
+ "email": "brian@nesbot.com",
+ "homepage": "http://nesbot.com"
+ },
+ {
+ "name": "The CakePHP Team",
+ "homepage": "http://cakephp.org"
+ }
+ ],
+ "description": "A simple API extension for DateTime.",
+ "homepage": "http://cakephp.org",
+ "keywords": [
+ "date",
+ "datetime",
+ "time"
+ ],
+ "time": "2018-07-11T18:51:56+00:00"
+ },
+ {
+ "name": "cakephp/migrations",
+ "version": "1.7.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/migrations.git",
+ "reference": "a5612adfd2efa8c90d29cb3b0c969de872a99eda"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/migrations/zipball/a5612adfd2efa8c90d29cb3b0c969de872a99eda",
+ "reference": "a5612adfd2efa8c90d29cb3b0c969de872a99eda",
+ "shasum": ""
+ },
+ "require": {
+ "cakephp/cache": "~3.2",
+ "cakephp/orm": "~3.2",
+ "php": ">=5.5.9",
+ "robmorgan/phinx": "0.8.1"
+ },
+ "require-dev": {
+ "cakephp/bake": "@stable",
+ "cakephp/cakephp": "~3.2",
+ "cakephp/cakephp-codesniffer": "^3.0",
+ "phpunit/phpunit": "~4.1"
+ },
+ "suggest": {
+ "cakephp/bake": "Required if you want to generate migrations."
+ },
+ "type": "cakephp-plugin",
+ "autoload": {
+ "psr-4": {
+ "Migrations\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "CakePHP Community",
+ "homepage": "https://github.com/cakephp/migrations/graphs/contributors"
+ }
+ ],
+ "description": "Database Migration plugin for CakePHP 3.0 based on Phinx",
+ "homepage": "https://github.com/cakephp/migrations",
+ "keywords": [
+ "cakephp",
+ "migrations"
+ ],
+ "time": "2017-12-12T21:01:38+00:00"
+ },
+ {
+ "name": "cakephp/plugin-installer",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/plugin-installer.git",
+ "reference": "41373d0678490502f45adc7be88aa22d24ac1843"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/plugin-installer/zipball/41373d0678490502f45adc7be88aa22d24ac1843",
+ "reference": "41373d0678490502f45adc7be88aa22d24ac1843",
+ "shasum": ""
+ },
+ "require-dev": {
+ "cakephp/cakephp-codesniffer": "dev-master",
+ "composer/composer": "1.0.*@dev",
+ "phpunit/phpunit": "^4.8|^5.7|^6.0"
+ },
+ "type": "composer-installer",
+ "extra": {
+ "class": "Cake\\Composer\\Installer\\PluginInstaller"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cake\\Composer\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "CakePHP Community",
+ "homepage": "http://cakephp.org"
+ }
+ ],
+ "description": "A composer installer for CakePHP 3.0+ plugins.",
+ "time": "2017-12-24T21:09:29+00:00"
+ },
+ {
+ "name": "dereuromark/cakephp-geo",
+ "version": "1.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dereuromark/cakephp-geo.git",
+ "reference": "c72464a9a7ea7c634f9345bb67f48589252336b3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dereuromark/cakephp-geo/zipball/c72464a9a7ea7c634f9345bb67f48589252336b3",
+ "reference": "c72464a9a7ea7c634f9345bb67f48589252336b3",
+ "shasum": ""
+ },
+ "require": {
+ "cakephp/orm": "^3.5",
+ "php": ">=5.6",
+ "willdurand/geocoder": "^3.3"
+ },
+ "require-dev": {
+ "cakephp/cakephp": "^3.5",
+ "fig-r/psr2r-sniffer": "dev-master"
+ },
+ "type": "cakephp-plugin",
+ "autoload": {
+ "psr-4": {
+ "Geo\\": "src",
+ "Geo\\Test\\Fixture\\": "tests/Fixture"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mark Scherer",
+ "homepage": "http://www.dereuromark.de",
+ "role": "Maintainer"
+ }
+ ],
+ "description": "A CakePHP plugin around geocoding tools and helpers.",
+ "homepage": "https://github.com/dereuromark/cakephp-geo",
+ "keywords": [
+ "cakephp",
+ "geocoding",
+ "helpers",
+ "maps",
+ "plugin"
+ ],
+ "time": "2018-10-10T14:34:17+00:00"
+ },
+ {
+ "name": "egeloen/http-adapter",
+ "version": "0.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/egeloen/ivory-http-adapter.git",
+ "reference": "9641f11487ec26b24c6bbcee4f267cf62f60b855"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/egeloen/ivory-http-adapter/zipball/9641f11487ec26b24c6bbcee4f267cf62f60b855",
+ "reference": "9641f11487ec26b24c6bbcee4f267cf62f60b855",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.8",
+ "zendframework/zend-diactoros": "^1.1"
+ },
+ "require-dev": {
+ "cakephp/cakephp": "^3.0.3",
+ "ext-curl": "*",
+ "guzzle/guzzle": "^3.9.4@dev",
+ "guzzlehttp/guzzle": "^4.1.4|^5.0|^6.0",
+ "kriswallsmith/buzz": "^0.13",
+ "nategood/httpful": "^0.2.17",
+ "phpunit/phpunit": "^4.0",
+ "phpunit/phpunit-mock-objects": "dev-matcher-verify as 2.3.x-dev",
+ "psr/log": "^1.0",
+ "react/dns": "^0.4.1",
+ "react/http-client": "^0.4",
+ "satooshi/php-coveralls": "^0.6",
+ "symfony/event-dispatcher": "^2.0",
+ "zendframework/zend-http": "^2.3.4",
+ "zendframework/zendframework1": ">=1.12.9,<=1.12.14|^1.12.16"
+ },
+ "suggest": {
+ "ext-curl": "Allows you to use the cURL adapter",
+ "ext-http": "Allows you to use the PECL adapter",
+ "guzzle/guzzle": "Allows you to use the Guzzle 3 adapter",
+ "guzzlehttp/guzzle": "Allows you to use the Guzzle 4 adapter",
+ "kriswallsmith/buzz": "Allows you to use the Buzz adapter",
+ "nategood/httpful": "Allows you to use the httpful adapter",
+ "psr/log": "Allows you to use the logger event subscriber",
+ "symfony/event-dispatcher": "Allows you to use the event lifecycle",
+ "symfony/stopwatch": "Allows you to use the stopwatch http adapter and event subscriber",
+ "zendframework/zend-http": "Allows you to use the Zend 2 adapter",
+ "zendframework/zendframework1": "Allows you to use the Zend 1 adapter"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.8-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Ivory\\HttpAdapter\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Eric GELOEN",
+ "email": "geloen.eric@gmail.com"
+ }
+ ],
+ "description": "Issue HTTP request for PHP 5.3+.",
+ "keywords": [
+ "http",
+ "http-adapter",
+ "http-client",
+ "psr-7"
+ ],
+ "abandoned": "php-http/httplug",
+ "time": "2015-08-12T09:35:40+00:00"
+ },
+ {
+ "name": "igorw/get-in",
+ "version": "v1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/igorw/get-in.git",
+ "reference": "170ded831f49abc6a6061f655aba9bdbcf7b8111"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/igorw/get-in/zipball/170ded831f49abc6a6061f655aba9bdbcf7b8111",
+ "reference": "170ded831f49abc6a6061f655aba9bdbcf7b8111",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/get_in.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch"
+ }
+ ],
+ "description": "Functions for for hash map (assoc array) traversal.",
+ "keywords": [
+ "assoc-array",
+ "hash-map"
+ ],
+ "time": "2014-12-15T23:03:51+00:00"
+ },
+ {
+ "name": "mobiledetect/mobiledetectlib",
+ "version": "2.8.33",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/serbanghita/Mobile-Detect.git",
+ "reference": "cd385290f9a0d609d2eddd165a1e44ec1bf12102"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/cd385290f9a0d609d2eddd165a1e44ec1bf12102",
+ "reference": "cd385290f9a0d609d2eddd165a1e44ec1bf12102",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8.35||~5.7"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "Mobile_Detect.php"
+ ],
+ "psr-0": {
+ "Detection": "namespaced/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Serban Ghita",
+ "email": "serbanghita@gmail.com",
+ "homepage": "http://mobiledetect.net",
+ "role": "Developer"
+ }
+ ],
+ "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.",
+ "homepage": "https://github.com/serbanghita/Mobile-Detect",
+ "keywords": [
+ "detect mobile devices",
+ "mobile",
+ "mobile detect",
+ "mobile detector",
+ "php mobile detect"
+ ],
+ "time": "2018-09-01T15:05:15+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "time": "2016-08-06T14:39:51+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "time": "2016-10-10T12:19:37+00:00"
+ },
+ {
+ "name": "robmorgan/phinx",
+ "version": "v0.8.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/phinx.git",
+ "reference": "7a19de5bebc59321edd9613bc2a667e7f96224ec"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/phinx/zipball/7a19de5bebc59321edd9613bc2a667e7f96224ec",
+ "reference": "7a19de5bebc59321edd9613bc2a667e7f96224ec",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4",
+ "symfony/config": "~2.8|~3.0",
+ "symfony/console": "~2.8|~3.0",
+ "symfony/yaml": "~2.8|~3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.26|^5.0"
+ },
+ "bin": [
+ "bin/phinx"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Phinx\\": "src/Phinx"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Woody Gilk",
+ "email": "woody.gilk@gmail.com",
+ "homepage": "http://shadowhand.me",
+ "role": "Developer"
+ },
+ {
+ "name": "Rob Morgan",
+ "email": "robbym@gmail.com",
+ "homepage": "https://robmorgan.id.au",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Richard Quadling",
+ "email": "rquadling@gmail.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "Phinx makes it ridiculously easy to manage the database migrations for your PHP app.",
+ "homepage": "https://phinx.org",
+ "keywords": [
+ "database",
+ "database migrations",
+ "db",
+ "migrations",
+ "phinx"
+ ],
+ "time": "2017-06-05T13:30:19+00:00"
+ },
+ {
+ "name": "siteavenger/avmaps",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "git@github.com:kwentworth/avmaps.git",
+ "reference": "64d96e015e0e5295f569571e8beb921978f07fa4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/kwentworth/avmaps/zipball/64d96e015e0e5295f569571e8beb921978f07fa4",
+ "reference": "64d96e015e0e5295f569571e8beb921978f07fa4",
+ "shasum": ""
+ },
+ "require": {
+ "cakephp/cakephp": "^3.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7|^6.0"
+ },
+ "type": "cakephp-plugin",
+ "autoload": {
+ "psr-4": {
+ "Avmaps\\": "src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Avmaps\\Test\\": "tests",
+ "Cake\\Test\\": "./vendor/cakephp/cakephp/tests"
+ }
+ },
+ "description": "Avmaps plugin for CakePHP",
+ "support": {
+ "source": "https://github.com/kwentworth/avmaps/tree/feature-fred-sg001",
+ "issues": "https://github.com/kwentworth/avmaps/issues"
+ },
+ "time": "2018-05-11T17:51:34+00:00"
+ },
+ {
+ "name": "symfony/config",
+ "version": "v3.4.17",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/config.git",
+ "reference": "e5389132dc6320682de3643091121c048ff796b3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/config/zipball/e5389132dc6320682de3643091121c048ff796b3",
+ "reference": "e5389132dc6320682de3643091121c048ff796b3",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9|>=7.0.8",
+ "symfony/filesystem": "~2.8|~3.0|~4.0",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<3.3",
+ "symfony/finder": "<3.3"
+ },
+ "require-dev": {
+ "symfony/dependency-injection": "~3.3|~4.0",
+ "symfony/event-dispatcher": "~3.3|~4.0",
+ "symfony/finder": "~3.3|~4.0",
+ "symfony/yaml": "~3.0|~4.0"
+ },
+ "suggest": {
+ "symfony/yaml": "To use the yaml reference dumper"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Config\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Config Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-09-08T13:15:14+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v3.4.17",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b",
+ "reference": "3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9|>=7.0.8",
+ "symfony/debug": "~2.8|~3.0|~4.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<3.4",
+ "symfony/process": "<3.3"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~3.3|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
+ "symfony/lock": "~3.4|~4.0",
+ "symfony/process": "~3.3|~4.0"
+ },
+ "suggest": {
+ "psr/log-implementation": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/lock": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Console Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-10-02T16:33:53+00:00"
+ },
+ {
+ "name": "symfony/debug",
+ "version": "v4.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/debug.git",
+ "reference": "e3f76ce6198f81994e019bb2b4e533e9de1b9b90"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/e3f76ce6198f81994e019bb2b4e533e9de1b9b90",
+ "reference": "e3f76ce6198f81994e019bb2b4e533e9de1b9b90",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "psr/log": "~1.0"
+ },
+ "conflict": {
+ "symfony/http-kernel": "<3.4"
+ },
+ "require-dev": {
+ "symfony/http-kernel": "~3.4|~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Debug\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Debug Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-10-02T16:36:10+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v4.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "596d12b40624055c300c8b619755b748ca5cf0b5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/596d12b40624055c300c8b619755b748ca5cf0b5",
+ "reference": "596d12b40624055c300c8b619755b748ca5cf0b5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Filesystem Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-10-02T12:40:59+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "e3d826245268269cd66f8326bd8bc066687b4a19"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19",
+ "reference": "e3d826245268269cd66f8326bd8bc066687b4a19",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ },
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "time": "2018-08-06T14:22:27+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8",
+ "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2018-08-06T14:22:27+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v3.4.17",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "640b6c27fed4066d64b64d5903a86043f4a4de7f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/640b6c27fed4066d64b64d5903a86043f4a4de7f",
+ "reference": "640b6c27fed4066d64b64d5903a86043f4a4de7f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9|>=7.0.8",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "conflict": {
+ "symfony/console": "<3.4"
+ },
+ "require-dev": {
+ "symfony/console": "~3.4|~4.0"
+ },
+ "suggest": {
+ "symfony/console": "For validating YAML files using the lint command"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-10-02T16:33:53+00:00"
+ },
+ {
+ "name": "willdurand/geocoder",
+ "version": "v3.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/geocoder-php/php-common.git",
+ "reference": "ccc178e2984c0af24881faa0ffe515f20e5e8c23"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/geocoder-php/php-common/zipball/ccc178e2984c0af24881faa0ffe515f20e5e8c23",
+ "reference": "ccc178e2984c0af24881faa0ffe515f20e5e8c23",
+ "shasum": ""
+ },
+ "require": {
+ "egeloen/http-adapter": "~0.8",
+ "igorw/get-in": "~1.0",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "geoip2/geoip2": "~2.0",
+ "symfony/stopwatch": "~2.5"
+ },
+ "suggest": {
+ "ext-geoip": "Enabling the geoip extension allows you to use the MaxMindProvider.",
+ "geoip/geoip": "If you are going to use the MaxMindBinaryProvider (conflict with geoip extension).",
+ "geoip2/geoip2": "If you are going to use the GeoIP2DatabaseProvider.",
+ "symfony/stopwatch": "If you want to use the TimedGeocoder"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Geocoder": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "William Durand",
+ "email": "william.durand1@gmail.com"
+ }
+ ],
+ "description": "The almost missing Geocoder PHP 5.4 library.",
+ "homepage": "http://geocoder-php.org",
+ "keywords": [
+ "abstraction",
+ "geocoder",
+ "geocoding",
+ "geoip"
+ ],
+ "time": "2015-12-06T20:17:20+00:00"
+ },
+ {
+ "name": "zendframework/zend-diactoros",
+ "version": "1.8.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/zendframework/zend-diactoros.git",
+ "reference": "20da13beba0dde8fb648be3cc19765732790f46e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/20da13beba0dde8fb648be3cc19765732790f46e",
+ "reference": "20da13beba0dde8fb648be3cc19765732790f46e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/http-message": "^1.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "php-http/psr7-integration-tests": "dev-master",
+ "phpunit/phpunit": "^5.7.16 || ^6.0.8 || ^7.2.7",
+ "zendframework/zend-coding-standard": "~1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.8.x-dev",
+ "dev-develop": "1.9.x-dev",
+ "dev-release-2.0": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions/create_uploaded_file.php",
+ "src/functions/marshal_headers_from_sapi.php",
+ "src/functions/marshal_method_from_sapi.php",
+ "src/functions/marshal_protocol_version_from_sapi.php",
+ "src/functions/marshal_uri_from_sapi.php",
+ "src/functions/normalize_server.php",
+ "src/functions/normalize_uploaded_files.php",
+ "src/functions/parse_cookie_header.php"
+ ],
+ "psr-4": {
+ "Zend\\Diactoros\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "description": "PSR HTTP Message implementations",
+ "homepage": "https://github.com/zendframework/zend-diactoros",
+ "keywords": [
+ "http",
+ "psr",
+ "psr-7"
+ ],
+ "time": "2018-09-05T19:29:37+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "ajgl/breakpoint-twig-extension",
+ "version": "0.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ajgarlag/AjglBreakpointTwigExtension.git",
+ "reference": "360ec6351ad7e1968ee78abb31430046c2e04fc5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ajgarlag/AjglBreakpointTwigExtension/zipball/360ec6351ad7e1968ee78abb31430046c2e04fc5",
+ "reference": "360ec6351ad7e1968ee78abb31430046c2e04fc5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6",
+ "twig/twig": "^1.14|^2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5",
+ "symfony/framework-bundle": "^2.7|^3.2",
+ "symfony/twig-bundle": "^2.7|^3.2"
+ },
+ "suggest": {
+ "ext-xdebug": "The Xdebug extension is required for the breakpoint to work",
+ "symfony/framework-bundle": "The framework bundle to integrate the extension into Symfony",
+ "symfony/twig-bundle": "The twig bundle to integrate the extension into Symfony"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Ajgl\\Twig\\Extension\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Antonio J. GarcÃa Lagar",
+ "email": "aj@garcialagar.es",
+ "homepage": "http://aj.garcialagar.es",
+ "role": "developer"
+ }
+ ],
+ "description": "Twig extension to set breakpoints",
+ "homepage": "https://github.com/ajgarlag/AjglBreakpointTwigExtension",
+ "keywords": [
+ "Xdebug",
+ "breakpoint",
+ "twig"
+ ],
+ "time": "2017-11-20T13:04:11+00:00"
+ },
+ {
+ "name": "aptoma/twig-markdown",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/aptoma/twig-markdown.git",
+ "reference": "64a9c5c7418c08faf91c4410b34bdb65fb25c23d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/aptoma/twig-markdown/zipball/64a9c5c7418c08faf91c4410b34bdb65fb25c23d",
+ "reference": "64a9c5c7418c08faf91c4410b34bdb65fb25c23d",
+ "shasum": ""
+ },
+ "require": {
+ "twig/twig": "~1.12"
+ },
+ "require-dev": {
+ "codeclimate/php-test-reporter": "dev-master",
+ "erusev/parsedown": "^1.6",
+ "knplabs/github-api": "~1.2",
+ "league/commonmark": "~0.5",
+ "michelf/php-markdown": "~1",
+ "phpunit/phpunit": "~4.0",
+ "satooshi/php-coveralls": "~0.6"
+ },
+ "suggest": {
+ "knplabs/github-api": "Needed for using GitHub's Markdown engine provided through their API.",
+ "michelf/php-markdown": "Original Markdown engine with MarkdownExtra."
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Aptoma": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Joris Berthelot",
+ "email": "joris@berthelot.tel"
+ },
+ {
+ "name": "Gunnar Lium",
+ "email": "gunnar@aptoma.com"
+ }
+ ],
+ "description": "Twig extension to work with Markdown content",
+ "keywords": [
+ "markdown",
+ "twig"
+ ],
+ "time": "2015-10-23T20:27:08+00:00"
+ },
+ {
+ "name": "asm89/twig-cache-extension",
+ "version": "1.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/asm89/twig-cache-extension.git",
+ "reference": "630ea7abdc3fc62ba6786c02590a1560e449cf55"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/asm89/twig-cache-extension/zipball/630ea7abdc3fc62ba6786c02590a1560e449cf55",
+ "reference": "630ea7abdc3fc62ba6786c02590a1560e449cf55",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2",
+ "twig/twig": "^1.0|^2.0"
+ },
+ "require-dev": {
+ "doctrine/cache": "~1.0"
+ },
+ "suggest": {
+ "psr/cache-implementation": "To make use of PSR-6 cache implementation via PsrCacheAdapter."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Alexander",
+ "email": "iam.asm89@gmail.com"
+ }
+ ],
+ "description": "Cache fragments of templates directly within Twig.",
+ "homepage": "https://github.com/asm89/twig-cache-extension",
+ "keywords": [
+ "cache",
+ "extension",
+ "twig"
+ ],
+ "time": "2017-01-10T22:04:15+00:00"
+ },
+ {
+ "name": "cakephp/bake",
+ "version": "1.6.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/bake.git",
+ "reference": "0ca2165ac770f8e3c7b278f3f022df14d7b0913a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/bake/zipball/0ca2165ac770f8e3c7b278f3f022df14d7b0913a",
+ "reference": "0ca2165ac770f8e3c7b278f3f022df14d7b0913a",
+ "shasum": ""
+ },
+ "require": {
+ "cakephp/cakephp": "^3.5.10",
+ "cakephp/plugin-installer": "^1.0",
+ "php": ">=5.6.0",
+ "wyrihaximus/twig-view": "^4.2.1"
+ },
+ "require-dev": {
+ "cakephp/cakephp-codesniffer": "^3.0",
+ "phpunit/phpunit": "^5.7 | ^6.0"
+ },
+ "type": "cakephp-plugin",
+ "autoload": {
+ "psr-4": {
+ "Bake\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "CakePHP Community",
+ "homepage": "https://github.com/cakephp/bake/graphs/contributors"
+ }
+ ],
+ "description": "Bake plugin for CakePHP 3",
+ "homepage": "https://github.com/cakephp/bake",
+ "keywords": [
+ "bake",
+ "cakephp"
+ ],
+ "time": "2018-03-10T01:47:21+00:00"
+ },
+ {
+ "name": "cakephp/debug_kit",
+ "version": "3.14.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/debug_kit.git",
+ "reference": "b5e11f386b9ff28694950f68ef3e0456c242051b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/debug_kit/zipball/b5e11f386b9ff28694950f68ef3e0456c242051b",
+ "reference": "b5e11f386b9ff28694950f68ef3e0456c242051b",
+ "shasum": ""
+ },
+ "require": {
+ "cakephp/cakephp": "^3.4.0",
+ "cakephp/chronos": "^1.0.0",
+ "cakephp/plugin-installer": "^1.0.0",
+ "composer/composer": "^1.3.0",
+ "jdorn/sql-formatter": "^1.2.0",
+ "php": ">=5.6.0"
+ },
+ "require-dev": {
+ "cakephp/cakephp-codesniffer": "^3.0",
+ "phpunit/phpunit": "^5.7|^6.0"
+ },
+ "suggest": {
+ "ext-sqlite": "DebugKit needs to store panel data in a database. SQLite is simple and easy to use."
+ },
+ "type": "cakephp-plugin",
+ "autoload": {
+ "psr-4": {
+ "DebugKit\\": "src",
+ "DebugKit\\Test\\Fixture\\": "tests\\Fixture"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mark Story",
+ "homepage": "http://mark-story.com",
+ "role": "Author"
+ },
+ {
+ "name": "CakePHP Community",
+ "homepage": "https://github.com/cakephp/debug_kit/graphs/contributors"
+ }
+ ],
+ "description": "CakePHP Debug Kit",
+ "homepage": "https://github.com/cakephp/debug_kit",
+ "keywords": [
+ "cakephp",
+ "debug",
+ "kit"
+ ],
+ "time": "2018-03-08T18:21:10+00:00"
+ },
+ {
+ "name": "composer/ca-bundle",
+ "version": "1.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/ca-bundle.git",
+ "reference": "46afded9720f40b9dc63542af4e3e43a1177acb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/46afded9720f40b9dc63542af4e3e43a1177acb0",
+ "reference": "46afded9720f40b9dc63542af4e3e43a1177acb0",
+ "shasum": ""
+ },
+ "require": {
+ "ext-openssl": "*",
+ "ext-pcre": "*",
+ "php": "^5.3.2 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5",
+ "psr/log": "^1.0",
+ "symfony/process": "^2.5 || ^3.0 || ^4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\CaBundle\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
+ "keywords": [
+ "cabundle",
+ "cacert",
+ "certificate",
+ "ssl",
+ "tls"
+ ],
+ "time": "2018-08-08T08:57:40+00:00"
+ },
+ {
+ "name": "composer/composer",
+ "version": "1.7.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/composer.git",
+ "reference": "576aab9b5abb2ed11a1c52353a759363216a4ad2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/composer/zipball/576aab9b5abb2ed11a1c52353a759363216a4ad2",
+ "reference": "576aab9b5abb2ed11a1c52353a759363216a4ad2",
+ "shasum": ""
+ },
+ "require": {
+ "composer/ca-bundle": "^1.0",
+ "composer/semver": "^1.0",
+ "composer/spdx-licenses": "^1.2",
+ "composer/xdebug-handler": "^1.1",
+ "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0",
+ "php": "^5.3.2 || ^7.0",
+ "psr/log": "^1.0",
+ "seld/jsonlint": "^1.4",
+ "seld/phar-utils": "^1.0",
+ "symfony/console": "^2.7 || ^3.0 || ^4.0",
+ "symfony/filesystem": "^2.7 || ^3.0 || ^4.0",
+ "symfony/finder": "^2.7 || ^3.0 || ^4.0",
+ "symfony/process": "^2.7 || ^3.0 || ^4.0"
+ },
+ "conflict": {
+ "symfony/console": "2.8.38"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7",
+ "phpunit/phpunit-mock-objects": "^2.3 || ^3.0"
+ },
+ "suggest": {
+ "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages",
+ "ext-zip": "Enabling the zip extension allows you to unzip archives",
+ "ext-zlib": "Allow gzip compression of HTTP requests"
+ },
+ "bin": [
+ "bin/composer"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\": "src/Composer"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "Composer helps you declare, manage and install dependencies of PHP projects, ensuring you have the right stack everywhere.",
+ "homepage": "https://getcomposer.org/",
+ "keywords": [
+ "autoload",
+ "dependency",
+ "package"
+ ],
+ "time": "2018-08-16T14:57:12+00:00"
+ },
+ {
+ "name": "composer/semver",
+ "version": "1.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/semver.git",
+ "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/semver/zipball/c7cb9a2095a074d131b65a8a0cd294479d785573",
+ "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.5 || ^5.0.5",
+ "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Semver\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ },
+ {
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com",
+ "homepage": "http://robbast.nl"
+ }
+ ],
+ "description": "Semver library that offers utilities, version constraint parsing and validation.",
+ "keywords": [
+ "semantic",
+ "semver",
+ "validation",
+ "versioning"
+ ],
+ "time": "2016-08-30T16:08:34+00:00"
+ },
+ {
+ "name": "composer/spdx-licenses",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/spdx-licenses.git",
+ "reference": "cb17687e9f936acd7e7245ad3890f953770dec1b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/cb17687e9f936acd7e7245ad3890f953770dec1b",
+ "reference": "cb17687e9f936acd7e7245ad3890f953770dec1b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5",
+ "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Spdx\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ },
+ {
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com",
+ "homepage": "http://robbast.nl"
+ }
+ ],
+ "description": "SPDX licenses list and validation library.",
+ "keywords": [
+ "license",
+ "spdx",
+ "validator"
+ ],
+ "time": "2018-04-30T10:33:04+00:00"
+ },
+ {
+ "name": "composer/xdebug-handler",
+ "version": "1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/xdebug-handler.git",
+ "reference": "b8e9745fb9b06ea6664d8872c4505fb16df4611c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/b8e9745fb9b06ea6664d8872c4505fb16df4611c",
+ "reference": "b8e9745fb9b06ea6664d8872c4505fb16df4611c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0",
+ "psr/log": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Composer\\XdebugHandler\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "John Stevenson",
+ "email": "john-stevenson@blueyonder.co.uk"
+ }
+ ],
+ "description": "Restarts a process without xdebug.",
+ "keywords": [
+ "Xdebug",
+ "performance"
+ ],
+ "time": "2018-08-31T19:07:57+00:00"
+ },
+ {
+ "name": "dnoegel/php-xdg-base-dir",
+ "version": "0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dnoegel/php-xdg-base-dir.git",
+ "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/265b8593498b997dc2d31e75b89f053b5cc9621a",
+ "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "@stable"
+ },
+ "type": "project",
+ "autoload": {
+ "psr-4": {
+ "XdgBaseDir\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "implementation of xdg base directory specification for php",
+ "time": "2014-10-24T07:27:01+00:00"
+ },
+ {
+ "name": "jakub-onderka/php-console-color",
+ "version": "v0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/JakubOnderka/PHP-Console-Color.git",
+ "reference": "d5deaecff52a0d61ccb613bb3804088da0307191"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/d5deaecff52a0d61ccb613bb3804088da0307191",
+ "reference": "d5deaecff52a0d61ccb613bb3804088da0307191",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "jakub-onderka/php-code-style": "1.0",
+ "jakub-onderka/php-parallel-lint": "1.0",
+ "jakub-onderka/php-var-dump-check": "0.*",
+ "phpunit/phpunit": "~4.3",
+ "squizlabs/php_codesniffer": "1.*"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "JakubOnderka\\PhpConsoleColor\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jakub Onderka",
+ "email": "jakub.onderka@gmail.com"
+ }
+ ],
+ "time": "2018-09-29T17:23:10+00:00"
+ },
+ {
+ "name": "jakub-onderka/php-console-highlighter",
+ "version": "v0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git",
+ "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/9f7a229a69d52506914b4bc61bfdb199d90c5547",
+ "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "jakub-onderka/php-console-color": "~0.2",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "jakub-onderka/php-code-style": "~1.0",
+ "jakub-onderka/php-parallel-lint": "~1.0",
+ "jakub-onderka/php-var-dump-check": "~0.1",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~1.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "JakubOnderka\\PhpConsoleHighlighter\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jakub Onderka",
+ "email": "acci@acci.cz",
+ "homepage": "http://www.acci.cz/"
+ }
+ ],
+ "description": "Highlight PHP code in terminal",
+ "time": "2018-09-29T18:48:56+00:00"
+ },
+ {
+ "name": "jasny/twig-extensions",
+ "version": "v1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jasny/twig-extensions.git",
+ "reference": "30bdf3a3903c021544f36332c9d5d4d563527da4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/jasny/twig-extensions/zipball/30bdf3a3903c021544f36332c9d5d4d563527da4",
+ "reference": "30bdf3a3903c021544f36332c9d5d4d563527da4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0 | >=5.6.0",
+ "twig/twig": "^2.0 | ^1.12"
+ },
+ "require-dev": {
+ "ext-intl": "*",
+ "ext-pcre": "*",
+ "jasny/php-code-quality": "^2.1",
+ "phpunit/phpunit": "^5.0"
+ },
+ "suggest": {
+ "ext-intl": "Required for the use of the LocalDate Twig extension",
+ "ext-pcre": "Required for the use of the PCRE Twig extension"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Jasny\\Twig\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Arnold Daniels",
+ "email": "arnold@jasny.net",
+ "homepage": "http://www.jasny.net"
+ }
+ ],
+ "description": "A set of useful Twig filters",
+ "homepage": "http://github.com/jasny/twig-extensions#README",
+ "keywords": [
+ "PCRE",
+ "array",
+ "date",
+ "datetime",
+ "preg",
+ "regex",
+ "templating",
+ "text",
+ "time"
+ ],
+ "time": "2017-09-13T07:38:01+00:00"
+ },
+ {
+ "name": "jdorn/sql-formatter",
+ "version": "v1.2.17",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jdorn/sql-formatter.git",
+ "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc",
+ "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "3.7.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "lib"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jeremy Dorn",
+ "email": "jeremy@jeremydorn.com",
+ "homepage": "http://jeremydorn.com/"
+ }
+ ],
+ "description": "a PHP SQL highlighting library",
+ "homepage": "https://github.com/jdorn/sql-formatter/",
+ "keywords": [
+ "highlight",
+ "sql"
+ ],
+ "time": "2014-01-12T16:20:24+00:00"
+ },
+ {
+ "name": "justinrainbow/json-schema",
+ "version": "5.2.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/justinrainbow/json-schema.git",
+ "reference": "8560d4314577199ba51bf2032f02cd1315587c23"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/8560d4314577199ba51bf2032f02cd1315587c23",
+ "reference": "8560d4314577199ba51bf2032f02cd1315587c23",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.1",
+ "json-schema/json-schema-test-suite": "1.2.0",
+ "phpunit/phpunit": "^4.8.35"
+ },
+ "bin": [
+ "bin/validate-json"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "JsonSchema\\": "src/JsonSchema/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bruno Prieto Reis",
+ "email": "bruno.p.reis@gmail.com"
+ },
+ {
+ "name": "Justin Rainbow",
+ "email": "justin.rainbow@gmail.com"
+ },
+ {
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch"
+ },
+ {
+ "name": "Robert Schönthal",
+ "email": "seroscho@googlemail.com"
+ }
+ ],
+ "description": "A library to validate a json schema.",
+ "homepage": "https://github.com/justinrainbow/json-schema",
+ "keywords": [
+ "json",
+ "schema"
+ ],
+ "time": "2018-02-14T22:26:30+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "d0230c5c77a7e3cfa69446febf340978540958c0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/d0230c5c77a7e3cfa69446febf340978540958c0",
+ "reference": "d0230c5c77a7e3cfa69446febf340978540958c0",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.5 || ^7.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "time": "2018-10-10T09:24:14+00:00"
+ },
+ {
+ "name": "psy/psysh",
+ "version": "v0.9.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/bobthecow/psysh.git",
+ "reference": "9aaf29575bb8293206bb0420c1e1c87ff2ffa94e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/9aaf29575bb8293206bb0420c1e1c87ff2ffa94e",
+ "reference": "9aaf29575bb8293206bb0420c1e1c87ff2ffa94e",
+ "shasum": ""
+ },
+ "require": {
+ "dnoegel/php-xdg-base-dir": "0.1",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*",
+ "nikic/php-parser": "~1.3|~2.0|~3.0|~4.0",
+ "php": ">=5.4.0",
+ "symfony/console": "~2.3.10|^2.4.2|~3.0|~4.0",
+ "symfony/var-dumper": "~2.7|~3.0|~4.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.2",
+ "hoa/console": "~2.15|~3.16",
+ "phpunit/phpunit": "~4.8.35|~5.0|~6.0|~7.0"
+ },
+ "suggest": {
+ "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
+ "ext-pdo-sqlite": "The doc command requires SQLite to work.",
+ "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.",
+ "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.",
+ "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit."
+ },
+ "bin": [
+ "bin/psysh"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-develop": "0.9.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "Psy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Justin Hileman",
+ "email": "justin@justinhileman.info",
+ "homepage": "http://justinhileman.com"
+ }
+ ],
+ "description": "An interactive shell for modern PHP.",
+ "homepage": "http://psysh.org",
+ "keywords": [
+ "REPL",
+ "console",
+ "interactive",
+ "shell"
+ ],
+ "time": "2018-10-13T15:16:03+00:00"
+ },
+ {
+ "name": "seld/jsonlint",
+ "version": "1.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/jsonlint.git",
+ "reference": "d15f59a67ff805a44c50ea0516d2341740f81a38"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/d15f59a67ff805a44c50ea0516d2341740f81a38",
+ "reference": "d15f59a67ff805a44c50ea0516d2341740f81a38",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ },
+ "bin": [
+ "bin/jsonlint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Seld\\JsonLint\\": "src/Seld/JsonLint/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "JSON Linter",
+ "keywords": [
+ "json",
+ "linter",
+ "parser",
+ "validator"
+ ],
+ "time": "2018-01-24T12:46:19+00:00"
+ },
+ {
+ "name": "seld/phar-utils",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/phar-utils.git",
+ "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/7009b5139491975ef6486545a39f3e6dad5ac30a",
+ "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Seld\\PharUtils\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be"
+ }
+ ],
+ "description": "PHAR file format utilities, for when PHP phars you up",
+ "keywords": [
+ "phra"
+ ],
+ "time": "2015-10-13T18:44:15+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v4.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "1f17195b44543017a9c9b2d437c670627e96ad06"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/1f17195b44543017a9c9b2d437c670627e96ad06",
+ "reference": "1f17195b44543017a9c9b2d437c670627e96ad06",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Finder Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-10-03T08:47:56+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php72",
+ "version": "v1.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php72.git",
+ "reference": "95c50420b0baed23852452a7f0c7b527303ed5ae"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/95c50420b0baed23852452a7f0c7b527303ed5ae",
+ "reference": "95c50420b0baed23852452a7f0c7b527303ed5ae",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php72\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2018-08-06T14:22:27+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v4.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "ee33c0322a8fee0855afcc11fff81e6b1011b529"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/ee33c0322a8fee0855afcc11fff81e6b1011b529",
+ "reference": "ee33c0322a8fee0855afcc11fff81e6b1011b529",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Process Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-10-02T12:40:59+00:00"
+ },
+ {
+ "name": "symfony/var-dumper",
+ "version": "v4.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "60319b45653580b0cdacca499344577d87732f16"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/60319b45653580b0cdacca499344577d87732f16",
+ "reference": "60319b45653580b0cdacca499344577d87732f16",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php72": "~1.5"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+ "symfony/console": "<3.4"
+ },
+ "require-dev": {
+ "ext-iconv": "*",
+ "symfony/process": "~3.4|~4.0",
+ "twig/twig": "~1.34|~2.4"
+ },
+ "suggest": {
+ "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+ "ext-intl": "To show region name in time zone dump",
+ "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
+ },
+ "bin": [
+ "Resources/bin/var-dump-server"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "Resources/functions/dump.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\VarDumper\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony mechanism for exploring and dumping PHP variables",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "debug",
+ "dump"
+ ],
+ "time": "2018-10-02T16:36:10+00:00"
+ },
+ {
+ "name": "twig/twig",
+ "version": "v1.35.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/twigphp/Twig.git",
+ "reference": "7e081e98378a1e78c29cc9eba4aefa5d78a05d2a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/7e081e98378a1e78c29cc9eba4aefa5d78a05d2a",
+ "reference": "7e081e98378a1e78c29cc9eba4aefa5d78a05d2a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "require-dev": {
+ "psr/container": "^1.0",
+ "symfony/debug": "^2.7",
+ "symfony/phpunit-bridge": "^3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.35-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Twig_": "lib/"
+ },
+ "psr-4": {
+ "Twig\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Armin Ronacher",
+ "email": "armin.ronacher@active-4.com",
+ "role": "Project Founder"
+ },
+ {
+ "name": "Twig Team",
+ "homepage": "https://twig.symfony.com/contributors",
+ "role": "Contributors"
+ }
+ ],
+ "description": "Twig, the flexible, fast, and secure template language for PHP",
+ "homepage": "https://twig.symfony.com",
+ "keywords": [
+ "templating"
+ ],
+ "time": "2018-07-13T07:12:17+00:00"
+ },
+ {
+ "name": "umpirsky/twig-php-function",
+ "version": "v0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/umpirsky/twig-php-function.git",
+ "reference": "53b4b1eb0c5eacbd7d66c504b7d809c79b4bedbc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/umpirsky/twig-php-function/zipball/53b4b1eb0c5eacbd7d66c504b7d809c79b4bedbc",
+ "reference": "53b4b1eb0c5eacbd7d66c504b7d809c79b4bedbc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "twig/twig": "~1.12"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "~2.0",
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Umpirsky\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "SaÅ¡a StamenkoviÄ",
+ "email": "umpirsky@gmail.com"
+ }
+ ],
+ "description": "Call (almost) any PHP function from your Twig templates.",
+ "time": "2016-03-12T16:36:32+00:00"
+ },
+ {
+ "name": "wyrihaximus/twig-view",
+ "version": "4.3.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/WyriHaximus/TwigView.git",
+ "reference": "ec2771e6a1fe799f9b16eff19da424cd04d593b7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/WyriHaximus/TwigView/zipball/ec2771e6a1fe799f9b16eff19da424cd04d593b7",
+ "reference": "ec2771e6a1fe799f9b16eff19da424cd04d593b7",
+ "shasum": ""
+ },
+ "require": {
+ "ajgl/breakpoint-twig-extension": "^0.3.0",
+ "aptoma/twig-markdown": "^2.0",
+ "asm89/twig-cache-extension": "^1.0",
+ "cakephp/cakephp": "^3.5",
+ "jasny/twig-extensions": "^1.0",
+ "php": "^5.6 || ^7.0",
+ "twig/twig": "^1.27",
+ "umpirsky/twig-php-function": "0.1"
+ },
+ "require-dev": {
+ "cakephp/bake": "^1.5",
+ "cakephp/debug_kit": "^3.0",
+ "phake/phake": "^1.0.4",
+ "phpunit/phpunit": "^5.7.14",
+ "squizlabs/php_codesniffer": "^1.5.6",
+ "wyrihaximus/phpunit-class-reflection-helpers": "dev-master"
+ },
+ "type": "cakephp-plugin",
+ "autoload": {
+ "psr-4": {
+ "WyriHaximus\\TwigView\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "ceesjank@gmail.com",
+ "homepage": "http://wyrihaximus.net/"
+ }
+ ],
+ "description": "Twig powered View for CakePHP3",
+ "keywords": [
+ "cakephp",
+ "cakephp3",
+ "twig",
+ "view"
+ ],
+ "time": "2018-07-03T15:46:29+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {
+ "cakephp/migrations": 0,
+ "siteavenger/avmaps": 20,
+ "psy/psysh": 0
+ },
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=5.6"
+ },
+ "platform-dev": []
+}
diff --git a/production/example_apps/zippy_maps/config/Migrations/20170421142733_create_locations_table.php b/production/example_apps/zippy_maps/config/Migrations/20170421142733_create_locations_table.php
new file mode 100644
index 00000000..29b48336
--- /dev/null
+++ b/production/example_apps/zippy_maps/config/Migrations/20170421142733_create_locations_table.php
@@ -0,0 +1,41 @@
+table('locations', ['id' => false, 'primary_key' => ['id']])
+ ->addColumn('id', 'integer', ['identity' => true, 'signed' => false])
+ ->addColumn('name', 'string', ['length' => 255, 'null' => false])
+ ->addColumn('location', 'string', ['length' => 1024, 'null' => false])
+ ->addColumn('latlong', 'string', ['length' => 255, 'null' => true])
+ ->addColumn('created', 'datetime')
+ ->addColumn('modified', 'datetime')
+ ->addIndex('name', ['unique' => true])
+ ->addIndex('location')
+ ->create();
+ }
+}
diff --git a/production/example_apps/zippy_maps/config/Migrations/20170426140248_create_categories_table.php b/production/example_apps/zippy_maps/config/Migrations/20170426140248_create_categories_table.php
new file mode 100644
index 00000000..95610e8c
--- /dev/null
+++ b/production/example_apps/zippy_maps/config/Migrations/20170426140248_create_categories_table.php
@@ -0,0 +1,41 @@
+table('categories', ['id' => false, 'primary_key' => ['id']])
+ ->addColumn('id', 'integer', ['identity' => true, 'signed' => false])
+ ->addColumn('name', 'string', ['length' => 255, 'null' => false])
+ ->addColumn('parent', 'integer', ['signed' => false, 'null' => true])
+ ->addColumn('created', 'datetime')
+ ->addColumn('modified', 'datetime')
+ ->addIndex('name', ['unique' => true])
+ ->create();
+ }
+}
+
+
diff --git a/production/example_apps/zippy_maps/config/Migrations/20170426150747_create_location_categories_table.php b/production/example_apps/zippy_maps/config/Migrations/20170426150747_create_location_categories_table.php
new file mode 100644
index 00000000..c9fb4c57
--- /dev/null
+++ b/production/example_apps/zippy_maps/config/Migrations/20170426150747_create_location_categories_table.php
@@ -0,0 +1,42 @@
+table('locations_categories', ['id' => false, 'primary_key' => ['id']])
+ ->addColumn('id', 'integer', ['identity' => true, 'signed' => false])
+ ->addColumn('location_id', 'integer', ['signed' => false])
+ ->addColumn('category_id', 'integer', ['signed' => false])
+ ->addColumn('created', 'datetime')
+ ->addColumn('modified', 'datetime')
+ ->addForeignKey('location_id', 'locations', 'id')
+ //not nullable, array('delete'=> 'SET_NULL', 'update'=> 'NO_ACTION')
+ ->addForeignKey('category_id', 'categories', 'id')
+ ->create();
+
+ }
+}
diff --git a/production/example_apps/zippy_maps/config/Migrations/20170501180455_drop_location_categories_table.php b/production/example_apps/zippy_maps/config/Migrations/20170501180455_drop_location_categories_table.php
new file mode 100644
index 00000000..92fbd7cf
--- /dev/null
+++ b/production/example_apps/zippy_maps/config/Migrations/20170501180455_drop_location_categories_table.php
@@ -0,0 +1,51 @@
+table('locations_categories')
+ ->drop();
+ }
+
+ public function down()
+ {
+ $this->table('locations_categories', ['id' => false, 'primary_key' => ['id']])
+ ->addColumn('id', 'integer', ['identity' => true, 'signed' => false])
+ ->addColumn('location_id', 'integer', ['signed' => false])
+ ->addColumn('category_id', 'integer', ['signed' => false])
+ ->addColumn('created', 'datetime')
+ ->addColumn('modified', 'datetime')
+ ->addForeignKey('location_id', 'locations', 'id')
+ //not nullable, array('delete'=> 'SET_NULL', 'update'=> 'NO_ACTION')
+ ->addForeignKey('category_id', 'categories', 'id')
+ ->create();
+ }
+}
diff --git a/production/example_apps/zippy_maps/config/Migrations/20170501183019_create_categories_locations_table.php b/production/example_apps/zippy_maps/config/Migrations/20170501183019_create_categories_locations_table.php
new file mode 100644
index 00000000..b718f356
--- /dev/null
+++ b/production/example_apps/zippy_maps/config/Migrations/20170501183019_create_categories_locations_table.php
@@ -0,0 +1,42 @@
+table('categories_locations', ['id' => false, 'primary_key' => ['id']])
+ ->addColumn('id', 'integer', ['identity' => true, 'signed' => false])
+ ->addColumn('location_id', 'integer', ['signed' => false])
+ ->addColumn('category_id', 'integer', ['signed' => false])
+ ->addColumn('created', 'datetime')
+ ->addColumn('modified', 'datetime')
+ ->addForeignKey('location_id', 'locations', 'id')
+ //not nullable, array('delete'=> 'SET_NULL', 'update'=> 'NO_ACTION')
+ ->addForeignKey('category_id', 'categories', 'id')
+ ->create();
+
+ }
+}
diff --git a/production/example_apps/zippy_maps/config/Migrations/20170519145000_add_image_to_categories.php b/production/example_apps/zippy_maps/config/Migrations/20170519145000_add_image_to_categories.php
new file mode 100644
index 00000000..dfb68675
--- /dev/null
+++ b/production/example_apps/zippy_maps/config/Migrations/20170519145000_add_image_to_categories.php
@@ -0,0 +1,34 @@
+table('categories')
+ ->addColumn('image', 'string', ['length' => 1024, 'null' => true])
+ ->update();
+ }
+}
diff --git a/production/example_apps/zippy_maps/config/Migrations/20170525190322_drop_parent_from_categories.php b/production/example_apps/zippy_maps/config/Migrations/20170525190322_drop_parent_from_categories.php
new file mode 100644
index 00000000..5c9f0142
--- /dev/null
+++ b/production/example_apps/zippy_maps/config/Migrations/20170525190322_drop_parent_from_categories.php
@@ -0,0 +1,38 @@
+table ( 'categories' )->removeColumn ( 'parent' )->update ();
+ }
+
+ public function down() {
+ $this->table ( 'categories' )->addColumn ( 'parent', 'integer', [
+ 'signed' => false
+ ] )->update ();
+ }
+}
diff --git a/production/example_apps/zippy_maps/config/Migrations/20170712140650_AddLatLongColumnsToLocationsTable.php b/production/example_apps/zippy_maps/config/Migrations/20170712140650_AddLatLongColumnsToLocationsTable.php
new file mode 100644
index 00000000..71c9b424
--- /dev/null
+++ b/production/example_apps/zippy_maps/config/Migrations/20170712140650_AddLatLongColumnsToLocationsTable.php
@@ -0,0 +1,24 @@
+table('locations');
+
+ $table->addColumn('lat', 'float', ['null' => true]);
+ $table->addColumn('lng', 'float', ['null' => true]);
+
+ $table->update();
+
+
+ }
+}
diff --git a/production/example_apps/zippy_maps/config/Migrations/20170712142151_TransmogrifyLatLongDataInLocations.php b/production/example_apps/zippy_maps/config/Migrations/20170712142151_TransmogrifyLatLongDataInLocations.php
new file mode 100644
index 00000000..d62aad2a
--- /dev/null
+++ b/production/example_apps/zippy_maps/config/Migrations/20170712142151_TransmogrifyLatLongDataInLocations.php
@@ -0,0 +1,77 @@
+find ();
+
+ // iterate across table on latlong.
+ foreach ( $query as $locat ) {
+ Log::write ( 'debug', 'id=' . var_export ( $locat->id, true ) . ' L&L=' . var_export ( $locat->latlong, true ) );
+ // do nothing if the field is empty.
+ if ($locat->latlong) {
+ // break out the two pieces.
+ $latlongExploded = explode ( ',', $locat->latlong );
+ Log::write ( 'debug', 'broke into lat=' . $latlongExploded [0] . ' lng=' . $latlongExploded [1] );
+
+ // now update the row where we got this info with same lat and long values in two columns.
+ $loc_update = $locations->get ( $locat->id );
+ $loc_update->lat = floatval ( $latlongExploded [0] );
+ $loc_update->lng = floatval ( $latlongExploded [1] );
+ $locations->save ( $loc_update );
+ }
+ }
+ }
+
+ /**
+ * performs the reverse case of migrating the two columns back into one.
+ * if we don't do this, we can't slide up and down the migration and rollback scale properly while keeping our lat and long data.
+ */
+ public function down() {
+ $locations = TableRegistry::get ( 'Locations' );
+
+ $query = $locations->find ();
+
+ // iterate across table on lat and long values.
+ foreach ( $query as $locat ) {
+ Log::write ( 'debug', 'id=' . var_export ( $locat->id, true ) . ' lat=' . var_export ( $locat->lat, true )
+ .' lng=' . var_export ( $locat->lng, true ));
+ // do nothing if the fields are empty.
+ if ($locat->lat && $locat->lng) {
+ // combine the two pieces.
+ $latlong = '' . $locat->lat . ',' . $locat->lng;
+ Log::write ( 'debug', 'combo is=' . $latlong);
+
+ // now update the row where we got these values to reproduce the single column.
+ $loc_update = $locations->get ( $locat->id );
+ $loc_update->latlong = $latlong;
+ $locations->save ( $loc_update );
+ }
+ }
+ }
+}
diff --git a/production/example_apps/zippy_maps/config/Migrations/20170712152942_DropLatlongFromLocationsTable.php b/production/example_apps/zippy_maps/config/Migrations/20170712152942_DropLatlongFromLocationsTable.php
new file mode 100644
index 00000000..1939f5f9
--- /dev/null
+++ b/production/example_apps/zippy_maps/config/Migrations/20170712152942_DropLatlongFromLocationsTable.php
@@ -0,0 +1,23 @@
+table ( 'locations' )->removeColumn ( 'latlong' )->update ();
+ }
+ /**
+ * but for preservation of former realities, we re-add the latlong column if we're going backwards.
+ * this supports our code for transmogrifying the coordinates between two column format and one
+ * column fomat.
+ */
+ public function down() {
+ $this->table ( 'locations' )->addColumn ( 'latlong', 'string', [
+ 'length' => 255,
+ 'null' => true
+ ] )->update ();
+ }
+}
diff --git a/production/example_apps/zippy_maps/config/Migrations/schema-dump-default.lock b/production/example_apps/zippy_maps/config/Migrations/schema-dump-default.lock
new file mode 100644
index 00000000..45d23890
Binary files /dev/null and b/production/example_apps/zippy_maps/config/Migrations/schema-dump-default.lock differ
diff --git a/production/example_apps/zippy_maps/config/app.default.php b/production/example_apps/zippy_maps/config/app.default.php
new file mode 100644
index 00000000..c06599e2
--- /dev/null
+++ b/production/example_apps/zippy_maps/config/app.default.php
@@ -0,0 +1,346 @@
+ filter_var(env('DEBUG', true), FILTER_VALIDATE_BOOLEAN),
+
+ /**
+ * Configure basic information about the application.
+ *
+ * - namespace - The namespace to find app classes under.
+ * - defaultLocale - The default locale for translation, formatting currencies and numbers, date and time.
+ * - encoding - The encoding used for HTML + database connections.
+ * - base - The base directory the app resides in. If false this
+ * will be auto detected.
+ * - dir - Name of app directory.
+ * - webroot - The webroot directory.
+ * - wwwRoot - The file path to webroot.
+ * - baseUrl - To configure CakePHP to *not* use mod_rewrite and to
+ * use CakePHP pretty URLs, remove these .htaccess
+ * files:
+ * /.htaccess
+ * /webroot/.htaccess
+ * And uncomment the baseUrl key below.
+ * - fullBaseUrl - A base URL to use for absolute links.
+ * - imageBaseUrl - Web path to the public images directory under webroot.
+ * - cssBaseUrl - Web path to the public css directory under webroot.
+ * - jsBaseUrl - Web path to the public js directory under webroot.
+ * - paths - Configure paths for non class based resources. Supports the
+ * `plugins`, `templates`, `locales` subkeys, which allow the definition of
+ * paths for plugins, view templates and locale files respectively.
+ */
+ 'App' => [
+ 'namespace' => 'App',
+ 'encoding' => env('APP_ENCODING', 'UTF-8'),
+ 'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
+ 'base' => false,
+ 'dir' => 'src',
+ 'webroot' => 'webroot',
+ 'wwwRoot' => WWW_ROOT,
+ // 'baseUrl' => env('SCRIPT_NAME'),
+ 'fullBaseUrl' => false,
+ 'imageBaseUrl' => 'img/',
+ 'cssBaseUrl' => 'css/',
+ 'jsBaseUrl' => 'js/',
+ 'paths' => [
+ 'plugins' => [ROOT . DS . 'plugins' . DS],
+ 'templates' => [APP . 'Template' . DS],
+ 'locales' => [APP . 'Locale' . DS],
+ ],
+ ],
+
+ /**
+ * Security and encryption configuration
+ *
+ * - salt - A random string used in security hashing methods.
+ * The salt value is also used as the encryption key.
+ * You should treat it as extremely sensitive data.
+ */
+ 'Security' => [
+ 'salt' => env('SECURITY_SALT', '__SALT__'),
+ ],
+
+ /**
+ * Apply timestamps with the last modified time to static assets (js, css, images).
+ * Will append a querystring parameter containing the time the file was modified.
+ * This is useful for busting browser caches.
+ *
+ * Set to true to apply timestamps when debug is true. Set to 'force' to always
+ * enable timestamping regardless of debug value.
+ */
+ 'Asset' => [
+ // 'timestamp' => true,
+ ],
+
+ /**
+ * Configure the cache adapters.
+ */
+ 'Cache' => [
+ 'default' => [
+ 'className' => 'File',
+ 'path' => CACHE,
+ 'url' => env('CACHE_DEFAULT_URL', null),
+ ],
+
+ /**
+ * Configure the cache used for general framework caching.
+ * Translation cache files are stored with this configuration.
+ * Duration will be set to '+2 minutes' in bootstrap.php when debug = true
+ * If you set 'className' => 'Null' core cache will be disabled.
+ */
+ '_cake_core_' => [
+ 'className' => 'File',
+ 'prefix' => 'myapp_cake_core_',
+ 'path' => CACHE . 'persistent/',
+ 'serialize' => true,
+ 'duration' => '+1 years',
+ 'url' => env('CACHE_CAKECORE_URL', null),
+ ],
+
+ /**
+ * Configure the cache for model and datasource caches. This cache
+ * configuration is used to store schema descriptions, and table listings
+ * in connections.
+ * Duration will be set to '+2 minutes' in bootstrap.php when debug = true
+ */
+ '_cake_model_' => [
+ 'className' => 'File',
+ 'prefix' => 'myapp_cake_model_',
+ 'path' => CACHE . 'models/',
+ 'serialize' => true,
+ 'duration' => '+1 years',
+ 'url' => env('CACHE_CAKEMODEL_URL', null),
+ ],
+ ],
+
+ /**
+ * Configure the Error and Exception handlers used by your application.
+ *
+ * By default errors are displayed using Debugger, when debug is true and logged
+ * by Cake\Log\Log when debug is false.
+ *
+ * In CLI environments exceptions will be printed to stderr with a backtrace.
+ * In web environments an HTML page will be displayed for the exception.
+ * With debug true, framework errors like Missing Controller will be displayed.
+ * When debug is false, framework errors will be coerced into generic HTTP errors.
+ *
+ * Options:
+ *
+ * - `errorLevel` - int - The level of errors you are interested in capturing.
+ * - `trace` - boolean - Whether or not backtraces should be included in
+ * logged errors/exceptions.
+ * - `log` - boolean - Whether or not you want exceptions logged.
+ * - `exceptionRenderer` - string - The class responsible for rendering
+ * uncaught exceptions. If you choose a custom class you should place
+ * the file for that class in src/Error. This class needs to implement a
+ * render method.
+ * - `skipLog` - array - List of exceptions to skip for logging. Exceptions that
+ * extend one of the listed exceptions will also be skipped for logging.
+ * E.g.:
+ * `'skipLog' => ['Cake\Network\Exception\NotFoundException', 'Cake\Network\Exception\UnauthorizedException']`
+ * - `extraFatalErrorMemory` - int - The number of megabytes to increase
+ * the memory limit by when a fatal error is encountered. This allows
+ * breathing room to complete logging or error handling.
+ */
+ 'Error' => [
+ 'errorLevel' => E_ALL,
+ 'exceptionRenderer' => 'Cake\Error\ExceptionRenderer',
+ 'skipLog' => [],
+ 'log' => true,
+ 'trace' => true,
+ ],
+
+ /**
+ * Email configuration.
+ *
+ * By defining transports separately from delivery profiles you can easily
+ * re-use transport configuration across multiple profiles.
+ *
+ * You can specify multiple configurations for production, development and
+ * testing.
+ *
+ * Each transport needs a `className`. Valid options are as follows:
+ *
+ * Mail - Send using PHP mail function
+ * Smtp - Send using SMTP
+ * Debug - Do not send the email, just return the result
+ *
+ * You can add custom transports (or override existing transports) by adding the
+ * appropriate file to src/Mailer/Transport. Transports should be named
+ * 'YourTransport.php', where 'Your' is the name of the transport.
+ */
+ 'EmailTransport' => [
+ 'default' => [
+ 'className' => 'Mail',
+ // The following keys are used in SMTP transports
+ 'host' => 'localhost',
+ 'port' => 25,
+ 'timeout' => 30,
+ 'username' => 'user',
+ 'password' => 'secret',
+ 'client' => null,
+ 'tls' => null,
+ 'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
+ ],
+ ],
+
+ /**
+ * Email delivery profiles
+ *
+ * Delivery profiles allow you to predefine various properties about email
+ * messages from your application and give the settings a name. This saves
+ * duplication across your application and makes maintenance and development
+ * easier. Each profile accepts a number of keys. See `Cake\Mailer\Email`
+ * for more information.
+ */
+ 'Email' => [
+ 'default' => [
+ 'transport' => 'default',
+ 'from' => 'you@localhost',
+ //'charset' => 'utf-8',
+ //'headerCharset' => 'utf-8',
+ ],
+ ],
+
+ /**
+ * Connection information used by the ORM to connect
+ * to your application's datastores.
+ * Do not use periods in database name - it may lead to error.
+ * See https://github.com/cakephp/cakephp/issues/6471 for details.
+ * Drivers include Mysql Postgres Sqlite Sqlserver
+ * See vendor\cakephp\cakephp\src\Database\Driver for complete list
+ */
+ 'Datasources' => [
+ 'default' => [
+ 'className' => 'Cake\Database\Connection',
+ 'driver' => 'Cake\Database\Driver\Mysql',
+ 'persistent' => false,
+ 'host' => 'localhost',
+ /**
+ * CakePHP will use the default DB port based on the driver selected
+ * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
+ * the following line and set the port accordingly
+ */
+ //'port' => 'non_standard_port_number',
+ 'username' => 'my_app',
+ 'password' => 'secret',
+ 'database' => 'my_app',
+ 'encoding' => 'utf8',
+ 'timezone' => 'UTC',
+ 'flags' => [],
+ 'cacheMetadata' => true,
+ 'log' => false,
+
+ /**
+ * Set identifier quoting to true if you are using reserved words or
+ * special characters in your table or column names. Enabling this
+ * setting will result in queries built using the Query Builder having
+ * identifiers quoted when creating SQL. It should be noted that this
+ * decreases performance because each query needs to be traversed and
+ * manipulated before being executed.
+ */
+ 'quoteIdentifiers' => false,
+
+ /**
+ * During development, if using MySQL < 5.6, uncommenting the
+ * following line could boost the speed at which schema metadata is
+ * fetched from the database. It can also be set directly with the
+ * mysql configuration directive 'innodb_stats_on_metadata = 0'
+ * which is the recommended value in production environments
+ */
+ //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
+
+ 'url' => env('DATABASE_URL', null),
+ ],
+
+ /**
+ * The test connection is used during the test suite.
+ */
+ 'test' => [
+ 'className' => 'Cake\Database\Connection',
+ 'driver' => 'Cake\Database\Driver\Mysql',
+ 'persistent' => false,
+ 'host' => 'localhost',
+ //'port' => 'non_standard_port_number',
+ 'username' => 'my_app',
+ 'password' => 'secret',
+ 'database' => 'test_myapp',
+ 'encoding' => 'utf8',
+ 'timezone' => 'UTC',
+ 'cacheMetadata' => true,
+ 'quoteIdentifiers' => false,
+ 'log' => false,
+ //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
+ 'url' => env('DATABASE_TEST_URL', null),
+ ],
+ ],
+
+ /**
+ * Configures logging options
+ */
+ 'Log' => [
+ 'debug' => [
+ 'className' => 'Cake\Log\Engine\FileLog',
+ 'path' => LOGS,
+ 'file' => 'debug',
+ 'levels' => ['notice', 'info', 'debug'],
+ 'url' => env('LOG_DEBUG_URL', null),
+ ],
+ 'error' => [
+ 'className' => 'Cake\Log\Engine\FileLog',
+ 'path' => LOGS,
+ 'file' => 'error',
+ 'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
+ 'url' => env('LOG_ERROR_URL', null),
+ ],
+ ],
+
+ /**
+ * Session configuration.
+ *
+ * Contains an array of settings to use for session configuration. The
+ * `defaults` key is used to define a default preset to use for sessions, any
+ * settings declared here will override the settings of the default config.
+ *
+ * ## Options
+ *
+ * - `cookie` - The name of the cookie to use. Defaults to 'CAKEPHP'.
+ * - `cookiePath` - The url path for which session cookie is set. Maps to the
+ * `session.cookie_path` php.ini config. Defaults to base path of app.
+ * - `timeout` - The time in minutes the session should be valid for.
+ * Pass 0 to disable checking timeout.
+ * Please note that php.ini's session.gc_maxlifetime must be equal to or greater
+ * than the largest Session['timeout'] in all served websites for it to have the
+ * desired effect.
+ * - `defaults` - The default configuration set to use as a basis for your session.
+ * There are four built-in options: php, cake, cache, database.
+ * - `handler` - Can be used to enable a custom session handler. Expects an
+ * array with at least the `engine` key, being the name of the Session engine
+ * class to use for managing the session. CakePHP bundles the `CacheSession`
+ * and `DatabaseSession` engines.
+ * - `ini` - An associative array of additional ini values to set.
+ *
+ * The built-in `defaults` options are:
+ *
+ * - 'php' - Uses settings defined in your php.ini.
+ * - 'cake' - Saves session files in CakePHP's /tmp directory.
+ * - 'database' - Uses CakePHP's database sessions.
+ * - 'cache' - Use the Cache class to save sessions.
+ *
+ * To define a custom session handler, save it at src/Network/Session/.php.
+ * Make sure the class implements PHP's `SessionHandlerInterface` and set
+ * Session.handler to
+ *
+ * To use database sessions, load the SQL file located at config/Schema/sessions.sql
+ */
+ 'Session' => [
+ 'defaults' => 'php',
+ ],
+];
diff --git a/production/example_apps/zippy_maps/config/bootstrap.php b/production/example_apps/zippy_maps/config/bootstrap.php
new file mode 100644
index 00000000..1ce9edb1
--- /dev/null
+++ b/production/example_apps/zippy_maps/config/bootstrap.php
@@ -0,0 +1,242 @@
+getMessage() . "\n");
+}
+
+/*
+ * Load an environment local configuration file.
+ * You can use a file like app_local.php to provide local overrides to your
+ * shared configuration.
+ */
+//Configure::load('app_local', 'default');
+
+/*
+ * When debug = true the metadata cache should only last
+ * for a short time.
+ */
+if (Configure::read('debug')) {
+ Configure::write('Cache._cake_model_.duration', '+2 minutes');
+ Configure::write('Cache._cake_core_.duration', '+2 minutes');
+}
+
+/*
+ * Set server timezone to UTC. You can change it to another timezone of your
+ * choice but using UTC makes time calculations / conversions easier.
+ */
+date_default_timezone_set('UTC');
+
+/*
+ * Configure the mbstring extension to use the correct encoding.
+ */
+mb_internal_encoding(Configure::read('App.encoding'));
+
+/*
+ * Set the default locale. This controls how dates, number and currency is
+ * formatted and sets the default language to use for translations.
+ */
+ini_set('intl.default_locale', Configure::read('App.defaultLocale'));
+
+/*
+ * Register application error and exception handlers.
+ */
+$isCli = PHP_SAPI === 'cli';
+if ($isCli) {
+ (new ConsoleErrorHandler(Configure::read('Error')))->register();
+} else {
+ (new ErrorHandler(Configure::read('Error')))->register();
+}
+
+/*
+ * Include the CLI bootstrap overrides.
+ */
+if ($isCli) {
+ require __DIR__ . '/bootstrap_cli.php';
+}
+
+/*
+ * Set the full base URL.
+ * This URL is used as the base of all absolute links.
+ *
+ * If you define fullBaseUrl in your config file you can remove this.
+ */
+if (!Configure::read('App.fullBaseUrl')) {
+ $s = null;
+ if (env('HTTPS')) {
+ $s = 's';
+ }
+
+ $httpHost = env('HTTP_HOST');
+ if (isset($httpHost)) {
+ Configure::write('App.fullBaseUrl', 'http' . $s . '://' . $httpHost);
+ }
+ unset($httpHost, $s);
+}
+
+Cache::setConfig(Configure::consume('Cache'));
+ConnectionManager::setConfig(Configure::consume('Datasources'));
+Email::setConfigTransport(Configure::consume('EmailTransport'));
+Email::setConfig(Configure::consume('Email'));
+Log::setConfig(Configure::consume('Log'));
+Security::salt(Configure::consume('Security.salt'));
+
+/*
+ * The default crypto extension in 3.0 is OpenSSL.
+ * If you are migrating from 2.x uncomment this code to
+ * use a more compatible Mcrypt based implementation
+ */
+//Security::engine(new \Cake\Utility\Crypto\Mcrypt());
+
+/*
+ * Setup detectors for mobile and tablet.
+ */
+Request::addDetector('mobile', function ($request) {
+ $detector = new \Detection\MobileDetect();
+
+ return $detector->isMobile();
+});
+Request::addDetector('tablet', function ($request) {
+ $detector = new \Detection\MobileDetect();
+
+ return $detector->isTablet();
+});
+
+/*
+ * Enable immutable time objects in the ORM.
+ *
+ * You can enable default locale format parsing by adding calls
+ * to `useLocaleParser()`. This enables the automatic conversion of
+ * locale specific date formats. For details see
+ * @link http://book.cakephp.org/3.0/en/core-libraries/internationalization-and-localization.html#parsing-localized-datetime-data
+ */
+Type::build('time')
+ ->useImmutable();
+Type::build('date')
+ ->useImmutable();
+Type::build('datetime')
+ ->useImmutable();
+Type::build('timestamp')
+ ->useImmutable();
+
+ /*
+ * Custom Inflector rules, can be set to correctly pluralize or singularize
+ * table, model, controller names or whatever other string is passed to the
+ * inflection functions.
+ */
+ // Inflector::rules('plural', ['/^(inflect)or$/i' => '\1ables']);
+ // Inflector::rules('irregular', ['red' => 'redlings']);
+ // Inflector::rules('uninflected', ['dontinflectme']);
+ // Inflector::rules('transliteration', ['/Ã¥/' => 'aa']);
+
+/*
+ * Plugins need to be loaded manually, you can either load them one by one or all of them in a single call
+ * Uncomment one of the lines below, as you need. make sure you read the documentation on Plugin to use more
+ * advanced ways of loading plugins
+ *
+ * Plugin::loadAll(); // Loads all plugins at once
+ * Plugin::load('Migrations'); //Loads a single plugin named Migrations
+ *
+ */
+
+/*
+ * Only try to load DebugKit in development mode
+ * Debug Kit should not be installed on a production system
+ */
+if (Configure::read ( 'debug' )) {
+ Plugin::load ( 'DebugKit', [
+ 'bootstrap' => true
+ ] );
+}
+
+Plugin::load ( 'Migrations' );
+
+// hoist up the geocoder and maps support, matey.
+Plugin::load ( 'Geo', [
+ 'bootstrap' => true
+] );
+
+Plugin::load ( 'DebugKit' );
+
+
+Plugin::load('Avmaps', ['bootstrap' => false, 'routes' => true]);
+
+
diff --git a/production/example_apps/zippy_maps/config/bootstrap_cli.php b/production/example_apps/zippy_maps/config/bootstrap_cli.php
new file mode 100644
index 00000000..f822a557
--- /dev/null
+++ b/production/example_apps/zippy_maps/config/bootstrap_cli.php
@@ -0,0 +1,38 @@
+ [
+ 'key' => 'your-api-key-here',
+ ],
+];
+
+
+?>
+
diff --git a/production/example_apps/zippy_maps/config/paths.php b/production/example_apps/zippy_maps/config/paths.php
new file mode 100644
index 00000000..fcaba5ce
--- /dev/null
+++ b/production/example_apps/zippy_maps/config/paths.php
@@ -0,0 +1,85 @@
+connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
+
+ /**
+ * ...and connect the rest of 'Pages' controller's URLs.
+ */
+ $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
+
+ // enable the categories controller to function as an API.
+ $routes->resources('Categories',
+ [ 'actions' => ['create' => 'lookupajax'] ]);
+ // enable the locations controller to function as an API.
+ $routes->resources('Locations',
+ [ 'actions' => ['create' => 'lookupajax'] ]);
+
+
+ /**
+ * Connect catchall routes for all controllers.
+ *
+ * Using the argument `DashedRoute`, the `fallbacks` method is a shortcut for
+ * `$routes->connect('/:controller', ['action' => 'index'], ['routeClass' => 'DashedRoute']);`
+ * `$routes->connect('/:controller/:action/*', [], ['routeClass' => 'DashedRoute']);`
+ *
+ * Any route class can be used with this method, such as:
+ * - DashedRoute
+ * - InflectedRoute
+ * - Route
+ * - Or your own route class
+ *
+ * You can remove these routes once you've connected the
+ * routes you want in your application.
+ */
+ $routes->fallbacks(DashedRoute::class);
+});
+
+/**
+ * Load all plugin routes. See the Plugin documentation on
+ * how to customize the loading of plugin routes.
+ */
+Plugin::routes();
diff --git a/production/example_apps/zippy_maps/config/schema/i18n.sql b/production/example_apps/zippy_maps/config/schema/i18n.sql
new file mode 100644
index 00000000..47cf171d
--- /dev/null
+++ b/production/example_apps/zippy_maps/config/schema/i18n.sql
@@ -0,0 +1,18 @@
+# Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+#
+# Licensed under The MIT License
+# For full copyright and license information, please see the LICENSE.txt
+# Redistributions of files must retain the above copyright notice.
+# MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+CREATE TABLE i18n (
+ id int NOT NULL auto_increment,
+ locale varchar(6) NOT NULL,
+ model varchar(255) NOT NULL,
+ foreign_key int(10) NOT NULL,
+ field varchar(255) NOT NULL,
+ content text,
+ PRIMARY KEY (id),
+ UNIQUE INDEX I18N_LOCALE_FIELD(locale, model, foreign_key, field),
+ INDEX I18N_FIELD(model, foreign_key, field)
+);
diff --git a/production/example_apps/zippy_maps/config/schema/sessions.sql b/production/example_apps/zippy_maps/config/schema/sessions.sql
new file mode 100644
index 00000000..b5a5276b
--- /dev/null
+++ b/production/example_apps/zippy_maps/config/schema/sessions.sql
@@ -0,0 +1,13 @@
+# Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+#
+# Licensed under The MIT License
+# For full copyright and license information, please see the LICENSE.txt
+# Redistributions of files must retain the above copyright notice.
+# MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+CREATE TABLE sessions (
+ id char(40) NOT NULL,
+ data text,
+ expires INT(11) NOT NULL,
+ PRIMARY KEY (id)
+);
diff --git a/production/example_apps/zippy_maps/docs/google_api_info.txt b/production/example_apps/zippy_maps/docs/google_api_info.txt
new file mode 100644
index 00000000..2cb4e90d
--- /dev/null
+++ b/production/example_apps/zippy_maps/docs/google_api_info.txt
@@ -0,0 +1,9 @@
+
+
+get an api key for your project:
+(link)
+
+add the features required on that api key:
+(links)
+including distance matrix, geocoder, javascript api,
+
diff --git a/production/example_apps/zippy_maps/docs/mysql_scratch_sheet_looking_at_tables_v001.sql b/production/example_apps/zippy_maps/docs/mysql_scratch_sheet_looking_at_tables_v001.sql
new file mode 100644
index 00000000..e4cad48a
--- /dev/null
+++ b/production/example_apps/zippy_maps/docs/mysql_scratch_sheet_looking_at_tables_v001.sql
@@ -0,0 +1,18 @@
+show databases;
+#create database zipcodes;
+use zipcodes;
+
+describe categories;
+
+select * from categories where image is null;
+
+describe locations;
+
+select * from locations where id > 3000;
+
+# useful floating point compare technique.
+select * from locations where abs(lat - '18.17') <= 1e-6;
+
+select * from locations where id = 607;
+
+select * from locations ;
diff --git a/production/example_apps/zippy_maps/docs/producing_location_tables_from_zip_db_v001.sql b/production/example_apps/zippy_maps/docs/producing_location_tables_from_zip_db_v001.sql
new file mode 100644
index 00000000..03c5692c
--- /dev/null
+++ b/production/example_apps/zippy_maps/docs/producing_location_tables_from_zip_db_v001.sql
@@ -0,0 +1,40 @@
+# note: this code was appropriate before migration AddLatLongColumnsToLocationsTable happened in july 2017.
+# if one wanted to take a kake zip style db to the map demo db, there would be a few changes (such as getting rid of the
+# combining of lat and long into a single field).
+
+# a bunch of helper bits. real important code is at the end.
+use zipcodes;
+select database();
+show tables;
+select * from kake_zip_code;
+select lat, lon, locationtext, country from kake_zip_code ;
+select location, concat(lat, ',', lon), concat(locationtext, ' ', zip_code, ', ', country) from kake_zip_code where lat != 0 and lon != 0 limit 500;
+describe locations;
+describe categories;
+describe categories_locations;
+
+# testing select with concats.
+select location, concat(locationtext, ' ', zip_code), concat(lat, ',', lon) from kake_zip_code where lat != 0 and lon != 0 limit 500;
+
+select * from kake_zip_code limit 500;
+select * from locations;
+select * from categories;
+select * from categories_locations;
+delete from locations where id != 0;
+ALTER TABLE locations AUTO_INCREMENT = 1;
+delete from categories where id != 0;
+ALTER TABLE categories AUTO_INCREMENT = 1;
+delete from categories_locations where id != 0;
+ALTER TABLE categories_locations AUTO_INCREMENT = 1;
+
+select * from locations where location like '%, AK %';
+
+# these are the important actions...
+
+# the real business gets done by these inserts.
+insert into locations (id, name, location, latlong, created, modified) select null, concat(location, '-', zip_code), concat(locationtext, ' ', zip_code), concat(lat, ',', lon), now(), now() from kake_zip_code where lat != 0 and lon != 0 limit 500000;
+insert ignore into categories (id, name, created, modified, image) select null, concat(country, '-', state_prefix), now(), now(), null from kake_zip_code where lat != 0 and lon != 0 limit 500000;
+# big one, getting the categories done automatically...
+insert ignore into categories_locations (id, location_id, category_id, created, modified)
+ select null, locations.id as location_id, categories.id as category_id, now(), now() from locations inner join categories where locations.name like concat('%', categories.name, '%') limit 500000;
+
diff --git a/production/example_apps/zippy_maps/docs/zipcode_dump-sql.zip b/production/example_apps/zippy_maps/docs/zipcode_dump-sql.zip
new file mode 100644
index 00000000..8cfd2156
Binary files /dev/null and b/production/example_apps/zippy_maps/docs/zipcode_dump-sql.zip differ
diff --git a/production/example_apps/zippy_maps/index.php b/production/example_apps/zippy_maps/index.php
new file mode 100644
index 00000000..fc5e39cc
--- /dev/null
+++ b/production/example_apps/zippy_maps/index.php
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+ ./tests/TestCase
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ./src/
+ ./plugins/*/src/
+
+
+
diff --git a/production/example_apps/zippy_maps/readme.txt b/production/example_apps/zippy_maps/readme.txt
new file mode 100644
index 00000000..6231a9e4
--- /dev/null
+++ b/production/example_apps/zippy_maps/readme.txt
@@ -0,0 +1,42 @@
+
+steps to bringing up this maps demo site...
+
+* need to configure a database in app.php. see default version: config/app.default.php
+
+* need an api key from google to have separate hit quotas on mapping API.
+ * refer to: https://developers.google.com/maps/documentation/distance-matrix/get-api-key
+ * see default version: config/config_google.default.php
+ * example of using api key:
+ * https://maps.googleapis.com/maps/api/distancematrix/json?origins=Seattle&destinations=San+Francisco&key=YOUR_API_KEY
+
+* need to install the cake geo code.
+ * more details at: https://github.com/dereuromark/cakephp-geo/blob/master/docs/Install.md
+
+* need to have jquery available and loaded someplace. i got a recent minified version of it and stored it in webroot/js and then added this to default.ctp before the fetch('script') call:
+
+
+* need to load the marker clusterer code for map marker clustering to work. see ClusterMapHelper.php for more info.
+
+* a bunch of icons for map markers can be found here: https://code.google.com/archive/p/google-maps-icons/downloads
+
+* need to make links for the plugins:
+ from: https://book.cakephp.org/3.0/en/deployment.html#symlink-assets
+ run: bin/cake plugin assets symlink
+
+---
+
+assorted reference notes:
+
+mysql and php using javascript api with maps:
+https://developers.google.com/maps/documentation/javascript/mysql-to-maps
+
+how to show things in a form with checkboxes:
+https://book.cakephp.org/3.0/en/views/helpers/form.html#creating-inputs-for-associated-data
+
+tagList above is computed this way:
+https://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#finding-key-value-pairs
+
+events that can be hooked are listed here:
+https://developers.google.com/maps/documentation/javascript/reference
+
+
diff --git a/production/example_apps/zippy_maps/reference/zipcode.php b/production/example_apps/zippy_maps/reference/zipcode.php
new file mode 100644
index 00000000..1bfe72f3
--- /dev/null
+++ b/production/example_apps/zippy_maps/reference/zipcode.php
@@ -0,0 +1,829 @@
+get_zips_in_range($this->zipPageConditions['zip'], $this->zipPageConditions['range'], $this->zipPageConditions['sort']);
+ $page_data = array();
+ //loop through page data
+
+
+ return $this->zipInRangeData;
+ }
+
+ function paginateCount($conditions = null, $recursive = 0) {
+ return count($this->zipInRangeData);
+ }
+
+
+
+ /*
+ * TAKEN FROM MICCAH CODE
+ */
+
+ var $last_error = ""; // last error message set by this class
+ var $units = _UNIT_MILES; // miles or kilometers
+ var $decimals = 2; // decimal places for returned distance
+
+ function get_distance($zip1, $zip2) {
+
+ // returns the distance between to zip codes. If there is an error, the
+ // function will return false and set the $last_error variable.
+
+ if ($zip1 == $zip2)
+ return 0; // same zip code means 0 miles between. :)
+
+
+ // get details from database about each zip and exit if there is an error
+
+ $details1 = $this->get_zip_point($zip1);
+ $details2 = $this->get_zip_point($zip2);
+ if ($details1 == false) {
+ $this->last_error = "No details found for zip code: $zip1";
+ return false;
+ }
+ if ($details2 == false) {
+ $this->last_error = "No details found for zip code: $zip2";
+ return false;
+ }
+
+
+ // calculate the distance between the two points based on the lattitude
+ // and longitude pulled out of the database.
+
+ $miles = $this->calculate_mileage($details1['lat'], $details2['lat'], $details1['lon'], $details2['lon']);
+
+
+
+ if ($this->units == _UNIT_KILOMETERS) return round($miles * _M2KM_FACTOR, $this->decimals);
+ else return round($miles, $this->decimals); // must be miles
+
+ }
+
+
+ /**
+ *
+ * Lookups up a zip code and returns single array or multi-array based on sending multiple zip codes in array or just a string
+ * @param $zip
+ */
+ function lookup($zip, $options = array()) {
+ $default_options =
+ array(
+ 'bare' => false, //set to true to strip outer Zipcode dimension
+ );
+ $options = am($default_options, $options);
+
+ if(is_array($zip)) {
+ // find all
+ $data = $this->find('all', array('conditions'=>array('Zipcode.zip_code'=>$zip), 'recursive' => -1));
+ } else {
+ // find first
+ $data = $this->find('first', array('conditions'=>array('Zipcode.zip_code'=>$zip), 'recursive' => -1));
+ }
+
+ if($options['bare']) {
+ $data = $data['Zipcode'];
+ }
+ return $data;
+ }
+
+ /**
+ *
+ * This returns all zip codes (even if one sent)
+ * @param $zip
+ */
+ function get_zip_details($zip) {
+ if (!$data = $this->find('all',array('conditions'=>array('zip_code'=>$zip)))){
+ return false;
+ } else {
+ return $data;
+ }
+ }
+
+ function get_details_by_city($cityname) {
+
+ if (!$data = $this->find('all', array('conditions'=>array('city LIKE'=>$cityname),'recursive'=>-1))) {
+ return false;
+ } else {
+ return $data;
+ }
+ }
+
+ function get_details_by_lat_lon($geolocation) {
+ if (!$data = $this->find('all', array('conditions'=>array('lat'=>$geolocation['latitude'],'lon'=>$geolocation['longitude']),'recursive'=>-1))) {
+ return false;
+ } else {
+ return $data;
+ }
+ }
+ function get_details_by_location($locationtext) {
+
+ if (!$data = $this->find('all', array('conditions'=>array('locationtext LIKE'=>$locationtext),'recursive'=>-1))) {
+ return false;
+ } else {
+ return $data;
+ }
+ }
+
+ function get_details_by_county($county, $state_id){
+ if (!$data = $this->find('all', array('conditions'=>array('county LIKE'=>$county, 'state_prefix LIKE'=>$state_id),'recursive'=>-1))) {
+ return false;
+ } else {
+ return $data;
+ }
+
+ }
+
+
+ function get_locations_by_state($stateprefix) {
+ if (!$data = $this->find('all', array('conditions'=>array('state_prefix LIKE'=>$stateprefix),'recursive'=>-1,'order'=>array('zip_code'=>'asc')))){
+ return false;
+ } else {
+ return $data;
+ }
+ }
+
+ function get_locations_by_county($county) {
+
+ if (!$data = $this->find('all', array('conditions'=>array('county LIKE'=>$county),'recursive'=>-1))){
+
+ return false;
+ } else {
+ return $data;
+ }
+ }
+
+ function get_counties_by_state($stateprefix) {
+
+ if (!$data = $this->find('all', array('fields'=>array('DISTINCT county'),'conditions'=>array('state_prefix LIKE'=>$stateprefix),'recursive'=>-1,'order'=>array('county'=>'asc')))){
+ return false;
+ } else {
+ return $data;
+ }
+ }
+
+ function get_zip_point($zip) {
+
+ // This function pulls just the lattitude and longitude from the
+ // database for a given zip code.
+ //$sql = "SELECT lat, lon from {$this->tablePrefix}zip_code WHERE zip_code='$zip'";
+ //$r = mysql_query($sql);
+
+ if (!$data = $this->find(array('zip_code'=>$zip), array('lat', 'lon'))) {
+ //$this->last_error = mysql_error();
+ return false;
+ } else {
+ //$row = mysql_fetch_array($r);
+ //mysql_free_result($r);
+ //var_dump($data['Zipcode']);
+ //return $row;
+ return $data['Zipcode'];
+ }
+ }
+
+
+ function calculate_mileage($lat1, $lat2, $lon1, $lon2) {
+
+ // used internally, this function actually performs that calculation to
+ // determine the mileage between 2 points defined by lattitude and
+ // longitude coordinates. This calculation is based on the code found
+ // at http://www.cryptnet.net/fsp/zipdy/
+
+ // Convert lattitude/longitude (degrees) to radians for calculations
+ $lat1 = deg2rad($lat1);
+ $lon1 = deg2rad($lon1);
+ $lat2 = deg2rad($lat2);
+ $lon2 = deg2rad($lon2);
+
+ // Find the deltas
+ $delta_lat = $lat2 - $lat1;
+ $delta_lon = $lon2 - $lon1;
+
+ // Find the Great Circle distance
+ $temp = pow(sin($delta_lat/2.0),2) + cos($lat1) * cos($lat2) * pow(sin($delta_lon/2.0),2);
+ $distance = 3956 * 2 * atan2(sqrt($temp),sqrt(1-$temp));
+
+ return $distance;
+ }
+
+ function get_zips_in_range($zip, $range, $sort=1, $include_base = true, $options = array()) {
+ $default_options = array('datasource' => null, 'conditions' => array());
+ $options = Set::merge($default_options, $options);
+
+ //echo 'kevin';
+ // returns an array of the zip codes within $range of $zip. Returns
+ // an array with keys as zip codes and values as the distance from
+ // the zipcode defined in $zip.
+ //var_dump($zip,$range);
+
+ if(is_array($zip)) {
+ //passing an array with zip code detail(s) known, don't need to lookup
+ if(isset($zip['latitude'])) {
+ $zip['lat'] = $zip['latitude'];
+ unset($zip['latitude']);
+ }
+ if(isset($zip['longitude'])) {
+ $zip['lon'] = $zip['longitude'];
+ unset($zip['longitude']);
+ }
+ $details = $zip;
+ } else {
+ $details = $this->get_zip_point($zip); // base zip details
+ }
+
+ if ($details == false) return false;
+
+ // This portion of the routine calculates the minimum and maximum lat and
+ // long within a given range. This portion of the code was written
+ // by Jeff Bearer (http://www.jeffbearer.com). This significanly decreases
+ // the time it takes to execute a query. My demo took 3.2 seconds in
+ // v1.0.0 and now executes in 0.4 seconds! Greate job Jeff!
+
+ // Find Max - Min Lat / Long for Radius and zero point and query
+ // only zips in that range.
+
+
+ $lat_range = $range/69.172;
+ $lon_range = abs($range/(cos($details['lat']) * 69.172));
+ $min_lat = number_format($details['lat'] - $lat_range, "4", ".", "");
+ $max_lat = number_format($details['lat'] + $lat_range, "4", ".", "");
+ $min_lon = number_format($details['lon'] - $lon_range, "4", ".", "");
+ $max_lon = number_format($details['lon'] + $lon_range, "4", ".", "");
+
+ $return = array(); // declared here for scope
+
+ /* $sql = "SELECT zip_code, lat, lon FROM zip_code ";
+ if (!$include_base) $sql .= "WHERE zip_code <> '$zip' AND ";
+ else $sql .= "WHERE ";
+ $sql .= "lat BETWEEN '$min_lat' AND '$max_lat'
+ AND lon BETWEEN '$min_lon' AND '$max_lon'"; */
+
+ $conditions = array();
+ if($range === 'all') {
+ // don't want to have a range
+ // $conditions = array()
+ } else {
+ if(!$include_base) {
+ $conditions['zip_code'] = "<> $zip";
+ } else {
+ $conditions['lat BETWEEN ? AND ?'] = array($min_lat, $max_lat);
+ $conditions['lon BETWEEN ? AND ?'] = array($min_lon, $max_lon);
+ }
+ }
+
+ if($options['conditions']) {
+ $conditions = Set::merge($options['conditions'], $conditions);
+ }
+
+ if($options['datasource']) {
+ $datasource =& ClassRegistry::init($options['datasource'], 'model');
+ $data = $datasource->find('all', array('conditions' =>$conditions, 'recursive' => -1));
+
+ list($pluginName, $modelName) = pluginSplit($options['datasource']);
+
+ } else {
+ $data = $this->find('all', array('conditions' =>$conditions));
+ $pluginName = null;
+ $modelName = 'Zipcode';
+ }
+
+ if (!$data) { // sql error
+ //var_dump($data);
+ //$this->last_error = mysql_error();
+ return false;
+
+ } else {
+ //return;
+ /*while ($row = mysql_fetch_row($r)) {
+
+ // loop through all 40 some thousand zip codes and determine whether
+ // or not it's within the specified range.
+
+ $dist = $this->calculate_mileage($details[0],$row[1],$details[1],$row[2]);
+ if ($this->units == _UNIT_KILOMETERS) $dist = $dist * _M2KM_FACTOR;
+ if ($dist <= $range) {
+ $return[str_pad($row[0], 5, "0", STR_PAD_LEFT)] = round($dist, $this->decimals);
+ }
+ }
+ mysql_free_result($r);*/
+ $zip1VarName = 'zip_code';
+ $zip1 = null;
+ if(isset($details['zip'])) {
+ $zip1 = $details['zip'];
+ $zip1VarName = 'zip';
+ } else if (isset($details['zipcode'])) {
+ $zip1 = $details['zipcode'];
+ $zip1VarName = 'zipcode';
+ } else if (isset($details['zip_code'])) {
+ $zip1 = $details['zip_code'];
+ $zip1VarName = 'zip_code';
+ }
+
+ $zip2VarName = 'zip_code';
+
+ $dataByZip = array();
+ foreach($data as $row) {
+ if(isset($row[$modelName]['lat']) and isset($row[$modelName]['lon'])) {
+ $dist = $this->calculate_mileage($details['lat'],$row[$modelName]['lat'],$details['lon'],$row[$modelName]['lon']);
+ } else {
+ $zip2 = null;
+ if(isset($row[$modelName]['zip'])) {
+ $zip2 = $row[$modelName]['zip'];
+ $zip2VarName = 'zip';
+ } else if (isset($row[$modelName]['zipcode'])) {
+ $zip2 = $row[$modelName]['zipcode'];
+ $zip2VarName = 'zipcode';
+ } else if (isset($row[$modelName]['zip_code'])) {
+ $zip2 = $row[$modelName]['zip_code'];
+ $zip2VarName = 'zip_code';
+ }
+
+ $dist = $this->get_distance($zip1, $zip2);
+ }
+
+ if ($this->units == _UNIT_KILOMETERS) $dist = $dist * _M2KM_FACTOR;
+ if ($range === 'all' or $dist <= $range) {
+ $return[str_pad($row[$modelName][$zip2VarName], 5, "0", STR_PAD_LEFT)] = round($dist, $this->decimals);
+ $dataByZip[str_pad($row[$modelName][$zip2VarName], 5, "0", STR_PAD_LEFT)] = $row;
+ }
+ }
+ }
+
+ // sort array
+ switch($sort)
+ {
+ case _ZIPS_SORT_BY_DISTANCE_ASC:
+ asort($return);
+ break;
+
+ case _ZIPS_SORT_BY_DISTANCE_DESC:
+ arsort($return);
+ break;
+
+ case _ZIPS_SORT_BY_ZIP_ASC:
+ ksort($return);
+ break;
+
+ case _ZIPS_SORT_BY_ZIP_DESC:
+ krsort($return);
+ break;
+ }
+
+ $this->zipInRangeData = $return;
+
+ if($options['datasource']) {
+ //merge database results back into return (with distance calculated)
+ $newReturn = array();
+ foreach($return as $zip => $distance) {
+ if(isset($dataByZip[$zip])) {
+ $tmp = $dataByZip[$zip];
+ $tmp['distance'] = $distance;
+ $newReturn[] = $tmp;
+
+ }
+ }
+ $return = $newReturn;
+ }
+
+ if (empty($return)) return false;
+ return $return;
+ }
+
+ function get_detailed_zips_in_range($zip, $range, $sort=1, $include_base = true) {
+ // returns an array of the zip codes within $range of $zip with their details
+ //var_dump($zip,$range);
+
+ $details = $this->get_zip_point($zip); // base zip details
+
+ if ($details == false) return false;
+
+ // This portion of the routine calculates the minimum and maximum lat and
+ // long within a given range. This portion of the code was written
+ // by Jeff Bearer (http://www.jeffbearer.com). This significanly decreases
+ // the time it takes to execute a query. My demo took 3.2 seconds in
+ // v1.0.0 and now executes in 0.4 seconds! Greate job Jeff!
+
+ // Find Max - Min Lat / Long for Radius and zero point and query
+ // only zips in that range.
+ $lat_range = $range/69.172;
+ $lon_range = abs($range/(cos($details['lat']) * 69.172));
+ $min_lat = number_format($details['lat'] - $lat_range, "4", ".", "");
+ $max_lat = number_format($details['lat'] + $lat_range, "4", ".", "");
+ $min_lon = number_format($details['lon'] - $lon_range, "4", ".", "");
+ $max_lon = number_format($details['lon'] + $lon_range, "4", ".", "");
+
+ $return = array(); // declared here for scope
+
+ $conditions = array();
+ $conditions['z_primary'] = 'PRIMARY';
+ if(!$include_base) {
+ $conditions['zip_code'] = "<> $zip";
+ } else {
+ $conditions['lat BETWEEN ? AND ?'] = array($min_lat, $max_lat);
+ $conditions['lon BETWEEN ? AND ?'] = array($min_lon, $max_lon);
+ }
+
+ if (!$data = $this->find('all', array('conditions' =>$conditions))) { // sql error
+
+ return false;
+
+ } else {
+ foreach($data as $row) {
+
+ $dist = $this->calculate_mileage($details['lat'],$row['Zipcode']['lat'],$details['lon'],$row['Zipcode']['lon']);
+ //$return['locationdetails'] = $this->find('all',array('conditions'=>array('zip_code'=>$zip)));
+ if ($this->units == _UNIT_KILOMETERS) $dist = $dist * _M2KM_FACTOR;
+ if ($dist <= $range) {
+ $row['Zipcode']['distance'] = round($dist, $this->decimals);
+ $return[] = $row;
+ }
+ }
+ }
+
+ // sort array
+ function dist_sort($a,$b) {
+ //var_dump($a['Zipcode']['distance']);
+ if($a['Zipcode']['distance'] > $b['Zipcode']['distance'])
+ return 1;//here,if you return -1,return 1 below,the result will be descending
+ if($a['Zipcode']['distance'] < $b['Zipcode']['distance'])
+ return -1;
+ if($a['Zipcode']['distance'] == $b['Zipcode']['distance'])
+ return 0;
+ }
+ switch ($sort) {
+ case '_ZIPS_SORT_BY_DISTANCE_ASC':
+ //asort($return);
+ //var_dump('test');
+ uasort($return, 'dist_sort');
+
+ break;
+
+ case '_ZIPS_SORT_BY_DISTANCE_DESC':
+ arsort($return);
+ break;
+ }
+
+ $this->zipInRangeData = $return;
+ //var_dump($return);
+ if (empty($return)) return false;
+ return $return;
+ }
+
+
+ /**
+ * Returns a flat array (e.g. 04072,03801, etc.) for SQL IN statements
+ *
+ * @return array
+ */
+ function getZipsInRangeFlat() {
+ return array_keys($this->zipInRangeData);
+ }
+
+
+ function zipRangeOrderCase($zips = array(), $column_name = 'zip') {
+
+ /*Order by (CASE City
+ WHEN 'Paris' THEN 1
+ WHEN 'Chicago' THEN 2
+ WHEN 'Boston' THEN 3
+ WHEN 'New York' THEN 4
+ WHEN 'Berkeley' THEN 5
+ WHEN 'Dallas' THEN 6
+ ELSE 100 END) ASC */
+ $order_by = '';
+ $zip_count = count($zips);
+ for($x=0; $x < $zip_count; $x++) {
+ $order_by .= " WHEN {$zips[$x]} THEN ". ($x + 1);
+ }
+
+ if(!empty($order_by)) {
+ $order_by = "(CASE $column_name". $order_by ." ELSE 100 END) ASC";
+ return $order_by;
+ } else {
+ return false;
+ }
+
+ }
+
+ /**
+ *
+ * Takes a string [from a form]
+ * @param $search string
+ * @param $options array
+ * return false if no zip found; or text if a single zip code or an array if multiple zip codes
+ */
+ function findZipFromText($search, $options = array()) {
+ App::import('Sanitize');
+
+ $default_options =
+ array(
+ 'distance' => 0,
+ 'stateList' => array(), //supply list of states, array('SN' => 'State Name');, to use instead of full geography helper list... will increase performance if you supply a small list
+ 'defaultState' => Configure::read('avorders.avengerDefaultState'), //array('ME'), //an array of state abbreviations to use by default when a state isn't found
+ 'firstMatch' => true, //will return first zip code that matches if distance is 0 (otherwise, returns all zipcodes)
+ 'primary' => true, // set to false to return all zip codes, not just primary zip codes
+ );
+ $options = am($default_options, $options);
+
+ if(is_numeric($search)) {
+ //assume it's a zip code
+ $zip = trim($search);
+ $zip = substr($zip, 0, 5); //make sure it's only 5 numbers
+
+ } else {
+ // searching by a string
+ // 1. clean/sanitize data
+ // 2a. see if preg_match finds a zip code in user-entered text, if so use it
+ // 2b. otherwise, explode on spaces, b/c each word needs can be matched, then find unique zip codes
+ // 3. create conditions, add in distance condition and zips in range if specified
+ // 4. append to join conditions
+
+ $location_array = array();
+ $location = Sanitize::paranoid($search, array(' ', ',', '.'));
+ $location = trim($location);
+
+ if(preg_match("/([0-9]{5})(-[0-9]{4})?/i", $location, $match)) {
+ //zip code entered with text, use it
+ $zip = $match[0];
+ } else {
+ App::import('Helper', 'Geography');
+ $geography = new GeographyHelper();
+
+ $terms = array();
+ $stateFound = false;
+
+ // zip code not in text, so try to find zipcode using city, state if known
+ // check to see if there is a comma, if so explode on that: portsmouth, new hampshire
+ if(strpos($location, ',') !== false) {
+ $location_array = explode(',', $location);
+ } else {
+ //look for state names (not abbreviations) contained within search term
+ $stateAbbr = $geography->isAState($location, array('search' => true, 'list' => $options['stateList'])); // looking to see if a state is buried in this query
+ if($stateAbbr) {
+ // state found, set to state_prefix and remove from search terms (for down-the-line processing)
+ $stateFound = true;
+ $terms['Zipcode.state_prefix'] = $stateAbbr['state'];
+ $location = str_ireplace($stateAbbr['term'], '', $location);
+ $location = trim($location);
+ }
+
+ // explode remaining search terms on spaces
+ $location_array = explode(' ', $location);
+ }
+
+ $cityTerms = array();
+ foreach($location_array as $term) {
+
+ if(!$stateFound) {
+ $stateAbbr = $geography->isAState($term);
+ if($stateAbbr) {
+ //we know this is a state, and the 2 letter abbreviation
+ $terms['Zipcode.state_prefix'] = $stateAbbr;
+ $stateFound = true;
+ } else {
+ //not a state, must be a city, eliminated everything else
+ $cityTerm = $term .'%';
+ if(!empty($cityTerms)) {
+ $cityTerm = '%'. $cityTerm; // if it's not the first word, need to allow double-sided wild card
+ }
+ $cityTerms[] = $cityTerm;
+ }
+ } else {
+ //state already found, these terms must be a city
+ $cityTerm = $term .'%';
+ if(!empty($cityTerms)) {
+ $cityTerm = '%'. $cityTerm; // if it's not the first word, need to allow double-sided wild card
+ }
+ $cityTerms[] = $cityTerm;
+ }
+ }
+
+ if(!empty($cityTerms)) {
+ if(count($cityTerms) == 1) {
+ $terms['Zipcode.city LIKE'] = bootArrayFirstValue($cityTerms);
+ } else {
+ $terms['AND'] = array();
+ foreach($cityTerms as $term) {
+ $terms['AND'][] = array('Zipcode.city LIKE' => $term);
+ }
+ }
+ }
+
+ //default state to ME, b/c this is originally for MyMaineTherapist
+ if(!isset($terms['Zipcode.state_prefix'])) {
+ $terms['Zipcode.state_prefix'] = $options['defaultState'];
+ }
+
+ // see if we are checking for primary-only zip codes
+ if($options['primary']) {
+ $terms['Zipcode.z_primary'] = 'PRIMARY';
+ }
+
+ $zips = $this->find('all', array('conditions' => $terms, 'fields' => 'Zipcode.city, Zipcode.state_prefix, Zipcode.zip_code, Zipcode.z_primary', 'group' => 'zip_code', 'recursive' => -1));
+ if($zips) {
+ if($options['firstMatch'] or !empty($options['distance'])) {
+ // only want the first zip code (if distance is specified, firstMatch is implied)
+ $zip = bootArrayFirstValue($zips);
+ $zip = isset($zip['Zipcode']['zip_code']) ? $zip['Zipcode']['zip_code'] : false;
+ } else {
+ // for multiple zip codes, you should show a list of available zip codes and allow user to pick zip code in calling function
+ $zip = Set::extract('/Zipcode/zip_code', $zips);
+ }
+ }
+ }
+ }
+
+ // ADD IN DISTANCE-BASED SEARCHING
+ if(!empty($options['distance']) and isset($zip) and $zip) {
+
+ if($options['distance'] == 'all') {
+ $distance = 'all';
+ } else {
+ $distance = (int) $options['distance'];
+ $distance = ($distance > 100) ? 100 : $distance; //cap it at 100, that's a lot of zipcodes
+ }
+
+ $zipsInRange = $this->get_zips_in_range($zip, $distance);
+ if($zipsInRange) {
+ $zip = array_keys($zipsInRange);
+ }
+ }
+
+
+
+ if(!isset($zip) or !$zip) {
+ // basically, turning zipcode off, so no results will be found...
+ return false;
+ }
+
+ return $zip;
+
+ }
+
+
+ /**
+ * Performs a Web Service call to FreeGeoIP.net to get IP Whois Information
+ * @param string $ipaddress
+ * @return array $location zip, lat, long, etc. of ip address
+ */
+ function fetchFreeGeoIpLocation($ipaddress) {
+ //http://freegeoip.net/{format}/{ip_or_hostname}
+ // create curl resource
+ $location = array();
+
+
+ $ipurl = 'http://freegeoip.net/json/'.$ipaddress;
+
+ $ch = curl_init();
+ // set url
+ curl_setopt( $ch, CURLOPT_TIMEOUT_MS, 1500 );
+ curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT_MS, 1500 );
+
+ curl_setopt($ch, CURLOPT_URL, $ipurl);
+ //return the transfer as a string
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+ // $output contains the output string
+ $output = curl_exec($ch);
+ // close curl resource to free up system resources
+ curl_close($ch);
+ if(is_string($output) and !empty($output)){
+ $location = json_decode($output, true);
+
+ if(!isset($location['zipcode']) or empty($location['zipcode'])){
+ //need to find zip code based on geocoded lat/long
+ if(isset($location['latitude']) and !empty($location['latitude']) and isset($location['longitude']) and !empty($location['longitude'])) {
+ $zipcode = $this->get_zips_in_range($location, 10); //no zip code supplied, grab the one that is closest within 10 miles
+ if(is_array($zipcode) and !empty($zipcode)){
+ $location['zipcode'] = bootArrayFirstValue(array_keys($zipcode));
+ }else{
+ $location['zipcode'] = '10001';
+ }
+ }
+ }
+
+ if(is_array($location) and !empty($location)) {
+ // change to match format from ZipCode table column names
+ $location['zip_code'] = $location['zipcode'];
+ unset($location['zipcode']);
+
+ $location['lat'] = $location['latitude'];
+ unset($location['latitude']);
+
+ $location['lon'] = $location['longitude'];
+ unset($location['longitude']);
+
+ $location['state_prefix'] = $location['region_code'];
+ unset($location['region_code']);
+
+ $location['country'] = $location['country_code'];
+ unset($location['country_code']);
+
+ $location['locationtext'] = $location['city'].', '.$location['state_prefix'];
+ }
+
+ } else {
+ $location = false;
+ }
+
+
+ return $location;
+
+ }
+
+ function getClosestLocation($location, $options = array()) {
+ $default_options = array('range' => 50);
+ $options = Set::merge($default_options, $options);
+
+ if($this->hasField('active')) {
+ $params['conditions'] = array('AvordersStore.active'=>1);
+ }
+ return bootArrayFirstValue($this->get_zips_in_range($location, $options['range'], 1, true, null));
+ }
+
+}
\ No newline at end of file
diff --git a/production/example_apps/zippy_maps/scripts/launch_local_cake.sh b/production/example_apps/zippy_maps/scripts/launch_local_cake.sh
new file mode 100644
index 00000000..09e2cb51
--- /dev/null
+++ b/production/example_apps/zippy_maps/scripts/launch_local_cake.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+THIS_FOLDER="$( \cd "$(\dirname "$0")" && /bin/pwd )"
+pushd $THIS_FOLDER/..
+
+# does this help?
+export DEBUG=true
+
+./bin/cake server -p 8765
+
+popd
+
+
diff --git a/production/example_apps/zippy_maps/scripts/launch_serene_cake.sh b/production/example_apps/zippy_maps/scripts/launch_serene_cake.sh
new file mode 100644
index 00000000..c5c79a84
--- /dev/null
+++ b/production/example_apps/zippy_maps/scripts/launch_serene_cake.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+THIS_FOLDER="$( \cd "$(\dirname "$0")" && /bin/pwd )"
+pushd $THIS_FOLDER/..
+
+# does this help?
+export DEBUG=true
+
+./bin/cake server -H 192.241.191.154 -p 12738
+
+popd
+
+
diff --git a/production/example_apps/zippy_maps/scripts/prepare_project.sh b/production/example_apps/zippy_maps/scripts/prepare_project.sh
new file mode 100644
index 00000000..dfaf24ad
--- /dev/null
+++ b/production/example_apps/zippy_maps/scripts/prepare_project.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+#hmmm: test this and make sure it's still right.
+#hmmm: also test that it's inclusive of all the necessary steps for success.
+
+#hmmm: aha, this is definitely missing the necessary link creations still.
+
+
+# bails if any step fails.
+function check_result() {
+ if [ $? -ne 0 ]; then
+ echo -e "failed on: $*"
+ error_sound
+ exit 1
+ fi
+}
+
+THIS_FOLDER="$( \cd "$(\dirname "$0")" && /bin/pwd )"
+pushd $THIS_FOLDER/..
+
+echo running composer update process...
+composer update
+check_result "updating project with composer"
+
+echo -e "\n\nHave the two config files app.php and config_google.php been configured yet AND has the database for the app been added to mysql? (y/N)"
+read line
+
+if [ $line != 'y' -a $line != 'Y' -a $line != 'yes' -a $line != 'YES' ]; then
+ echo "Please configure the two config files using their default versions as templates (see the config directory for app.default.php and config_google.default.php)"
+ exit 1
+fi
+
+echo running migration code to build the database...
+./bin/cake migrations migrate
+check_result "running the database migrations"
+
+echo making asset symlinks
+./bin/cake plugin assets symlink
+check_result "symlinking web assets"
+
+
+
diff --git a/production/example_apps/zippy_maps/src/Application.php b/production/example_apps/zippy_maps/src/Application.php
new file mode 100644
index 00000000..9c5999b8
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Application.php
@@ -0,0 +1,52 @@
+add(ErrorHandlerMiddleware::class)
+
+ // Handle plugin/theme assets like CakePHP normally does.
+ ->add(AssetMiddleware::class)
+
+ // Apply routing
+ ->add(RoutingMiddleware::class);
+
+ return $middleware;
+ }
+}
diff --git a/production/example_apps/zippy_maps/src/Console/Installer.php b/production/example_apps/zippy_maps/src/Console/Installer.php
new file mode 100644
index 00000000..0756096c
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Console/Installer.php
@@ -0,0 +1,195 @@
+getIO();
+
+ $rootDir = dirname(dirname(__DIR__));
+
+ static::createAppConfig($rootDir, $io);
+ static::createWritableDirectories($rootDir, $io);
+
+ // ask if the permissions should be changed
+ if ($io->isInteractive()) {
+ $validator = function ($arg) {
+ if (in_array($arg, ['Y', 'y', 'N', 'n'])) {
+ return $arg;
+ }
+ throw new Exception('This is not a valid answer. Please choose Y or n.');
+ };
+ $setFolderPermissions = $io->askAndValidate(
+ 'Set Folder Permissions ? (Default to Y) [Y,n ]? ',
+ $validator,
+ 10,
+ 'Y'
+ );
+
+ if (in_array($setFolderPermissions, ['Y', 'y'])) {
+ static::setFolderPermissions($rootDir, $io);
+ }
+ } else {
+ static::setFolderPermissions($rootDir, $io);
+ }
+
+ static::setSecuritySalt($rootDir, $io);
+
+ if (class_exists('\Cake\Codeception\Console\Installer')) {
+ \Cake\Codeception\Console\Installer::customizeCodeceptionBinary($event);
+ }
+ }
+
+ /**
+ * Create the config/app.php file if it does not exist.
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @return void
+ */
+ public static function createAppConfig($dir, $io)
+ {
+ $appConfig = $dir . '/config/app.php';
+ $defaultConfig = $dir . '/config/app.default.php';
+ if (!file_exists($appConfig)) {
+ copy($defaultConfig, $appConfig);
+ $io->write('Created `config/app.php` file');
+ }
+ }
+
+ /**
+ * Create the `logs` and `tmp` directories.
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @return void
+ */
+ public static function createWritableDirectories($dir, $io)
+ {
+ $paths = [
+ 'logs',
+ 'tmp',
+ 'tmp/cache',
+ 'tmp/cache/models',
+ 'tmp/cache/persistent',
+ 'tmp/cache/views',
+ 'tmp/sessions',
+ 'tmp/tests'
+ ];
+
+ foreach ($paths as $path) {
+ $path = $dir . '/' . $path;
+ if (!file_exists($path)) {
+ mkdir($path);
+ $io->write('Created `' . $path . '` directory');
+ }
+ }
+ }
+
+ /**
+ * Set globally writable permissions on the "tmp" and "logs" directory.
+ *
+ * This is not the most secure default, but it gets people up and running quickly.
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @return void
+ */
+ public static function setFolderPermissions($dir, $io)
+ {
+ // Change the permissions on a path and output the results.
+ $changePerms = function ($path, $perms, $io) {
+ // Get permission bits from stat(2) result.
+ $currentPerms = fileperms($path) & 0777;
+ if (($currentPerms & $perms) == $perms) {
+ return;
+ }
+
+ $res = chmod($path, $currentPerms | $perms);
+ if ($res) {
+ $io->write('Permissions set on ' . $path);
+ } else {
+ $io->write('Failed to set permissions on ' . $path);
+ }
+ };
+
+ $walker = function ($dir, $perms, $io) use (&$walker, $changePerms) {
+ $files = array_diff(scandir($dir), ['.', '..']);
+ foreach ($files as $file) {
+ $path = $dir . '/' . $file;
+
+ if (!is_dir($path)) {
+ continue;
+ }
+
+ $changePerms($path, $perms, $io);
+ $walker($path, $perms, $io);
+ }
+ };
+
+ $worldWritable = bindec('0000000111');
+ $walker($dir . '/tmp', $worldWritable, $io);
+ $changePerms($dir . '/tmp', $worldWritable, $io);
+ $changePerms($dir . '/logs', $worldWritable, $io);
+ }
+
+ /**
+ * Set the security.salt value in the application's config file.
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @return void
+ */
+ public static function setSecuritySalt($dir, $io)
+ {
+ $config = $dir . '/config/app.php';
+ $content = file_get_contents($config);
+
+ $newKey = hash('sha256', Security::randomBytes(64));
+ $content = str_replace('__SALT__', $newKey, $content, $count);
+
+ if ($count == 0) {
+ $io->write('No Security.salt placeholder to replace.');
+
+ return;
+ }
+
+ $result = file_put_contents($config, $content);
+ if ($result) {
+ $io->write('Updated Security.salt value in config/app.php');
+
+ return;
+ }
+ $io->write('Unable to update Security.salt value.');
+ }
+}
diff --git a/production/example_apps/zippy_maps/src/Controller/AppController.php b/production/example_apps/zippy_maps/src/Controller/AppController.php
new file mode 100644
index 00000000..7483724e
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Controller/AppController.php
@@ -0,0 +1,71 @@
+loadComponent('Security');`
+ *
+ * @return void
+ */
+ public function initialize()
+ {
+ parent::initialize();
+
+ $this->loadComponent('RequestHandler');
+ $this->loadComponent('Flash');
+
+ /*
+ * Enable the following components for recommended CakePHP security settings.
+ * see http://book.cakephp.org/3.0/en/controllers/components/security.html
+ */
+ //$this->loadComponent('Security');
+ //$this->loadComponent('Csrf');
+ }
+
+ /**
+ * Before render callback.
+ *
+ * @param \Cake\Event\Event $event The beforeRender event.
+ * @return \Cake\Network\Response|null|void
+ */
+ public function beforeRender(Event $event)
+ {
+ if (!array_key_exists('_serialize', $this->viewVars) &&
+ in_array($this->response->type(), ['application/json', 'application/xml'])
+ ) {
+ $this->set('_serialize', true);
+ }
+ }
+
+
+
+}
diff --git a/production/example_apps/zippy_maps/src/Controller/CategoriesController.php b/production/example_apps/zippy_maps/src/Controller/CategoriesController.php
new file mode 100644
index 00000000..eeacbad8
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Controller/CategoriesController.php
@@ -0,0 +1,423 @@
+loadComponent('RequestHandler');
+
+ // configure the request handler to deal with json encoding.
+ $this->RequestHandler->config('inputTypeMap.json', ['json_decode', true]);
+
+ $this->api_key = SimpleMapsComponent::getGoogleAPIKey();
+
+ // allow simple access to location db.
+ $this->loadModel ( 'Locations' );
+
+ }
+
+
+
+ /**
+ * Index method
+ *
+ * @return \Cake\Network\Response|null
+ */
+ public function index()
+ {
+ $categories = $this->paginate($this->Categories);
+
+ $this->set(compact('categories'));
+ $this->set('_serialize', ['categories']);
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id Category id.
+ * @return \Cake\Network\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $category = $this->Categories->get($id, [
+ 'contain' => ['Locations']
+ ]);
+
+ $this->set('category', $category);
+ $this->set('_serialize', ['category']);
+
+ // query all the locations belonging to this category but only retrieve part of the info.
+ $locationBits = $this->Categories->CategoriesLocations->find('list', [
+ 'conditions' => [ 'category_id' => $id ],
+ 'contain' => ['Locations'],
+ 'valueField' => function ($row) {
+ return $row->location->get('lat')
+ . ',' . $row->location->get('lng')
+ . ' ' . $row->location->get('location');
+ }
+ ]);
+ $this->set('locationBits', $locationBits);
+ }
+
+ /**
+ * queries the locations to display on a map given an "id" to lookup in categories table.
+ */
+ public function map($id = null)
+ {
+ $category = $this->Categories->get($id, [
+ 'contain' => ['Locations']
+ ]);
+
+ $locationsFound = $this->Categories->getLocationsInCategory($id);
+ $this->set('locationsInCategory', $locationsFound);
+
+ // grab the flags in requests.
+ $parms = $this->request->getQueryParams();
+
+ // we will cluster by default, but they can also pass the clustering flag with 0 or 1.
+ $clustering = (array_key_exists('clustering', $parms) && ($parms['clustering'] == '1'))
+ || !array_key_exists('clustering', $parms);
+ //Log::Debug('clustering is: ' . var_export($clustering, true));
+
+ // set up the selected items in our config chooser.
+ $selectedList = [];
+ if ($clustering) {
+ array_push($selectedList, 'clustering');
+ }
+ $this->set('selectedList', $selectedList);
+
+ // pass the pre-loading function in for the map element.
+ $this->set('dbProcessor', $this);
+ $this->set('preloader', '$this->MapDisplay->addMarkers($dbProcessor, $locationsInCategory, $category );');
+
+ if ($this->request->is(['post', 'put'])) {
+ //, 'patch'])) {
+ $postData = $this->request->getData('view_options')['_ids'];
+
+ $new_clustering = is_array($postData) && in_array('clustering', $postData);
+
+ if ($clustering != $new_clustering) {
+ $this->redirect(['action' => 'map',
+ '0' => $id,
+ '?' => [
+ 'clustering' => $new_clustering,
+ ]
+ ]);
+ }
+ }
+
+ $this->set('category', $category);
+
+// $this->set('_serialize', ['category']);
+ }
+
+ /**
+ * processes a location row by extracting the important information into an array.
+ * separates the db structure from the pieces needed for google maps.
+ */
+ public function processRow(& $location_row)
+ {
+ return [
+ 'lat' => $location_row ['location'] ['lat'],
+ 'lng' => $location_row ['location'] ['lng'],
+ 'title' => $location_row ['location'] ['name'],
+ // kludge below adds extra space on content, since someone is not left justifying these.
+ 'content' => h ( $location_row ['location'] ['location'] ) . ' ',
+ ];
+ }
+
+ public function extractCategoryImage(& $category)
+ {
+ return $category->image;
+ }
+
+
+ /**
+ * attempts to jump to the center of the category, given a particular interpretation of the
+ * category. if possible we will decide that the category is a state name, and then attempt
+ * to jump to the center of that state.
+ * will also show markers in the category.
+ */
+ public function center($id = null)
+ {
+ $category = $this->Categories->get($id, [
+ 'contain' => ['Locations']
+ ]);
+
+ // grab the flags in requests.
+ $parms = $this->request->getQueryParams();
+
+ // we will cluster by default, but they can also pass the clustering flag with 0 or 1.
+ $clustering = (array_key_exists('clustering', $parms) && ($parms['clustering'] == '1'))
+ || !array_key_exists('clustering', $parms);
+ //Log::Debug('clustering is: ' . var_export($clustering, true));
+
+ // set up the selected items in our config chooser.
+ $selectedList = [];
+ if ($clustering) {
+ array_push($selectedList, 'clustering');
+ }
+ $this->set('selectedList', $selectedList);
+
+ $state = null;
+ // interpret the category name as a state if possible.
+ if (substr($category->name, 0, 3) == 'US-') {
+ // bingo, we have a US prefix on the string, so decide what state they mean.
+ $state = substr($category->name, 3, 2);
+
+ }
+ // perform the lookup to get the readable name. otherwise a state like indiana (IN) will
+ // not get geocoded properly. probably others as well.
+ $state = SimpleMapsComponent::lookupStateFromAbbreviation($state);
+
+ $this->set('state', $state);
+
+ Log::debug('state was found as: ' . $state);
+
+ if ($state !== null) {
+ $centeredPoint = SimpleMapsComponent::geocode($state . " USA", [
+ 'key' => $this->api_key
+ ]);
+ $mapCenter = [ 'lat' => $centeredPoint[0], 'lng' => $centeredPoint[1] ] ;
+ $this->set('mapCenter', $mapCenter);
+ Log::Debug('computed a map center of: ' . var_export($mapCenter, true));
+ }
+
+
+ // thoughts on algorithm: is the center of the state according to google what we want to rely on?
+ // we could at least start there, record the lat/longs and then edit them later as we decide.
+
+ $radius = null;
+ $lat = null;
+ $long = null;
+ if ($mapCenter) {
+ $radius = 40; // miles from center to show markers.
+ $lat = $mapCenter['lat'];
+ $long = $mapCenter['lng'];
+ }
+
+ Log::Debug('given lat=' . $lat . ' long='. $long . ' radius=' . $radius);
+
+ Log::Debug('loading locations in category within radius');
+
+ // compute the lat/long bounding box for our search.
+ $bounds = SimpleMapsComponent::calculateLatLongBoundingBox ( $lat, $long, $radius );
+
+ if (! $bounds) {
+ Log::Debug("failed to calculate the bounding box!");
+ } else {
+ Log::Debug("bounding box: " . var_export($bounds, true));
+ }
+
+ // query all the locations belonging to this category within the box.
+ $locationsInCategory = $this->Categories->getLocationsInCategoryInBox($id,
+ $bounds [0], $bounds [1], $bounds [2], $bounds [3] );
+
+ $this->set('locationsInCategory', $locationsInCategory);
+
+ $this->set('dbProcessor', $this);
+ $this->set('preloader', '$this->MapDisplay->addMarkers($dbProcessor, $locationsInCategory, $category );');
+
+ if ($this->request->is(['post', 'put'])) {
+ //, 'patch'])) {
+ $postData = $this->request->getData('view_options')['_ids'];
+
+ $new_clustering = is_array($postData) && in_array('clustering', $postData);
+
+ if ($clustering != $new_clustering) {
+ $this->redirect(['action' => 'map',
+ '0' => $id,
+ '?' => [
+ 'clustering' => $new_clustering,
+ ]
+ ]);
+ }
+ }
+
+ $this->set('category', $category);
+// $this->set('_serialize', ['category','selectedList']);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Network\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $category = $this->Categories->newEntity();
+ if ($this->request->is('post')) {
+ $category = $this->Categories->patchEntity($category, $this->request->getData());
+ if ($this->Categories->save($category)) {
+ $this->Flash->success(__('The category has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The category could not be saved. Please, try again.'));
+ }
+ $this->set(compact('category'));
+ $this->set('_serialize', ['category']);
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id Category id.
+ * @return \Cake\Network\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Network\Exception\NotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $category = $this->Categories->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $category = $this->Categories->patchEntity($category, $this->request->getData());
+ if ($this->Categories->save($category)) {
+ $this->Flash->success(__('The category has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The category could not be saved. Please, try again.'));
+ }
+ $this->set(compact('category'));
+ $this->set('_serialize', ['category']);
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id Category id.
+ * @return \Cake\Network\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $category = $this->Categories->get($id);
+ if ($this->Categories->delete($category)) {
+ $this->Flash->success(__('The category has been deleted.'));
+ } else {
+ $this->Flash->error(__('The category could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+
+ /**
+ * provides ajax friendly responses. expects to be passed 'category' in post data.
+ * requires bounding box for lookup be passed as 'sw_lat', 'sw_lng', 'ne_lat', 'ne_lng'.
+ */
+ public function lookupajax()
+ {
+ $reqData = $this->request->getData();
+
+ Log::Debug('got to lookup with data: ' . var_export($reqData, true));
+
+ // check that this is a post method, since we don't support anything else.
+ if (! $this->request->is(['post'])) {
+ die('this is a post method');
+ }
+
+ if (array_key_exists('action', $reqData)) {
+ $action = $reqData['action'];
+
+ if (strcasecmp($action, 'lookupBox') == 0) {
+ $this->findLocationsInCategoryWithinBounds($reqData);
+ } else if (strcasecmp($action, 'getInfo') == 0) {
+ $this->getInfoOnLocation($reqData);
+ } else {
+ die('lookupajax call was given unknown action: ' . $action);
+ }
+
+ } else {
+ die('lookupajax call has no action specified');
+ }
+ }
+
+ public function findLocationsInCategoryWithinBounds($reqData)
+ {
+ if (array_key_exists('category', $reqData)) {
+ $id = $reqData['category'];
+ } else {
+ // throw an exception here?
+ $message = 'failed to find category id in request data';
+ Log::Debug($message);
+ die($message);
+ }
+
+ $category = $this->Categories->get($id, [
+ 'contain' => ['Locations']
+ ]);
+ $this->set('category', $category);
+
+ if (array_key_exists('sw_lat', $reqData)) {
+ $sw_lat = $reqData['sw_lat'];
+ }
+ if (array_key_exists('sw_lng', $reqData)) {
+ $sw_lng = $reqData['sw_lng'];
+ }
+ if (array_key_exists('ne_lat', $reqData)) {
+ $ne_lat = $reqData['ne_lat'];
+ }
+ if (array_key_exists('ne_lng', $reqData)) {
+ $ne_lng = $reqData['ne_lng'];
+ }
+
+ //temp! fails over to using whole range.
+ if ($sw_lat === null) { $sw_lat = -90; }
+ if ($sw_lng === null) { $sw_lng = -180; }
+ if ($ne_lat === null) { $ne_lat = 90; }
+ if ($ne_lng === null) { $ne_lng = 180; }
+
+ $start = null;
+ if (array_key_exists('start', $reqData)) {
+ $start = $reqData['start'];
+ }
+ $end = null;
+ if (array_key_exists('end', $reqData)) {
+ $end = $reqData['end'];
+ }
+
+ // lookup the locations inside that box and store for view.
+ $locationsToSerialize = $this->Categories->getChewedLocationsInCategoryInBox($id, $sw_lat, $sw_lng, $ne_lat, $ne_lng, $start, $end);
+ //Log::debug('before encoding, php array looks like: ' . var_export($locationsToSerialize, true));
+ Log::Debug("returning json now...");
+ $encoded = json_encode($locationsToSerialize);
+ // Log::debug('encoded json is: ' . var_export($encoded, true));
+ die($encoded);
+ }
+
+ public function getInfoOnLocation($reqData)
+ {
+ if (array_key_exists('id', $reqData)) {
+ $id = $reqData['id'];
+ } else {
+ // throw an exception here?
+ $message = 'failed to find location id in request data';
+ Log::Debug($message);
+ die($message);
+ }
+
+ $location = $this->Locations->get($id, [
+ ]);
+ return die(json_encode($location));
+ }
+}
diff --git a/production/example_apps/zippy_maps/src/Controller/Component/empty b/production/example_apps/zippy_maps/src/Controller/Component/empty
new file mode 100644
index 00000000..e69de29b
diff --git a/production/example_apps/zippy_maps/src/Controller/ErrorController.php b/production/example_apps/zippy_maps/src/Controller/ErrorController.php
new file mode 100644
index 00000000..cf0ebd5b
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Controller/ErrorController.php
@@ -0,0 +1,68 @@
+loadComponent('RequestHandler');
+ }
+
+ /**
+ * beforeFilter callback.
+ *
+ * @param \Cake\Event\Event $event Event.
+ * @return \Cake\Network\Response|null|void
+ */
+ public function beforeFilter(Event $event)
+ {
+ }
+
+ /**
+ * beforeRender callback.
+ *
+ * @param \Cake\Event\Event $event Event.
+ * @return \Cake\Network\Response|null|void
+ */
+ public function beforeRender(Event $event)
+ {
+ parent::beforeRender($event);
+
+ $this->viewBuilder()->setTemplatePath('Error');
+ }
+
+ /**
+ * afterFilter callback.
+ *
+ * @param \Cake\Event\Event $event Event.
+ * @return \Cake\Network\Response|null|void
+ */
+ public function afterFilter(Event $event)
+ {
+ }
+}
diff --git a/production/example_apps/zippy_maps/src/Controller/LocationsController.php b/production/example_apps/zippy_maps/src/Controller/LocationsController.php
new file mode 100644
index 00000000..4068be31
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Controller/LocationsController.php
@@ -0,0 +1,530 @@
+loadComponent ( 'Avmaps.SimpleMaps' );
+ $this->loadModel ( 'Categories' );
+
+ $this->api_key = SimpleMapsComponent::getGoogleAPIKey ();
+ }
+
+ /**
+ * Index method
+ *
+ * @return \Cake\Network\Response|null
+ */
+ public function index() {
+ $locations = $this->paginate ( $this->Locations, [
+ 'contain' => 'Categories'
+ ] );
+ $this->set ( compact ( 'locations' ) );
+ $this->set ( '_serialize', [
+ 'locations'
+ ] );
+ }
+
+ /**
+ * sets two variables for the view: 'categoriesList' with *all* the category names that exist and
+ * 'selectedList' with the categories associated with the location 'id'.
+ *
+ * @param int $id
+ */
+ public function loadAssociatedCategories($id) {
+ // find all of the categories available.
+ $this->set ( 'categoriesList', $this->Categories->getAllCategories());
+
+ // turn the chosen categories into a list of category ids for the multi-select.
+ $selectedCategories = $this->Locations->getSelectedCategories($id);
+ $selectedList = array_keys ( $selectedCategories->toArray () );
+ $this->set ( 'selectedList', $selectedList );
+ }
+
+ /**
+ * calculates the set of locations within a certain range from a starting point and returns the
+ * full set.
+ */
+ public function loadLocationsInRange($lat, $long, $radius) {
+ Log::debug ( 'into ranged locations calculator' );
+
+ // compute the lat/long bounding box for our search.
+ $bounds = SimpleMapsComponent::calculateLatLongBoundingBox ( $lat, $long, $radius );
+
+ if (! $bounds) {
+ Log::debug ( "failed to calculate the bounding box!" );
+ } else {
+ Log::debug ( "bounding box: " . var_export ( $bounds, true ) );
+ }
+
+ // use the boundaries to restrict the lookup so we aren't crushed.
+ // order: min_lat, min_long, max_lat, max_long.
+ $locationsInRange = $this->Locations->getLocationsInBox($bounds [0], $bounds [1], $bounds [2], $bounds [3]);
+
+ // heavy!
+ // Log::debug('got a list of locations: ' + var_export($locationsInRange->toArray(), true));
+
+ $this->set ( 'locationsInRange', $locationsInRange );
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id
+ * Location id.
+ * @return \Cake\Network\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null) {
+ $location = $this->Locations->get ( $id, [
+ 'contain' => [
+ 'Categories'
+ ]
+ ] );
+
+ $this->loadAssociatedCategories ( $id );
+
+ $this->set ( 'api_key', $this->api_key );
+
+ $this->set ( 'location', $location );
+ $this->set ( '_serialize', [
+ 'location'
+ ] );
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Network\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add() {
+ $location = $this->Locations->newEntity ();
+
+ $categoriesList = $this->Categories->find ( 'list', [
+ 'keyField' => 'id',
+ 'valueField' => 'name'
+ ] );
+ $this->set ( 'categoriesList', $categoriesList );
+
+ if ($this->request->is ( 'post' )) {
+ $location = $this->Locations->patchEntity ( $location, $this->request->getData () );
+
+ Log::debug ("patching with " . var_export($location, true) );
+
+ $location = $this->SimpleMaps->fillInGeoPosition ( $location, [
+ 'key' => $this->api_key
+ ] );
+
+ if ($location !== false && $this->Locations->save ( $location )) {
+ $this->Flash->success ( __ ( 'The location has been saved.' ) );
+
+ return $this->redirect ( [
+ 'action' => 'index'
+ ] );
+ }
+ $this->Flash->error ( __ ( 'The location could not be saved. Please, try again.' ) );
+ }
+
+ $this->set ( compact ( 'location' ) );
+ $this->set ( '_serialize', [
+ 'location'
+ ] );
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id
+ * Location id.
+ * @return \Cake\Network\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Network\Exception\NotFoundException When record not found.
+ */
+ public function edit($id = null) {
+ $location = $this->Locations->get ( $id, [
+ 'contain' => [
+ 'Categories'
+ ]
+ ] );
+
+ $this->loadAssociatedCategories ( $id );
+
+ if ($this->request->is ( [
+ 'patch',
+ 'post',
+ 'put'
+ ] )) {
+ $location = $this->Locations->patchEntity ( $location, $this->request->getData () );
+
+ $new_location = $this->SimpleMaps->fillInGeoPosition ( $location, [
+ 'key' => $this->api_key
+ ] );
+ if ($new_location === false) {
+ $this->Flash->error ( __ ( 'The location could not be geocoded. Please, try again.' ) );
+ } else {
+ $location = $new_location;
+ if ($this->Locations->save ( $location )) {
+ $this->Flash->success ( __ ( 'The location has been saved.' ) );
+ return $this->redirect ( [
+ 'action' => 'index'
+ ] );
+ }
+ $this->Flash->error ( __ ( 'The location could not be saved. Please, try again.' ) );
+ }
+ }
+ $this->set ( compact ( 'location' ) );
+ $this->set ( '_serialize', [
+ 'location'
+ ] );
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id
+ * Location id.
+ * @return \Cake\Network\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null) {
+ $this->request->allowMethod ( [
+ 'post',
+ 'delete'
+ ] );
+ $location = $this->Locations->get ( $id );
+ if ($this->Locations->delete ( $location )) {
+ $this->Flash->success ( __ ( 'The location has been deleted.' ) );
+ } else {
+ $this->Flash->error ( __ ( 'The location could not be deleted. Please, try again.' ) );
+ }
+
+ return $this->redirect ( [
+ 'action' => 'index'
+ ] );
+ }
+
+
+ // global locations list, loaded once per object creation.
+ private $locationsListGlobal = null;
+
+ /**
+ * generates a random list of locations with a limited number of items.
+ */
+ public function grabLocationsList()
+ {
+ if ($this->locationsListGlobal)
+ return $this->locationsListGlobal;
+
+ /*
+ * load up a list of randomly chosen locations for the selection lists. we will keep this
+ * around if possible, rather than reloading per page view.
+ */
+ $this->locationsListGlobal = $this->Locations->find ( 'list', [
+ 'keyField' => 'id',
+ 'valueField' => 'name'
+ ] )->limit ( 1000 )->order ( 'rand()' )->toArray ();
+
+ // $Log::debug('got a result array: ' . var_export($this->locationsListGlobal, true));
+
+ return $this->locationsListGlobal;
+ }
+
+ /**
+ * adds an item to the location list to ensure a user will not see their previous choice disappear.
+ */
+ public function addLocationToHeldList($id, $entry) {
+ $this->locationsListGlobal [$id1] = $entry;
+ }
+
+
+ /**
+ * calculate the distance between two locations in the db.
+ * will allow picking if one or both
+ * location ids are missing.
+ */
+ public function distance($id1 = null, $id2 = null) {
+ // pretty kludgy approach here; don't yet know how to make the form refresh
+ // without reloading it, but reloading it clears the selections. so we're redirecting
+ // the form to itself but with the id parameters filled in.
+
+ // process the parameters, if any were provided.
+ $this->set ( 'fromId', $id1 );
+ $this->set ( 'toId', $id2 );
+
+ // load the actual location info if they specified the ids already.
+ if ($id1 !== null) {
+ $this->set ( 'fromAddress', $this->Locations->get ( $id1 ) ['location'] );
+ $fromGeoCoord = $this->Locations->get ( $id1 ) ['lat'] . ',' . $this->Locations->get ( $id1 ) ['lng'];
+ // ensure it's in our global list also, or it won't get selected.
+ $this->addLocationToHeldList($id1, $this->Locations->get ( $id1 ) ['name']);
+ } else {
+ $this->set ( 'fromAddress', null );
+ }
+ if ($id2 !== null) {
+ $this->set ( 'toAddress', $this->Locations->get ( $id2 ) ['location'] );
+ $toGeoCoord = $this->Locations->get ( $id2 ) ['lat'] . ',' . $this->Locations->get ( $id2 ) ['lng'];
+ ;
+ // add to our global list for selection.
+ $this->addLocationToHeldList($id2, $this->Locations->get ( $id2 ) ['name']);
+ } else {
+ $this->set ( 'toAddress', null );
+ }
+
+ if ($id1 === null || $id2 === null) {
+ // set default value for distance.
+ $distance = 'unknown';
+ } else {
+ // calculate distance between locations.
+ $distance = $this->SimpleMaps->calculateDrivingDistance ( $fromGeoCoord, $toGeoCoord, [
+ 'key' => $this->api_key
+ ] );
+ // $this->Flash->log ( 'distance calculated is ' . $distance );
+ if ($distance === false) {
+ // failed to calculate this, so we let the user know.
+ $distance = "Unable to calculate a route using Google Maps Distance Matrix";
+ }
+ }
+ // store in distance calculated variable.
+ $this->set ( 'distanceCalculated', $distance );
+
+ // load up the selection lists for from and to addresses.
+ $this->set ( 'locationsFrom', $this->grabLocationsList());
+ $this->set ( 'locationsTo', $this->grabLocationsList() );
+
+ if ($this->request->is ( 'post' )) {
+ $datapack = $this->request->getData ();
+
+ $fromId = $datapack ['from'] ['_ids'];
+ $this->Flash->log ( h ( 'from id is ' . $fromId ) );
+ $toId = $datapack ['to'] ['_ids'];
+ $this->Flash->log ( h ( 'to id is ' . $toId ) );
+
+ $fromGeoCoord = $this->Locations->get ( $fromId ) ['lat'] . ',' . $this->Locations->get ( $fromId ) ['lng'];
+
+ $this->Flash->log ( 'from coord is ' . $fromGeoCoord );
+ $toGeoCoord = $this->Locations->get ( $toId ) ['lat'] . ',' . $this->Locations->get ( $toId ) ['lng'];
+ ;
+ $this->Flash->log ( 'to coord is ' . $toGeoCoord );
+
+ // how to make the form show the same data but with updated distance?
+ // currently kludged...
+ return $this->redirect ( [
+ 'action' => 'distance',
+ $fromId,
+ $toId
+ ] );
+ }
+ }
+
+ /**
+ * finds all the locations within a given radius (in miles) from the location with 'id'.
+ */
+ public function radius($id = null, $radius = 20) {
+ Log::debug ( 'into the radius method in controller...' );
+
+ $this->set ( 'id', $id );
+ if ($id != null) {
+ $this->set ( 'fromAddress', $this->Locations->get ( $id ) ['location'] );
+ $fromLat = $this->Locations->get ( $id ) ['lat'];
+ $this->set ( 'fromLat', $fromLat );
+ $fromLong = $this->Locations->get ( $id ) ['lng'];
+ $this->set ( 'fromLong', $fromLong );
+ }
+
+ if ($this->request->is ( 'post' )) {
+
+ $datapack = $this->request->getData ();
+
+ // look for approximate array index.
+ Log::debug ( 'got datapack: ' . var_export ( $datapack, true ) );
+ foreach ( $datapack as $key => $value ) {
+ if ("radius" == substr ( $key, 0, 6 )) {
+ $radius = $value;
+ }
+ }
+ }
+
+ $this->set ( 'radius', $radius );
+
+ $this->set('dbProcessor', $this);
+ $this->set('preloader', '$this->MapDisplay->addMarkers($dbProcessor, $locationsInRange, null, $radius, $fromLat . \',\'. $fromLong);');
+
+ $this->loadLocationsInRange ( $fromLat, $fromLong, $radius );
+ }
+
+//hmmm: the below should be listed in an interface.
+ /**
+ * processes a location row by extracting the important information into an array.
+ * separates the db structure from the pieces needed for google maps.
+ */
+ public function processRow(& $location_row)
+ {
+ return [
+ 'lat' => $location_row ['lat'],
+ 'lng' => $location_row ['lng'],
+ 'title' => $location_row ['name'],
+ // kludge below adds extra space on content, since someone is not left justifying these.
+ 'content' => h ( $location_row ['location'] ) . ' ',
+ ];
+ }
+
+ public function extractCategoryImage(& $category)
+ {
+ return $category->image;
+ }
+
+
+ /**
+ * jumps to a particular location as the center of the map and shows locations nearby.
+ */
+ public function jump($id) {
+ Log::debug ( 'into the jump method in locations controller...' );
+
+ $this->set ( 'id', $id );
+ if ($id != null) {
+ $fromLat = $this->Locations->get ( $id ) ['lat'];
+ $this->set ( 'fromLat', $fromLat );
+ $fromLong = $this->Locations->get ( $id ) ['lng'];
+ $this->set ( 'fromLong', $fromLong );
+ }
+
+ $locationsInRange = $this->Locations->find ( 'all', [
+ 'conditions' => [
+ 'id' => $id
+ ]
+ ] );
+
+ // we were handed a list of locations that match our query, so we can now add them as markers.
+ $this->set('dbProcessor', $this);
+ $this->set('preloader', '$this->MapDisplay->addMarkers($dbProcessor, $locationsInRange, null, 1000, $fromLat . \',\'. $fromLong);');
+
+
+ // heavy!
+ // Log::debug('got a list of locations: ' + var_export($locationsInRange->toArray(), true));
+
+ $this->set ( 'locationsInRange', $locationsInRange );
+ }
+
+ /**
+ * provides restful api for looking up locations within two lat/long boundaries.
+ */
+ public function lookupajax() {
+ Log::debug ( 'into lookupajax method in locations controller...' );
+
+ $reqData = $this->request->getData ();
+
+ Log::Debug ( 'got to locations lookup with data: ' . var_export ( $reqData, true ) );
+
+ // check that this is a post method, since we don't support anything else.
+ if (! $this->request->is ( [
+ 'post'
+ ] )) {
+ die ( 'this is a post method' );
+ }
+
+
+ if (array_key_exists('action', $reqData)) {
+ $action = $reqData['action'];
+
+ if (strcasecmp($action, 'lookupBox') == 0) {
+ $this->findLocationsWithinBounds($reqData);
+ } else if (strcasecmp($action, 'getInfo') == 0) {
+ $this->getInfoOnLocation($reqData);
+ } else {
+ die('lookupajax call was given unknown action: ' . $action);
+ }
+
+ } else {
+ die('lookupajax call has no action specified');
+ }
+ }
+
+ public function findLocationsWithinBounds($reqData)
+ {
+ if (array_key_exists ( 'sw_lat', $reqData )) {
+ $sw_lat = $reqData ['sw_lat'];
+ }
+ if (array_key_exists ( 'sw_lng', $reqData )) {
+ $sw_lng = $reqData ['sw_lng'];
+ }
+ if (array_key_exists ( 'ne_lat', $reqData )) {
+ $ne_lat = $reqData ['ne_lat'];
+ }
+ if (array_key_exists ( 'ne_lng', $reqData )) {
+ $ne_lng = $reqData ['ne_lng'];
+ }
+
+ if (array_key_exists ( 'radius', $reqData )) {
+ $radius = $reqData ['radius'];
+ }
+
+ $start = null;
+ if (array_key_exists('start', $reqData)) {
+ $start = $reqData['start'];
+ }
+ $end = null;
+ if (array_key_exists('end', $reqData)) {
+ $end = $reqData['end'];
+ }
+
+ // temp! fails over to using whole range.
+ if ($sw_lat === null) {
+ $sw_lat = - 90;
+ }
+ if ($sw_lng === null) {
+ $sw_lng = - 180;
+ }
+ if ($ne_lat === null) {
+ $ne_lat = 90;
+ }
+ if ($ne_lng === null) {
+ $ne_lng = 180;
+ }
+
+ // lookup the locations inside that box and store for view.
+ $locationsToSerialize = $this->Locations->getChewedLocationsInBox($sw_lat, $sw_lng, $ne_lat, $ne_lng, $start, $end);
+ Log::debug('db found ' . sizeof($locationsToSerialize) . ' rows for query (' . $start . '-' . $end . ')');
+
+ // simple implementation here since cakephp v3.4 was doing weird stuff instead of returning object we chose to serialize.
+ // ajax method would consistently return the name of the variable and 'undefined' as the only value, rather than properly
+ // serializing.
+ $encoded = json_encode ( $locationsToSerialize );
+ // Log::debug('encoded json is: ' . var_export($encoded, true));
+
+ die ( $encoded );
+ }
+
+ public function getInfoOnLocation($reqData)
+ {
+ if (array_key_exists('id', $reqData)) {
+ $id = $reqData['id'];
+ } else {
+ // throw an exception here?
+ $message = 'failed to find location id in request data';
+ Log::Debug($message);
+ die($message);
+ }
+
+ $location = $this->Locations->get($id, [
+ ]);
+ return die(json_encode($location));
+ }
+
+}
diff --git a/production/example_apps/zippy_maps/src/Controller/PagesController.php b/production/example_apps/zippy_maps/src/Controller/PagesController.php
new file mode 100644
index 00000000..55792c8e
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Controller/PagesController.php
@@ -0,0 +1,69 @@
+redirect('/');
+ }
+ if (in_array('..', $path, true) || in_array('.', $path, true)) {
+ throw new ForbiddenException();
+ }
+ $page = $subpage = null;
+
+ if (!empty($path[0])) {
+ $page = $path[0];
+ }
+ if (!empty($path[1])) {
+ $subpage = $path[1];
+ }
+ $this->set(compact('page', 'subpage'));
+
+ try {
+ $this->render(implode('/', $path));
+ } catch (MissingTemplateException $e) {
+ if (Configure::read('debug')) {
+ throw $e;
+ }
+ throw new NotFoundException();
+ }
+ }
+}
diff --git a/production/example_apps/zippy_maps/src/Model/Behavior/empty b/production/example_apps/zippy_maps/src/Model/Behavior/empty
new file mode 100644
index 00000000..e69de29b
diff --git a/production/example_apps/zippy_maps/src/Model/Entity/CategoriesLocation.php b/production/example_apps/zippy_maps/src/Model/Entity/CategoriesLocation.php
new file mode 100644
index 00000000..f21e91d6
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Model/Entity/CategoriesLocation.php
@@ -0,0 +1,34 @@
+ true,
+ 'id' => false
+ ];
+}
diff --git a/production/example_apps/zippy_maps/src/Model/Entity/Category.php b/production/example_apps/zippy_maps/src/Model/Entity/Category.php
new file mode 100644
index 00000000..a2d97ec8
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Model/Entity/Category.php
@@ -0,0 +1,31 @@
+ true,
+ 'id' => false
+ ];
+}
diff --git a/production/example_apps/zippy_maps/src/Model/Entity/Location.php b/production/example_apps/zippy_maps/src/Model/Entity/Location.php
new file mode 100644
index 00000000..83d5bbb6
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Model/Entity/Location.php
@@ -0,0 +1,33 @@
+ true,
+ 'id' => false
+ ];
+}
diff --git a/production/example_apps/zippy_maps/src/Model/Table/CategoriesLocationsTable.php b/production/example_apps/zippy_maps/src/Model/Table/CategoriesLocationsTable.php
new file mode 100644
index 00000000..f47763c2
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Model/Table/CategoriesLocationsTable.php
@@ -0,0 +1,83 @@
+setTable('categories_locations');
+ $this->setDisplayField('id');
+ $this->setPrimaryKey('id');
+
+ $this->addBehavior('Timestamp');
+
+ $this->belongsTo('Locations', [
+ 'foreignKey' => 'location_id',
+ 'joinType' => 'INNER'
+ ]);
+ $this->belongsTo('Categories', [
+ 'foreignKey' => 'category_id',
+ 'joinType' => 'INNER'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmpty('id', 'create');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->existsIn(['location_id'], 'Locations'));
+ $rules->add($rules->existsIn(['category_id'], 'Categories'));
+
+ return $rules;
+ }
+}
diff --git a/production/example_apps/zippy_maps/src/Model/Table/CategoriesTable.php b/production/example_apps/zippy_maps/src/Model/Table/CategoriesTable.php
new file mode 100644
index 00000000..4d6af560
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Model/Table/CategoriesTable.php
@@ -0,0 +1,186 @@
+setTable('categories');
+ $this->setDisplayField('name');
+ $this->setPrimaryKey('id');
+
+ $this->addBehavior('Timestamp');
+
+ $this->belongsToMany('Locations',
+ [
+ 'targetForeignKey' => 'location_id',
+ 'foreignKey' => 'category_id',
+ 'joinTable' => 'categories_locations',
+ 'through' => 'CategoriesLocations',
+ ]);
+
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmpty('id', 'create');
+
+ $validator
+ ->requirePresence('name', 'create')
+ ->notEmpty('name')
+ ->add('name', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']);
+
+ $validator
+ ->integer('parent')
+ ->allowEmpty('parent');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->isUnique(['name']));
+
+ return $rules;
+ }
+
+ /**
+ * returns a query that will find all the categories as a list.
+ */
+ public function getAllCategories() {
+ // find the full list of categories to show the user.
+ $categoriesList = $this->find ( 'list', [
+ 'keyField' => 'id',
+ 'valueField' => 'name',
+ 'order' => [
+ 'name' => 'asc'
+ ]
+ ] );
+ return $categoriesList;
+ }
+
+ /**
+ * returns a query that will locate all of the locations in the specified category with 'id'.
+ */
+ public function getLocationsInCategory($id)
+ {
+ // query all the locations belonging to this category.
+ $locationsInCategory = $this->CategoriesLocations->find('all', [
+ 'conditions' => [ 'category_id' => $id ],
+ 'contain' => ['Locations']
+ ]);
+ return $locationsInCategory;
+ }
+
+ /**
+ * returns a query that finds all locations in the category that fit within the southwest and northeast
+ * corners specified.
+ */
+ public function getLocationsInCategoryInBox($id, $sw_lat, $sw_long, $ne_lat, $ne_long, $start = null, $end = null)
+ {
+ // query all the locations belonging to this category.
+ $locationsInCategory = $this->CategoriesLocations->find('all', [
+ 'conditions' => [ 'category_id' => $id ],
+ 'contain' => ['Locations', 'Categories']
+ ]);
+
+ Log::Debug('bounds=' . $sw_lat . ', '. $sw_long . ' to ' . $ne_lat . ', ' . $ne_long);
+
+ $bounds = [ $sw_lat , $sw_long , $ne_lat , $ne_long ];
+
+ if (! $bounds) {
+ Log::Debug("failed to calculate the bounding box!");
+ } else {
+ Log::Debug("bounding box: " . var_export($bounds, true));
+ }
+
+ // use the boundaries to restrict the lookup.
+ // order: min_lat, min_long, max_lat, max_long.
+ $locationsInCategory = $locationsInCategory->where (
+ function ($exp) use ($bounds) {
+ return $exp->gte ( 'lat', $bounds [0] )->gte ( 'lng', $bounds [1] )->lte ( 'lat', $bounds [2] )->lte ( 'lng', $bounds [3] );
+ }
+ );
+
+ if (($start !== null) && ($end !== null)) {
+ Log::debug('start of range = ' . $start . ' and end = ' . $end);
+ $locationsInCategory= $locationsInCategory->order(['lat desc', 'lng desc']);
+ $chunk = $end - $start + 1;
+ $locationsInCategory= $locationsInCategory->limit($chunk);
+ $page = 1 + (int)($start / $chunk);
+ $locationsInCategory= $locationsInCategory->page($page);
+ Log::debug('page = ' . $page . ' and chunk = ' . $chunk);
+ }
+
+ return $locationsInCategory;
+ }
+
+ public function getChewedLocationsInCategoryInBox($id, $sw_lat, $sw_long, $ne_lat, $ne_long, $start = null, $end = null)
+ {
+ $locationsInCategory = $this->getLocationsInCategoryInBox($id, $sw_lat, $sw_long, $ne_lat, $ne_long, $start, $end);
+
+ $locationsToSerialize = [];
+
+ // make an array with the useful parts of the location data.
+ foreach ($locationsInCategory as $location) {
+ $lat_and_long = $location->location->lat. ',' . $location->location->lng;
+ if (array_key_exists ( $lat_and_long, $locationsToSerialize)) {
+ continue; // already got it.
+ }
+
+//Log::debug('got an icon value of: ' . $location->category->image);
+
+ // we don't include lat and lng below since they are encoded as array key.
+ $locationsToSerialize[$lat_and_long] = ['name' => $location->location->name,
+ 'loc' => $location->location->location,
+ 'icon' => $location->category->image,
+ 'id' => $location->location_id,
+ ];
+ }
+
+ return $locationsToSerialize;
+ }
+}
diff --git a/production/example_apps/zippy_maps/src/Model/Table/LocationsTable.php b/production/example_apps/zippy_maps/src/Model/Table/LocationsTable.php
new file mode 100644
index 00000000..57d43f73
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Model/Table/LocationsTable.php
@@ -0,0 +1,191 @@
+setTable('locations');
+ $this->setDisplayField('name');
+ $this->setPrimaryKey('id');
+
+ $this->addBehavior('Timestamp');
+
+ $this->belongsToMany('Categories',
+ [
+ 'targetForeignKey' => 'category_id',
+ 'foreignKey' => 'location_id',
+ 'joinTable' => 'categories_locations',
+ 'through' => 'CategoriesLocations',
+ ]);
+
+
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmpty('id', 'create');
+
+ $validator
+ ->requirePresence('name', 'create')
+ ->notEmpty('name')
+ ->add('name', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']);
+
+ $validator->requirePresence ( 'location', 'create' )->notEmpty ( 'location' );
+
+ $validator
+ ->allowEmpty('lat');
+ $validator
+ ->allowEmpty('lng');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->isUnique(['name']));
+
+ return $rules;
+ }
+
+
+ /**
+ * returns a query that will find the category records associated with a location 'id'
+ * as a list.
+ */
+ public function getSelectedCategories($id)
+ {
+ // find the categories that are chosen for this item, if any.
+ $selectedCategories = $this->CategoriesLocations->find ( 'list', [
+ 'keyField' => 'category_id',
+ 'valueField' => 'location_id',
+ 'conditions' => [
+ 'location_id' => $id
+ ],
+ 'contain' => [
+ 'Categories'
+ ]
+ ] );
+ return $selectedCategories;
+ }
+
+ /**
+ * returns a query that will find all of the locations within the bounding box.
+ */
+ public function getLocationsInBox($sw_lat, $sw_long, $ne_lat, $ne_long, $start = null, $end = null) {
+ $locationsInRange = $this->find ( 'all', [
+ 'contain' => ['Categories'],
+ ] );
+
+ Log::Debug ( 'bounds=' . $sw_lat . ', ' . $sw_long . ' to ' . $ne_lat . ', ' . $ne_long );
+
+ $bounds = [
+ $sw_lat,
+ $sw_long,
+ $ne_lat,
+ $ne_long
+ ];
+
+ if (! $bounds) {
+ Log::Debug ( "failed to calculate the bounding box!" );
+ } else {
+ Log::Debug ( "bounding box: " . var_export ( $bounds, true ) );
+ }
+
+ // use the boundaries to restrict the lookup so we aren't crushed.
+ // order: min_lat, min_long, max_lat, max_long.
+ $locationsInRange = $locationsInRange->where ( function ($exp) use ($bounds) {
+ return $exp->gte ( 'lat', $bounds [0] )->gte ( 'lng', $bounds [1] )->lte ( 'lat', $bounds [2] )->lte ( 'lng', $bounds [3] );
+ } );
+
+ if (($start !== null) && ($end !== null)) {
+ Log::debug('start of range = ' . $start . ' and end = ' . $end);
+ $locationsInRange = $locationsInRange->order(['lat desc', 'lng desc']);
+ $chunk = $end - $start + 1;
+ $locationsInRange = $locationsInRange->limit($chunk);
+ $page = 1 + (int)($start / $chunk);
+ $locationsInRange = $locationsInRange->page($page);
+ Log::debug('page = ' . $page . ' and chunk = ' . $chunk);
+ }
+
+ return $locationsInRange;
+ }
+
+ /**
+ * retrieves all of the locations within the bounding box as a list of partial location data.
+ */
+ public function getChewedLocationsInBox($sw_lat, $sw_long, $ne_lat, $ne_long, $start = null, $end = null) {
+ $locationsInRange = $this->getLocationsInBox($sw_lat, $sw_long, $ne_lat, $ne_long, $start, $end);
+
+ // track locations we've already added and do not add ones at exactly the same lat/long.
+ // if we did add these, google maps screws up in representing them.
+ $locationsToSerialize = [ ];
+
+ foreach ( $locationsInRange as $location ) {
+ $lat_and_long = $location->lat . ',' . $location->lng;
+ if (array_key_exists ( $lat_and_long, $locationsToSerialize )) {
+ continue; // already got it.
+ }
+
+// Log::debug('dumping location row: ' . var_export($location, true));
+
+ // we don't include lat and lng below since they are encoded as array key.
+ $locationsToSerialize [$lat_and_long] = [
+ 'name' => $location->name,
+ 'loc' => $location->location,
+ 'id' => $location->id
+ ];
+
+ // only try to add the image if the location actually has a category membership (at least one).
+ if ($location->categories) {
+ $locationsToSerialize [$lat_and_long]['icon'] = $location->categories[0]->image;
+ }
+ }
+
+ return $locationsToSerialize;
+ }
+
+}
diff --git a/production/example_apps/zippy_maps/src/Shell/ConsoleShell.php b/production/example_apps/zippy_maps/src/Shell/ConsoleShell.php
new file mode 100644
index 00000000..c84bd97a
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Shell/ConsoleShell.php
@@ -0,0 +1,81 @@
+err('Unable to load Psy\Shell. ');
+ $this->err('');
+ $this->err('Make sure you have installed psysh as a dependency,');
+ $this->err('and that Psy\Shell is registered in your autoloader.');
+ $this->err('');
+ $this->err('If you are using composer run');
+ $this->err('');
+ $this->err('$ php composer.phar require --dev psy/psysh ');
+ $this->err('');
+
+ return self::CODE_ERROR;
+ }
+
+ $this->out("You can exit with `CTRL-C` or `exit` ");
+ $this->out('');
+
+ Log::drop('debug');
+ Log::drop('error');
+ $this->_io->setLoggers(false);
+ restore_error_handler();
+ restore_exception_handler();
+
+ $psy = new PsyShell();
+ $psy->run();
+ }
+
+ /**
+ * Display help for this console.
+ *
+ * @return \Cake\Console\ConsoleOptionParser
+ */
+ public function getOptionParser()
+ {
+ $parser = new ConsoleOptionParser('console');
+ $parser->setDescription(
+ 'This shell provides a REPL that you can use to interact ' .
+ 'with your application in an interactive fashion. You can use ' .
+ 'it to run adhoc queries with your models, or experiment ' .
+ 'and explore the features of CakePHP and your application.' .
+ "\n\n" .
+ 'You will need to have psysh installed for this Shell to work.'
+ );
+
+ return $parser;
+ }
+}
diff --git a/production/example_apps/zippy_maps/src/Template/Categories/add.ctp b/production/example_apps/zippy_maps/src/Template/Categories/add.ctp
new file mode 100644
index 00000000..3aaada7a
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Categories/add.ctp
@@ -0,0 +1,27 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('List Categories'), ['action' => 'index']) ?>
+
+
+
+ = $this->Form->create($category) ?>
+
+ = __('Add Category') ?>
+ Form->control('name');
+ echo $this->Form->control('image');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/production/example_apps/zippy_maps/src/Template/Categories/center.ctp b/production/example_apps/zippy_maps/src/Template/Categories/center.ctp
new file mode 100644
index 00000000..ede0b27f
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Categories/center.ctp
@@ -0,0 +1,133 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('View Category'), ['action' => 'view', $category->id]) ?>
+ = $this->Html->link(__('Edit Category'), ['action' => 'edit', $category->id]) ?>
+ = $this->Form->postLink(__('Delete Category'), ['action' => 'delete', $category->id], ['confirm' => __('Are you sure you want to delete # {0}?', $category->id)]) ?>
+ = $this->Html->link(__('List Categories'), ['action' => 'index']) ?>
+ = $this->Html->link(__('New Category'), ['action' => 'add']) ?>
+
+
+
+
= h($category->name) ?>
+
+
+ = __('Name') ?>
+ = h($category->name) ?>
+
+
+ = __('Map of this Category\'s Locations') ?>
+
+log("state is: " . $state);
+
+ // kludgey attempt to focus a little better, based on state size.
+ $small_state = false;
+ $medium_state = false;
+ // is the state small?
+ $small_state = ($state == 'DE' || $state == 'RI' || $state == 'NH');
+// $this->log('small_state=' . var_export($small_state, true));
+ // if not small, we assume medium until told otherwise.
+ if (! $small_state) $medium_state = true;
+// $this->log('medium_state=' . var_export($medium_state, true));
+ // if certain known fat states, then not medium sized.
+ if ($state == 'TX' || $state == 'CA' || $state == 'AK') $medium_state = false;
+ $zoomFactor = $small_state? 8 : ( $medium_state? 7 : 5 );
+ $this->log('zooming at ' . $zoomFactor);
+ //question: how to pick a more useful zoom factor? maybe record in db a starting zoom factor per state?
+
+ // list options we want to override or add for the map.
+ $map_options = [
+ // automatically encompass markers and auto-center if they haven't told us where to start.
+ 'autoCenter' => ($mapCenter === null)? true : false,
+ 'clustering' => $clustering,
+ 'zoom' => $zoomFactor,
+ ];
+
+ // start at a specified center if one is given.
+ if ($mapCenter) {
+ $map_options = array_merge($map_options, $mapCenter);
+ }
+
+ //$this->log('new options set: ' . var_export($map_options, true));
+
+
+ // provide the element with all the info it needs to set up the map.
+ $element_options =
+ [
+ 'map_options' => $map_options,
+ 'map_colors' => 'avmaps/js/sg2_map_colors.js',
+ 'the_map' => $this->GoogleMap,
+ // no options to pass to ajax so far...
+ 'ajax_options' => '{
+ }',
+ 'default_options' => '{
+ json_provider: "/categories.json",
+ iconColor: "' . $this->MapDisplay->defaultIconColor() . '",
+ }',
+ ];
+
+ echo $this->element('Avmaps.google_map', $element_options);
+
+ /*
+ // create the basic map framework using google maps api.
+ $this->MapDisplay->setupMap ( $map_options, $this->GoogleMap );
+
+ // plug in our chosen color scheme for land, roads, etc.
+ $this->MapDisplay->applyColors ( 'avmaps/js/sg2_map_colors.js' );
+
+ // after the intial configuration items are done, we can emit the map code.
+ // we can still add markers after this point, and do so below.
+ $this->MapDisplay->emitMap ( false );
+
+ // we were handed a list of locations that match our query, so we can now add them as markers.
+ $this->MapDisplay->addMarkersInCategory ( $locationsInCategory, $category );
+
+ // set up our event handler for this view.
+// $this->MapDisplay->injectJSFile('avmaps/js/event_trappers.js');
+
+ // now we think we are ready to go. let's get the map displayed.
+ $this->MapDisplay->finallyDisplayMap ();
+ */
+
+ // end of dynamic map preparation.
+?>
+
+
+
+
+ = __('View Options') ?>
+
+ = $this->Form->create($category) ?>
+ Form->control ( 'view_options._ids', [
+ 'type' => 'select',
+ 'multiple' => true,
+ 'val' => $selectedList,
+ 'options' => [
+ 'clustering' => 'clustering'
+ ]
+ ] );
+ ?>
+
+ = $this->Form->button(__('Modify View')) ?>
+ = $this->Form->end() ?>
+
+
+
+
+
+
diff --git a/production/example_apps/zippy_maps/src/Template/Categories/edit.ctp b/production/example_apps/zippy_maps/src/Template/Categories/edit.ctp
new file mode 100644
index 00000000..9161c952
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Categories/edit.ctp
@@ -0,0 +1,32 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Form->postLink(
+ __('Delete'),
+ ['action' => 'delete', $category->id],
+ ['confirm' => __('Are you sure you want to delete # {0}?', $category->id)]
+ )
+ ?>
+ = $this->Html->link(__('List Categories'), ['action' => 'index']) ?>
+
+
+
+ = $this->Form->create($category) ?>
+
+ = __('Edit Category') ?>
+ Form->control('name');
+ echo $this->Form->control('image');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/production/example_apps/zippy_maps/src/Template/Categories/index.ctp b/production/example_apps/zippy_maps/src/Template/Categories/index.ctp
new file mode 100644
index 00000000..1a0381b0
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Categories/index.ctp
@@ -0,0 +1,56 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('New Category'), ['action' => 'add']) ?>
+
+
+
+
= __('Categories') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('name') ?>
+ = $this->Paginator->sort('image') ?>
+ = $this->Paginator->sort('created') ?>
+ = $this->Paginator->sort('modified') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($category->id) ?>
+ = h($category->name) ?>
+ = h($category->image) ?>
+ = h($category->created) ?>
+ = h($category->modified) ?>
+
+ = $this->Html->link(__('Map'), ['action' => 'map', $category->id]) ?>
+ = $this->Html->link(__('Center'), ['action' => 'center', $category->id]) ?>
+ = $this->Html->link(__('View'), ['action' => 'view', $category->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $category->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $category->id], ['confirm' => __('Are you sure you want to delete # {0}?', $category->id)]) ?>
+
+
+
+
+
+
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/production/example_apps/zippy_maps/src/Template/Categories/map.ctp b/production/example_apps/zippy_maps/src/Template/Categories/map.ctp
new file mode 100644
index 00000000..03a3cc53
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Categories/map.ctp
@@ -0,0 +1,85 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('View Category'), ['action' => 'view', $category->id]) ?>
+ = $this->Html->link(__('Edit Category'), ['action' => 'edit', $category->id]) ?>
+ = $this->Form->postLink(__('Delete Category'), ['action' => 'delete', $category->id], ['confirm' => __('Are you sure you want to delete # {0}?', $category->id)]) ?>
+ = $this->Html->link(__('List Categories'), ['action' => 'index']) ?>
+ = $this->Html->link(__('New Category'), ['action' => 'add']) ?>
+
+
+
+
= h($category->name) ?>
+
+
+ = __('Name') ?>
+ = h($category->name) ?>
+
+
+ = __('Map of this Category\'s Locations') ?>
+
+ true, // automatically encompass markers.
+ 'clustering' => $clustering,
+ ];
+
+ // provide the element with all the info it needs to set up the map.
+ $element_options = [
+ 'map_options' => $map_options,
+ 'map_colors' => 'avmaps/js/sg2_map_colors.js',
+ 'the_map' => $this->GoogleMap,
+ // we want to include the category ID when making ajax calls.
+ 'ajax_options' => '{ category: "' . $category->id . '"}',
+ 'default_options' => '{
+ iconColor: "' . $this->MapDisplay->defaultIconColor() . '",
+ json_provider: "/categories.json",
+ }',
+ ];
+
+ echo $this->element('Avmaps.google_map', $element_options);
+
+ // end of dynamic map preparation.
+
+?>
+
+
+
+
+ = __('View Options') ?>
+
+ = $this->Form->create($category) ?>
+ Form->control ( 'view_options._ids', [
+ 'type' => 'select',
+ 'multiple' => true,
+ 'val' => $selectedList,
+ 'options' => [
+ 'clustering' => 'clustering'
+ ]
+ ] );
+ ?>
+
+ = $this->Form->button(__('Modify View')) ?>
+ = $this->Form->end() ?>
+
+
+
+
+
+
diff --git a/production/example_apps/zippy_maps/src/Template/Categories/view.ctp b/production/example_apps/zippy_maps/src/Template/Categories/view.ctp
new file mode 100644
index 00000000..8eec91d5
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Categories/view.ctp
@@ -0,0 +1,56 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('Map Category'), ['action' => 'map', $category->id]) ?>
+ = $this->Html->link(__('Edit Category'), ['action' => 'edit', $category->id]) ?>
+ = $this->Form->postLink(__('Delete Category'), ['action' => 'delete', $category->id], ['confirm' => __('Are you sure you want to delete # {0}?', $category->id)]) ?>
+ = $this->Html->link(__('List Categories'), ['action' => 'index']) ?>
+ = $this->Html->link(__('New Category'), ['action' => 'add']) ?>
+
+
+
+
= h($category->name) ?>
+
+
+ = __('Name') ?>
+ = h($category->name) ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($category->id) ?>
+
+
+ = __('Image') ?>
+ = h($category->image) ?>
+
+
+ = __('Created') ?>
+ = h($category->created) ?>
+
+
+ = __('Modified') ?>
+ = h($category->modified) ?>
+
+
+ = __('Locations') ?>
+
+ Form->control('locations._ids', [
+ 'type' => 'select',
+ 'multiple' => true,
+ 'disabled' => true,
+ 'options' => $locationBits,
+ ]);
+ ?>
+
+
+
+
+
diff --git a/production/example_apps/zippy_maps/src/Template/Element/Flash/default.ctp b/production/example_apps/zippy_maps/src/Template/Element/Flash/default.ctp
new file mode 100644
index 00000000..736b27db
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Element/Flash/default.ctp
@@ -0,0 +1,10 @@
+
+= $message ?>
diff --git a/production/example_apps/zippy_maps/src/Template/Element/Flash/error.ctp b/production/example_apps/zippy_maps/src/Template/Element/Flash/error.ctp
new file mode 100644
index 00000000..e7c4af10
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Element/Flash/error.ctp
@@ -0,0 +1,6 @@
+
+= $message ?>
diff --git a/production/example_apps/zippy_maps/src/Template/Element/Flash/success.ctp b/production/example_apps/zippy_maps/src/Template/Element/Flash/success.ctp
new file mode 100644
index 00000000..becd5a1f
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Element/Flash/success.ctp
@@ -0,0 +1,6 @@
+
+= $message ?>
diff --git a/production/example_apps/zippy_maps/src/Template/Email/html/default.ctp b/production/example_apps/zippy_maps/src/Template/Email/html/default.ctp
new file mode 100644
index 00000000..386674a1
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Email/html/default.ctp
@@ -0,0 +1,22 @@
+
+ ' . $line . "\n";
+endforeach;
+?>
diff --git a/production/example_apps/zippy_maps/src/Template/Email/text/default.ctp b/production/example_apps/zippy_maps/src/Template/Email/text/default.ctp
new file mode 100644
index 00000000..704b46f0
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Email/text/default.ctp
@@ -0,0 +1,16 @@
+
+= $content ?>
diff --git a/production/example_apps/zippy_maps/src/Template/Error/error400.ctp b/production/example_apps/zippy_maps/src/Template/Error/error400.ctp
new file mode 100644
index 00000000..2aebac6c
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Error/error400.ctp
@@ -0,0 +1,38 @@
+layout = 'error';
+
+if (Configure::read('debug')):
+ $this->layout = 'dev_error';
+
+ $this->assign('title', $message);
+ $this->assign('templateName', 'error400.ctp');
+
+ $this->start('file');
+?>
+queryString)) : ?>
+
+ SQL Query:
+ = h($error->queryString) ?>
+
+
+params)) : ?>
+ SQL Query Params:
+ params) ?>
+
+= $this->element('auto_table_warning') ?>
+end();
+endif;
+?>
+= h($message) ?>
+
+ = __d('cake', 'Error') ?>:
+ = __d('cake', 'The requested address {0} was not found on this server.', "'{$url}' ") ?>
+
diff --git a/production/example_apps/zippy_maps/src/Template/Error/error500.ctp b/production/example_apps/zippy_maps/src/Template/Error/error500.ctp
new file mode 100644
index 00000000..d8014f84
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Error/error500.ctp
@@ -0,0 +1,43 @@
+layout = 'error';
+
+if (Configure::read('debug')):
+ $this->layout = 'dev_error';
+
+ $this->assign('title', $message);
+ $this->assign('templateName', 'error500.ctp');
+
+ $this->start('file');
+?>
+queryString)) : ?>
+
+ SQL Query:
+ = h($error->queryString) ?>
+
+
+params)) : ?>
+ SQL Query Params:
+ params) ?>
+
+
+ Error in:
+ = sprintf('%s, line %s', str_replace(ROOT, 'ROOT', $error->getFile()), $error->getLine()) ?>
+
+element('auto_table_warning');
+
+ if (extension_loaded('xdebug')):
+ xdebug_print_function_stack();
+ endif;
+
+ $this->end();
+endif;
+?>
+= __d('cake', 'An Internal Error Has Occurred') ?>
+
+ = __d('cake', 'Error') ?>:
+ = h($message) ?>
+
diff --git a/production/example_apps/zippy_maps/src/Template/Layout/Email/html/default.ctp b/production/example_apps/zippy_maps/src/Template/Layout/Email/html/default.ctp
new file mode 100644
index 00000000..2b439700
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Layout/Email/html/default.ctp
@@ -0,0 +1,24 @@
+
+
+
+
+ = $this->fetch('title') ?>
+
+
+ = $this->fetch('content') ?>
+
+
diff --git a/production/example_apps/zippy_maps/src/Template/Layout/Email/text/default.ctp b/production/example_apps/zippy_maps/src/Template/Layout/Email/text/default.ctp
new file mode 100644
index 00000000..871dcfb4
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Layout/Email/text/default.ctp
@@ -0,0 +1,16 @@
+
+= $this->fetch('content') ?>
diff --git a/production/example_apps/zippy_maps/src/Template/Layout/ajax.ctp b/production/example_apps/zippy_maps/src/Template/Layout/ajax.ctp
new file mode 100644
index 00000000..871dcfb4
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Layout/ajax.ctp
@@ -0,0 +1,16 @@
+
+= $this->fetch('content') ?>
diff --git a/production/example_apps/zippy_maps/src/Template/Layout/default.ctp b/production/example_apps/zippy_maps/src/Template/Layout/default.ctp
new file mode 100644
index 00000000..24a4dd0b
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Layout/default.ctp
@@ -0,0 +1,66 @@
+
+
+
+
+ = $this->Html->charset() ?>
+
+
+ = $pageDescription ?>:
+ = $this->fetch('title') ?>
+
+ = $this->Html->meta('icon') ?>
+
+ = $this->Html->css('base.css') ?>
+ = $this->Html->css('cake.css') ?>
+
+ = $this->fetch('meta') ?>
+ = $this->fetch('css') ?>
+
+
+
+
+
+
+
+ = $this->fetch('script') ?>
+
+
+
+
+
+
+
+ = $this->Flash->render() ?>
+
+ = $this->fetch('content') ?>
+
+
+
+
diff --git a/production/example_apps/zippy_maps/src/Template/Layout/error.ctp b/production/example_apps/zippy_maps/src/Template/Layout/error.ctp
new file mode 100644
index 00000000..5304ec43
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Layout/error.ctp
@@ -0,0 +1,47 @@
+
+
+
+
+ = $this->Html->charset() ?>
+
+ = $this->fetch('title') ?>
+
+ = $this->Html->meta('icon') ?>
+
+ = $this->Html->css('base.css') ?>
+ = $this->Html->css('cake.css') ?>
+
+ = $this->fetch('meta') ?>
+ = $this->fetch('css') ?>
+ = $this->fetch('script') ?>
+
+
+
+
+
+ = $this->Flash->render() ?>
+
+ = $this->fetch('content') ?>
+
+
+
+
+
diff --git a/production/example_apps/zippy_maps/src/Template/Layout/rss/default.ctp b/production/example_apps/zippy_maps/src/Template/Layout/rss/default.ctp
new file mode 100644
index 00000000..5c15a198
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Layout/rss/default.ctp
@@ -0,0 +1,14 @@
+fetch('title');
+endif;
+
+echo $this->Rss->document(
+ $this->Rss->channel(
+ [], $channel, $this->fetch('content')
+ )
+);
+?>
diff --git a/production/example_apps/zippy_maps/src/Template/Locations/add.ctp b/production/example_apps/zippy_maps/src/Template/Locations/add.ctp
new file mode 100644
index 00000000..e50d32c7
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Locations/add.ctp
@@ -0,0 +1,30 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('List Locations'), ['action' => 'index']) ?>
+
+
+
+ = $this->Form->create($location) ?>
+
+ = __('Add Location') ?>
+ Form->control('name');
+ echo $this->Form->control('location');
+
+ echo $this->Form->control('categories._ids', [
+ 'type' => 'select',
+ 'multiple' => true,
+ 'options' => $categoriesList,
+ ]);
+
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/production/example_apps/zippy_maps/src/Template/Locations/distance.ctp b/production/example_apps/zippy_maps/src/Template/Locations/distance.ctp
new file mode 100644
index 00000000..76f7b125
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Locations/distance.ctp
@@ -0,0 +1,58 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('List Locations'), ['action' => 'index']) ?>
+
+
+
+ = $this->Form->create('DistanceCalculator') ?>
+
+ = __('Calculate Distance') ?>
+ Form->control('from._ids', [
+ 'type' => 'select',
+ 'options' => $locationsFrom,
+ 'value' => $fromId,
+ ]);
+
+ if ($fromAddress !== null) {
+ echo $this->Form->control('from-address', [
+ 'type' => 'textarea',
+ 'rows' => 1,
+ 'default' => $fromAddress,
+ 'disabled' => 'disabled'
+ ]);
+ }
+
+ echo $this->Form->control('to._ids', [
+ 'type' => 'select',
+ 'options' => $locationsTo,
+ 'value' => $toId,
+ ]);
+
+ if ($toAddress !== null) {
+ echo $this->Form->control('to-address', [
+ 'type' => 'textarea',
+ 'rows' => 1,
+ 'default' => $toAddress,
+ 'disabled' => 'disabled'
+ ]);
+ }
+
+ echo $this->Form->control('distance', [
+ 'type' => 'textarea',
+ 'rows' => 1,
+ 'default' => $distanceCalculated,
+ 'disabled' => 'disabled'
+ ]);
+
+ ?>
+
+ = $this->Form->button(__('Calculate')) ?>
+ = $this->Form->end() ?>
+
diff --git a/production/example_apps/zippy_maps/src/Template/Locations/edit.ctp b/production/example_apps/zippy_maps/src/Template/Locations/edit.ctp
new file mode 100644
index 00000000..2a1e2580
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Locations/edit.ctp
@@ -0,0 +1,37 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Form->postLink(
+ __('Delete'),
+ ['action' => 'delete', $location->id],
+ ['confirm' => __('Are you sure you want to delete # {0}?', $location->id)]
+ )
+ ?>
+ = $this->Html->link(__('List Locations'), ['action' => 'index']) ?>
+
+
+
+ = $this->Form->create($location) ?>
+
+ = __('Edit Location') ?>
+ Form->control('name');
+ echo $this->Form->control('location');
+
+ echo $this->Form->control('categories._ids', [
+ 'type' => 'select',
+ 'multiple' => true,
+ 'val' => $selectedList,
+ 'options' => $categoriesList,
+ ]);
+
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/production/example_apps/zippy_maps/src/Template/Locations/index.ctp b/production/example_apps/zippy_maps/src/Template/Locations/index.ctp
new file mode 100644
index 00000000..ac967333
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Locations/index.ctp
@@ -0,0 +1,55 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('New Location'), ['action' => 'add']) ?>
+ = $this->Html->link(__('Calculate Distance'), ['action' => 'distance']) ?>
+
+
+
+
= __('Locations') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('name') ?>
+ = $this->Paginator->sort('location') ?>
+ = $this->Paginator->sort('lat') ?>
+ = $this->Paginator->sort('lng') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($location->id) ?>
+ = h($location->name) ?>
+ = h($location->location) ?>
+ = h($location->lat) ?>
+ = h($location->lng) ?>
+
+ = $this->Html->link(__('Jump'), ['action' => 'jump', $location->id]) ?>
+ = $this->Html->link(__('Radius'), ['action' => 'radius', $location->id]) ?>
+ = $this->Html->link(__('View'), ['action' => 'view', $location->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $location->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $location->id], ['confirm' => __('Are you sure you want to delete # {0}?', $location->id)]) ?>
+
+
+
+
+
+
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/production/example_apps/zippy_maps/src/Template/Locations/jump.ctp b/production/example_apps/zippy_maps/src/Template/Locations/jump.ctp
new file mode 100644
index 00000000..a4631bdc
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Locations/jump.ctp
@@ -0,0 +1,53 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('List Locations'), ['action' => 'index']) ?>
+
+
+
+ = $this->Form->create('Jump') ?>
+
+ = __('Jump to Location') ?>
+ true, // automatically encompass markers.
+ 'clustering' => true, // cluster the markers.
+ 'zoom' => 12, // zoom in pretty far but not as a microscope.
+ 'lat' => $fromLat,
+ 'lng' => $fromLong,
+ ];
+
+ // provide the element with all the info it needs to set up the map.
+ $element_options =
+ [
+ 'map_options' => $map_options,
+ 'map_colors' => 'avmaps/js/sg2_map_colors.js',
+ 'the_map' => $this->GoogleMap,
+ // no options to pass to ajax so far...
+ 'ajax_options' => '{
+ }',
+ 'default_options' => '{
+ iconColor: "' . $this->MapDisplay->defaultIconColor() . '",
+ json_provider: "/locations.json",
+ }',
+ ];
+
+ echo $this->element('Avmaps.google_map', $element_options);
+ }
+ ?>
+
+
+ = $this->Form->end() ?>
+
diff --git a/production/example_apps/zippy_maps/src/Template/Locations/radius.ctp b/production/example_apps/zippy_maps/src/Template/Locations/radius.ctp
new file mode 100644
index 00000000..11b483e4
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Locations/radius.ctp
@@ -0,0 +1,56 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('List Locations'), ['action' => 'index']) ?>
+
+
+
+ = $this->Form->create('RadiusFinder') ?>
+
+ = __('Find Locations Within Radius') ?>
+ Form->control ( 'from-address', [
+ 'type' => 'textarea',
+ 'rows' => 1,
+ 'default' => $fromAddress,
+ 'disabled' => 'disabled'
+ ] );
+
+ echo $this->Form->control ( 'radius (in miles)' , ['default' => $radius]);
+
+ // list options we want to override or add for the map.
+ $map_options = [
+ 'autoCenter' => true, // automatically encompass markers.
+ 'clustering' => true, // cluster the markers.
+ ];
+
+ // provide the element with all the info it needs to set up the map.
+ $element_options =
+ [
+ 'map_options' => $map_options,
+ 'map_colors' => 'avmaps/js/sg2_map_colors.js',
+ 'the_map' => $this->GoogleMap,
+ // no options to pass to ajax so far...
+ 'ajax_options' => '{
+ }',
+ // not passing json provider, since we are doing a special radius thing here. so no updates.
+ 'default_options' => '{
+ iconColor: "' . $this->MapDisplay->defaultIconColor() . '",
+ }',
+ ];
+
+ echo $this->element('Avmaps.google_map', $element_options);
+ }
+ ?>
+
+ = $this->Form->button(__('Calculate')) ?>
+ = $this->Form->end() ?>
+
diff --git a/production/example_apps/zippy_maps/src/Template/Locations/view.ctp b/production/example_apps/zippy_maps/src/Template/Locations/view.ctp
new file mode 100644
index 00000000..855df52f
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Locations/view.ctp
@@ -0,0 +1,97 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('Edit Location'), ['action' => 'edit', $location->id]) ?>
+ = $this->Form->postLink(__('Delete Location'), ['action' => 'delete', $location->id], ['confirm' => __('Are you sure you want to delete # {0}?', $location->id)]) ?>
+ = $this->Html->link(__('List Locations'), ['action' => 'index']) ?>
+ = $this->Html->link(__('New Location'), ['action' => 'add']) ?>
+
+
+
+
= h($location->name) ?>
+
+
+ = __('Name') ?>
+ = h($location->name) ?>
+
+
+ = __('Location') ?>
+ = h($location->location) ?>
+
+ $location->lat
+ . ',' . $location->lng
+ ],
+ ];
+
+ $marker_options = [
+ 'color' => $this->MapDisplay->defaultIconColor(),
+ 'shadow' => 'false'
+ ];
+
+ $markers = $this->GoogleMap->staticMarkers($addresses, $marker_options);
+
+ $map_options = [
+ 'center' => $location->lat
+ . ',' . $location->lng,
+ 'markers' => $markers,
+ 'zoom' => 8,
+ ];
+
+ $map = $this->GoogleMap->staticMap($map_options);
+
+ echo $map;
+
+ $this->GoogleMap->finalize();
+
+ //end static map junk.
+ ?>
+
+
+
+
+ = __('Lat&Long') ?>
+ = h($location->lat . ',' . $location->lng) ?>
+
+
+ = __('Zip Code (RGC)') ?>
+
+ lat, $location->lng, [
+ 'key' => $api_key
+ ]);
+ if ($results) {
+ echo h($results[0]);
+ } else {
+ echo h('failed to reverse geocode');
+ }
+
+ ?>
+
+
+ = __('Address (RGC)') ?>
+ = h($results[1]) ?>
+
+
+ = __('Categories') ?>
+
+ = $this->Form->control('categories._ids', [
+ 'type' => 'select',
+ 'multiple' => true,
+ 'val' => $selectedList,
+ 'options' => $categoriesList,
+ ]);
+ ?>
+
+
+
diff --git a/production/example_apps/zippy_maps/src/Template/Pages/home.ctp b/production/example_apps/zippy_maps/src/Template/Pages/home.ctp
new file mode 100644
index 00000000..b495ee8a
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/Template/Pages/home.ctp
@@ -0,0 +1,290 @@
+layout = false;
+
+if (!Configure::read('debug')):
+ throw new NotFoundException('Please replace src/Template/Pages/home.ctp with your own version.');
+endif;
+
+$cakeDescription = 'Maps Demo - showing what we can do to google maps';
+?>
+
+
+
+ = $this->Html->charset() ?>
+
+
+ = $cakeDescription ?>
+
+
+ = $this->Html->meta('icon') ?>
+ = $this->Html->css('base.css') ?>
+ = $this->Html->css('cake.css') ?>
+ = $this->Html->css('home.css') ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
Please be aware that this page will not be shown if you turn off debug mode unless you replace src/Template/Pages/home.ctp with your own version.
+
+
+
+
+
+
+
+
+
Environment
+
+ =')): ?>
+ Your version of PHP is 5.6.0 or higher (detected = PHP_VERSION ?>).
+
+ Your version of PHP is too low. You need PHP 5.6.0 or higher to use CakePHP (detected = PHP_VERSION ?>).
+
+
+
+ Your version of PHP has the mbstring extension loaded.
+
+ Your version of PHP does NOT have the mbstring extension loaded. ;
+
+
+
+ Your version of PHP has the openssl extension loaded.
+
+ Your version of PHP has the mcrypt extension loaded.
+
+ Your version of PHP does NOT have the openssl or mcrypt extension loaded.
+
+
+
+ Your version of PHP has the intl extension loaded.
+
+ Your version of PHP does NOT have the intl extension loaded.
+
+
+
+
+
Filesystem
+
+
+ Your tmp directory is writable.
+
+ Your tmp directory is NOT writable.
+
+
+
+ Your logs directory is writable.
+
+ Your logs directory is NOT writable.
+
+
+
+
+ The = $settings['className'] ?>Engine is being used for core caching. To change the config edit config/app.php
+
+ Your cache is NOT working. Please check the settings in config/app.php
+
+
+
+
+
+
+
+
+
Database
+ connect();
+ } catch (Exception $connectionError) {
+ $connected = false;
+ $errorMsg = $connectionError->getMessage();
+ if (method_exists($connectionError, 'getAttributes')):
+ $attributes = $connectionError->getAttributes();
+ if (isset($errorMsg['message'])):
+ $errorMsg .= '
' . $attributes['message'];
+ endif;
+ endif;
+ }
+ ?>
+
+
+ CakePHP is able to connect to the database.
+
+ CakePHP is NOT able to connect to the database. = $errorMsg ?>
+
+
+
+
+
DebugKit
+
+
+ DebugKit is loaded.
+
+ DebugKit is NOT loaded. You need to either install pdo_sqlite, or define the "debug_kit" connection name.
+
+
+
+
+
+
+
+
+
Editing this Page
+
+ To change the content of this page, edit: src/Template/Pages/home.ctp.
+ You can also add some CSS styles for your pages at: webroot/css/.
+
+
+
+
+
+
+
+
More about Cake
+
+ CakePHP is a rapid development framework for PHP which uses commonly known design patterns like Front Controller and MVC.
+ Our primary goal is to provide a structured framework that enables PHP users at all levels to rapidly develop robust web applications, without any loss to flexibility.
+
+
+
+
+
+
+
+
P
+
Help and Bug Reports
+
+
+
+
r
+
Docs and Downloads
+
+
+
+
s
+
Training and Certification
+
+
+
+
+
+
diff --git a/production/example_apps/zippy_maps/src/View/AjaxView.php b/production/example_apps/zippy_maps/src/View/AjaxView.php
new file mode 100644
index 00000000..594e2d80
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/View/AjaxView.php
@@ -0,0 +1,49 @@
+response->type('ajax');
+ }
+}
diff --git a/production/example_apps/zippy_maps/src/View/AppView.php b/production/example_apps/zippy_maps/src/View/AppView.php
new file mode 100644
index 00000000..afbb42ee
--- /dev/null
+++ b/production/example_apps/zippy_maps/src/View/AppView.php
@@ -0,0 +1,48 @@
+loadHelper('Html');`
+ *
+ * @return void
+ */
+ public function initialize()
+ {
+ // code added to load mapping view helper.
+ $config = [
+ 'autoScript' => true,
+ 'className' => 'Avmaps.ClusteringMap'
+ ];
+ $this->loadHelper('Geo.GoogleMap', $config);
+
+ $this->loadHelper('Avmaps.MapDisplay');
+ }
+}
diff --git a/production/example_apps/zippy_maps/src/View/Helper/empty b/production/example_apps/zippy_maps/src/View/Helper/empty
new file mode 100644
index 00000000..e69de29b
diff --git a/production/example_apps/zippy_maps/tests/Fixture/CategoriesFixture.php b/production/example_apps/zippy_maps/tests/Fixture/CategoriesFixture.php
new file mode 100644
index 00000000..75021793
--- /dev/null
+++ b/production/example_apps/zippy_maps/tests/Fixture/CategoriesFixture.php
@@ -0,0 +1,50 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null],
+ 'name' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'parent' => ['type' => 'integer', 'length' => 11, 'unsigned' => true, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'modified' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ 'name' => ['type' => 'unique', 'columns' => ['name'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_general_ci'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+
+ /**
+ * Records
+ *
+ * @var array
+ */
+ public $records = [
+ [
+ 'id' => 1,
+ 'name' => 'Lorem ipsum dolor sit amet',
+ 'parent' => 1,
+ 'created' => '2017-04-26 14:08:10',
+ 'modified' => '2017-04-26 14:08:10'
+ ],
+ ];
+}
diff --git a/production/example_apps/zippy_maps/tests/Fixture/CategoriesLocationsFixture.php b/production/example_apps/zippy_maps/tests/Fixture/CategoriesLocationsFixture.php
new file mode 100644
index 00000000..6c515f25
--- /dev/null
+++ b/production/example_apps/zippy_maps/tests/Fixture/CategoriesLocationsFixture.php
@@ -0,0 +1,55 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null],
+ 'location_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'category_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'modified' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ '_indexes' => [
+ 'location_id' => ['type' => 'index', 'columns' => ['location_id'], 'length' => []],
+ 'category_id' => ['type' => 'index', 'columns' => ['category_id'], 'length' => []],
+ ],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ 'categories_locations_ibfk_1' => ['type' => 'foreign', 'columns' => ['location_id'], 'references' => ['locations', 'id'], 'update' => 'restrict', 'delete' => 'restrict', 'length' => []],
+ 'categories_locations_ibfk_2' => ['type' => 'foreign', 'columns' => ['category_id'], 'references' => ['categories', 'id'], 'update' => 'restrict', 'delete' => 'restrict', 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_general_ci'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+
+ /**
+ * Records
+ *
+ * @var array
+ */
+ public $records = [
+ [
+ 'id' => 1,
+ 'location_id' => 1,
+ 'category_id' => 1,
+ 'created' => '2017-05-01 18:36:01',
+ 'modified' => '2017-05-01 18:36:01'
+ ],
+ ];
+}
diff --git a/production/example_apps/zippy_maps/tests/Fixture/LocationsFixture.php b/production/example_apps/zippy_maps/tests/Fixture/LocationsFixture.php
new file mode 100644
index 00000000..fe44867a
--- /dev/null
+++ b/production/example_apps/zippy_maps/tests/Fixture/LocationsFixture.php
@@ -0,0 +1,57 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null],
+ 'name' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'location' => ['type' => 'string', 'length' => 1024, 'null' => false, 'default' => null, 'collate' => 'utf8_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'lat' => ['type' => 'float', 'null' => true, 'default' => null, ],
+ 'lng' => ['type' => 'float', 'null' => true, 'default' => null, ],
+ 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'modified' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ '_indexes' => [
+ 'location' => ['type' => 'index', 'columns' => ['location'], 'length' => []],
+ ],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ 'name' => ['type' => 'unique', 'columns' => ['name'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_general_ci'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+
+ /**
+ * Records
+ *
+ * @var array
+ */
+ public $records = [
+ [
+ 'id' => 1,
+ 'name' => 'Lorem ipsum dolor sit amet',
+ 'location' => 'Lorem ipsum dolor sit amet',
+ 'lat' => 30.8,
+ 'lng' => -12.6,
+ 'created' => '2017-04-21 14:54:02',
+ 'modified' => '2017-04-21 14:54:02'
+ ],
+ ];
+}
diff --git a/production/example_apps/zippy_maps/tests/TestCase/ApplicationTest.php b/production/example_apps/zippy_maps/tests/TestCase/ApplicationTest.php
new file mode 100644
index 00000000..d397fa1c
--- /dev/null
+++ b/production/example_apps/zippy_maps/tests/TestCase/ApplicationTest.php
@@ -0,0 +1,46 @@
+middleware($middleware);
+
+ $this->assertInstanceOf(ErrorHandlerMiddleware::class, $middleware->get(0));
+ $this->assertInstanceOf(AssetMiddleware::class, $middleware->get(1));
+ $this->assertInstanceOf(RoutingMiddleware::class, $middleware->get(2));
+ }
+}
diff --git a/production/example_apps/zippy_maps/tests/TestCase/Controller/CategoriesControllerTest.php b/production/example_apps/zippy_maps/tests/TestCase/Controller/CategoriesControllerTest.php
new file mode 100644
index 00000000..f0884e4f
--- /dev/null
+++ b/production/example_apps/zippy_maps/tests/TestCase/Controller/CategoriesControllerTest.php
@@ -0,0 +1,71 @@
+markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test view method
+ *
+ * @return void
+ */
+ public function testView()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test add method
+ *
+ * @return void
+ */
+ public function testAdd()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test edit method
+ *
+ * @return void
+ */
+ public function testEdit()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test delete method
+ *
+ * @return void
+ */
+ public function testDelete()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/production/example_apps/zippy_maps/tests/TestCase/Controller/Component/empty b/production/example_apps/zippy_maps/tests/TestCase/Controller/Component/empty
new file mode 100644
index 00000000..e69de29b
diff --git a/production/example_apps/zippy_maps/tests/TestCase/Controller/LocationsControllerTest.php b/production/example_apps/zippy_maps/tests/TestCase/Controller/LocationsControllerTest.php
new file mode 100644
index 00000000..014f2fa5
--- /dev/null
+++ b/production/example_apps/zippy_maps/tests/TestCase/Controller/LocationsControllerTest.php
@@ -0,0 +1,71 @@
+markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test view method
+ *
+ * @return void
+ */
+ public function testView()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test add method
+ *
+ * @return void
+ */
+ public function testAdd()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test edit method
+ *
+ * @return void
+ */
+ public function testEdit()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test delete method
+ *
+ * @return void
+ */
+ public function testDelete()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/production/example_apps/zippy_maps/tests/TestCase/Controller/PagesControllerTest.php b/production/example_apps/zippy_maps/tests/TestCase/Controller/PagesControllerTest.php
new file mode 100644
index 00000000..1b478a31
--- /dev/null
+++ b/production/example_apps/zippy_maps/tests/TestCase/Controller/PagesControllerTest.php
@@ -0,0 +1,97 @@
+get('/');
+ $this->assertResponseOk();
+ $this->get('/');
+ $this->assertResponseOk();
+ }
+
+ /**
+ * testDisplay method
+ *
+ * @return void
+ */
+ public function testDisplay()
+ {
+ $this->get('/pages/home');
+ $this->assertResponseOk();
+ $this->assertResponseContains('CakePHP');
+ $this->assertResponseContains('');
+ }
+
+ /**
+ * Test that missing template renders 404 page in production
+ *
+ * @return void
+ */
+ public function testMissingTemplate()
+ {
+ Configure::write('debug', false);
+ $this->get('/pages/not_existing');
+
+ $this->assertResponseError();
+ $this->assertResponseContains('Error');
+ }
+
+ /**
+ * Test that missing template in debug mode renders missing_template error page
+ *
+ * @return void
+ */
+ public function testMissingTemplateInDebug()
+ {
+ Configure::write('debug', true);
+ $this->get('/pages/not_existing');
+
+ $this->assertResponseFailure();
+ $this->assertResponseContains('Missing Template');
+ $this->assertResponseContains('Stacktrace');
+ $this->assertResponseContains('not_existing.ctp');
+ }
+
+ /**
+ * Test directory traversal protection
+ *
+ * @return void
+ */
+ public function testDirectoryTraversalProtection()
+ {
+ $this->get('/pages/../Layout/ajax');
+ $this->assertResponseCode(403);
+ $this->assertResponseContains('Forbidden');
+ }
+}
diff --git a/production/example_apps/zippy_maps/tests/TestCase/Model/Behavior/empty b/production/example_apps/zippy_maps/tests/TestCase/Model/Behavior/empty
new file mode 100644
index 00000000..e69de29b
diff --git a/production/example_apps/zippy_maps/tests/TestCase/Model/Table/CategoriesLocationsTableTest.php b/production/example_apps/zippy_maps/tests/TestCase/Model/Table/CategoriesLocationsTableTest.php
new file mode 100644
index 00000000..1a457956
--- /dev/null
+++ b/production/example_apps/zippy_maps/tests/TestCase/Model/Table/CategoriesLocationsTableTest.php
@@ -0,0 +1,85 @@
+ 'App\Model\Table\CategoriesLocationsTable'];
+ $this->CategoriesLocations = TableRegistry::get('CategoriesLocations', $config);
+ }
+
+ /**
+ * tearDown method
+ *
+ * @return void
+ */
+ public function tearDown()
+ {
+ unset($this->CategoriesLocations);
+
+ parent::tearDown();
+ }
+
+ /**
+ * Test initialize method
+ *
+ * @return void
+ */
+ public function testInitialize()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test validationDefault method
+ *
+ * @return void
+ */
+ public function testValidationDefault()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test buildRules method
+ *
+ * @return void
+ */
+ public function testBuildRules()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/production/example_apps/zippy_maps/tests/TestCase/Model/Table/CategoriesTableTest.php b/production/example_apps/zippy_maps/tests/TestCase/Model/Table/CategoriesTableTest.php
new file mode 100644
index 00000000..a618e677
--- /dev/null
+++ b/production/example_apps/zippy_maps/tests/TestCase/Model/Table/CategoriesTableTest.php
@@ -0,0 +1,83 @@
+ 'App\Model\Table\CategoriesTable'];
+ $this->Categories = TableRegistry::get('Categories', $config);
+ }
+
+ /**
+ * tearDown method
+ *
+ * @return void
+ */
+ public function tearDown()
+ {
+ unset($this->Categories);
+
+ parent::tearDown();
+ }
+
+ /**
+ * Test initialize method
+ *
+ * @return void
+ */
+ public function testInitialize()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test validationDefault method
+ *
+ * @return void
+ */
+ public function testValidationDefault()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test buildRules method
+ *
+ * @return void
+ */
+ public function testBuildRules()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/production/example_apps/zippy_maps/tests/TestCase/Model/Table/LocationsTableTest.php b/production/example_apps/zippy_maps/tests/TestCase/Model/Table/LocationsTableTest.php
new file mode 100644
index 00000000..59669719
--- /dev/null
+++ b/production/example_apps/zippy_maps/tests/TestCase/Model/Table/LocationsTableTest.php
@@ -0,0 +1,83 @@
+ 'App\Model\Table\LocationsTable'];
+ $this->Locations = TableRegistry::get('Locations', $config);
+ }
+
+ /**
+ * tearDown method
+ *
+ * @return void
+ */
+ public function tearDown()
+ {
+ unset($this->Locations);
+
+ parent::tearDown();
+ }
+
+ /**
+ * Test initialize method
+ *
+ * @return void
+ */
+ public function testInitialize()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test validationDefault method
+ *
+ * @return void
+ */
+ public function testValidationDefault()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test buildRules method
+ *
+ * @return void
+ */
+ public function testBuildRules()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/production/example_apps/zippy_maps/tests/TestCase/View/Helper/empty b/production/example_apps/zippy_maps/tests/TestCase/View/Helper/empty
new file mode 100644
index 00000000..e69de29b
diff --git a/production/example_apps/zippy_maps/tests/bootstrap.php b/production/example_apps/zippy_maps/tests/bootstrap.php
new file mode 100644
index 00000000..0ca191e4
--- /dev/null
+++ b/production/example_apps/zippy_maps/tests/bootstrap.php
@@ -0,0 +1,12 @@
+
+ RewriteEngine On
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^ index.php [L]
+
diff --git a/production/example_apps/zippy_maps/webroot/css/base.css b/production/example_apps/zippy_maps/webroot/css/base.css
new file mode 100644
index 00000000..f8bd4f62
--- /dev/null
+++ b/production/example_apps/zippy_maps/webroot/css/base.css
@@ -0,0 +1,450 @@
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS text size adjust after orientation change, without disabling
+ * user zoom.
+ */
+
+html {
+ font-family: sans-serif; /* 1 */
+ -ms-text-size-adjust: 100%; /* 2 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove default margin.
+ */
+
+body {
+ margin: 0;
+}
+
+/* HTML5 display definitions
+ ========================================================================== */
+
+/**
+ * Correct `block` display not defined for any HTML5 element in IE 8/9.
+ * Correct `block` display not defined for `details` or `summary` in IE 10/11
+ * and Firefox.
+ * Correct `block` display not defined for `main` in IE 11.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+ display: block;
+}
+
+/**
+ * 1. Correct `inline-block` display not defined in IE 8/9.
+ * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
+ */
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block; /* 1 */
+ vertical-align: baseline; /* 2 */
+}
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+/**
+ * Address `[hidden]` styling not present in IE 8/9/10.
+ * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
+ */
+
+[hidden],
+template {
+ display: none;
+}
+
+/* Links
+ ========================================================================== */
+
+/**
+ * Remove the gray background color from active links in IE 10.
+ */
+
+a {
+ background-color: transparent;
+}
+
+/**
+ * Improve readability when focused and also mouse hovered in all browsers.
+ */
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+/* Text-level semantics
+ ========================================================================== */
+
+/**
+ * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
+ */
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
+ */
+
+b,
+strong {
+ font-weight: bold;
+}
+
+/**
+ * Address styling not present in Safari and Chrome.
+ */
+
+dfn {
+ font-style: italic;
+}
+
+/**
+ * Address variable `h1` font-size and margin within `section` and `article`
+ * contexts in Firefox 4+, Safari, and Chrome.
+ */
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+
+small {
+ font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+/* Embedded content
+ ========================================================================== */
+
+/**
+ * Remove border when inside `a` element in IE 8/9/10.
+ */
+
+img {
+ border: 0;
+}
+
+/**
+ * Correct overflow not hidden in IE 9/10/11.
+ */
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+/* Grouping content
+ ========================================================================== */
+
+/**
+ * Address margin not present in IE 8/9 and Safari.
+ */
+
+figure {
+ margin: 1em 40px;
+}
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+
+hr {
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+}
+
+/**
+ * Contain overflow in all browsers.
+ */
+
+pre {
+ overflow: auto;
+}
+
+/**
+ * Address odd `em`-unit font size rendering in all browsers.
+ */
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+/* Forms
+ ========================================================================== */
+
+/**
+ * Known limitation: by default, Chrome and Safari on OS X allow very limited
+ * styling of `select`, unless a `border` property is set.
+ */
+
+/**
+ * 1. Correct color not being inherited.
+ * Known issue: affects color of disabled elements.
+ * 2. Correct font properties not being inherited.
+ * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit; /* 1 */
+ font: inherit; /* 2 */
+ margin: 0; /* 3 */
+}
+
+/**
+ * Address `overflow` set to `hidden` in IE 8/9/10/11.
+ */
+
+button {
+ overflow: visible;
+}
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
+ * Correct `select` style inheritance in Firefox.
+ */
+
+button,
+select {
+ text-transform: none;
+}
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ * and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ * `input` and others.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button; /* 2 */
+ cursor: pointer; /* 3 */
+}
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
+ * the UA stylesheet.
+ */
+
+input {
+ line-height: normal;
+}
+
+/**
+ * It's recommended that you don't attempt to style these elements.
+ * Firefox's implementation doesn't respect box-sizing, padding, or width.
+ *
+ * 1. Address box sizing set to `content-box` in IE 8/9/10.
+ * 2. Remove excess padding in IE 8/9/10.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Fix the cursor style for Chrome's increment/decrement buttons. For certain
+ * `font-size` values of the `input`, it causes the cursor style of the
+ * decrement button to change from `default` to `text`.
+ */
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
+ * (include `-moz` to future-proof).
+ */
+
+input[type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ -moz-box-sizing: content-box;
+ -webkit-box-sizing: content-box; /* 2 */
+ box-sizing: content-box;
+}
+
+/**
+ * Remove inner padding and search cancel button in Safari and Chrome on OS X.
+ * Safari (but not Chrome) clips the cancel button when the search input has
+ * padding (and `textfield` appearance).
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9/10/11.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+
+legend {
+ border: 0; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Remove default vertical scrollbar in IE 8/9/10/11.
+ */
+
+textarea {
+ overflow: auto;
+}
+
+/**
+ * Don't inherit the `font-weight` (applied by a rule above).
+ * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
+ */
+
+optgroup {
+ font-weight: bold;
+}
+
+/* Tables
+ ========================================================================== */
+
+/**
+ * Remove most spacing between table cells.
+ */
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+td,
+th {
+ padding: 0;
+}
+
+/*
+ * Copyright (c) 2013-2014 ZURB, inc.
+* MIT License
+* 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.
+*/
+
+meta.foundation-version{font-family:"{{ VERSION }}"}meta.foundation-mq-small{font-family:"/only screen/";width:0}meta.foundation-mq-small-only{font-family:"/only screen and (max-width: 40em)/";width:0}meta.foundation-mq-medium{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}meta.foundation-mq-medium-only{font-family:"/only screen and (min-width:40.0625em) and (max-width:64em)/";width:40.0625em}meta.foundation-mq-large{font-family:"/only screen and (min-width:64.0625em)/";width:64.0625em}meta.foundation-mq-large-only{font-family:"/only screen and (min-width:64.0625em) and (max-width:90em)/";width:64.0625em}meta.foundation-mq-xlarge{font-family:"/only screen and (min-width:90.0625em)/";width:90.0625em}meta.foundation-mq-xlarge-only{font-family:"/only screen and (min-width:90.0625em) and (max-width:120em)/";width:90.0625em}meta.foundation-mq-xxlarge{font-family:"/only screen and (min-width:120.0625em)/";width:120.0625em}meta.foundation-data-attribute-namespace{font-family:false}html,body{height:100%}html{box-sizing:border-box}*,*:before,*:after{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}html,body{font-size:100%}body{background:#fff;color:#222;cursor:auto;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:normal;line-height:1.5;margin:0;padding:0;position:relative}a:hover{cursor:pointer}img{max-width:100%;height:auto}img{-ms-interpolation-mode:bicubic}#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object,.mqa-display img,.mqa-display embed,.mqa-display object{max-width:none !important}.left{float:left !important}.right{float:right !important}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.hide{display:none}.invisible{visibility:hidden}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}.row{margin:0 auto;max-width:62.5rem;width:100%}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.row.collapse>.column,.row.collapse>.columns{padding-left:0;padding-right:0}.row.collapse .row{margin-left:0;margin-right:0}.row .row{margin:0 -0.9375rem;max-width:none;width:auto}.row .row:before,.row .row:after{content:" ";display:table}.row .row:after{clear:both}.row .row.collapse{margin:0;max-width:none;width:auto}.row .row.collapse:before,.row .row.collapse:after{content:" ";display:table}.row .row.collapse:after{clear:both}.column,.columns{padding-left:0.9375rem;padding-right:0.9375rem;width:100%;float:left}.column+.column:last-child,.columns+.column:last-child,.column+.columns:last-child,.columns+.columns:last-child{float:right}.column+.column.end,.columns+.column.end,.column+.columns.end,.columns+.columns.end{float:left}@media only screen{.small-push-0{position:relative;left:0;right:auto}.small-pull-0{position:relative;right:0;left:auto}.small-push-1{position:relative;left:8.33333%;right:auto}.small-pull-1{position:relative;right:8.33333%;left:auto}.small-push-2{position:relative;left:16.66667%;right:auto}.small-pull-2{position:relative;right:16.66667%;left:auto}.small-push-3{position:relative;left:25%;right:auto}.small-pull-3{position:relative;right:25%;left:auto}.small-push-4{position:relative;left:33.33333%;right:auto}.small-pull-4{position:relative;right:33.33333%;left:auto}.small-push-5{position:relative;left:41.66667%;right:auto}.small-pull-5{position:relative;right:41.66667%;left:auto}.small-push-6{position:relative;left:50%;right:auto}.small-pull-6{position:relative;right:50%;left:auto}.small-push-7{position:relative;left:58.33333%;right:auto}.small-pull-7{position:relative;right:58.33333%;left:auto}.small-push-8{position:relative;left:66.66667%;right:auto}.small-pull-8{position:relative;right:66.66667%;left:auto}.small-push-9{position:relative;left:75%;right:auto}.small-pull-9{position:relative;right:75%;left:auto}.small-push-10{position:relative;left:83.33333%;right:auto}.small-pull-10{position:relative;right:83.33333%;left:auto}.small-push-11{position:relative;left:91.66667%;right:auto}.small-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375rem;padding-right:0.9375rem;float:left}.small-1{width:8.33333%}.small-2{width:16.66667%}.small-3{width:25%}.small-4{width:33.33333%}.small-5{width:41.66667%}.small-6{width:50%}.small-7{width:58.33333%}.small-8{width:66.66667%}.small-9{width:75%}.small-10{width:83.33333%}.small-11{width:91.66667%}.small-12{width:100%}.small-offset-0{margin-left:0 !important}.small-offset-1{margin-left:8.33333% !important}.small-offset-2{margin-left:16.66667% !important}.small-offset-3{margin-left:25% !important}.small-offset-4{margin-left:33.33333% !important}.small-offset-5{margin-left:41.66667% !important}.small-offset-6{margin-left:50% !important}.small-offset-7{margin-left:58.33333% !important}.small-offset-8{margin-left:66.66667% !important}.small-offset-9{margin-left:75% !important}.small-offset-10{margin-left:83.33333% !important}.small-offset-11{margin-left:91.66667% !important}.small-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.small-centered,.columns.small-centered{margin-left:auto;margin-right:auto;float:none}.column.small-uncentered,.columns.small-uncentered{float:left;margin-left:0;margin-right:0}.column.small-centered:last-child,.columns.small-centered:last-child{float:none}.column.small-uncentered:last-child,.columns.small-uncentered:last-child{float:left}.column.small-uncentered.opposite,.columns.small-uncentered.opposite{float:right}.row.small-collapse>.column,.row.small-collapse>.columns{padding-left:0;padding-right:0}.row.small-collapse .row{margin-left:0;margin-right:0}.row.small-uncollapse>.column,.row.small-uncollapse>.columns{padding-left:0.9375rem;padding-right:0.9375rem;float:left}}@media only screen and (min-width: 40.0625em){.medium-push-0{position:relative;left:0;right:auto}.medium-pull-0{position:relative;right:0;left:auto}.medium-push-1{position:relative;left:8.33333%;right:auto}.medium-pull-1{position:relative;right:8.33333%;left:auto}.medium-push-2{position:relative;left:16.66667%;right:auto}.medium-pull-2{position:relative;right:16.66667%;left:auto}.medium-push-3{position:relative;left:25%;right:auto}.medium-pull-3{position:relative;right:25%;left:auto}.medium-push-4{position:relative;left:33.33333%;right:auto}.medium-pull-4{position:relative;right:33.33333%;left:auto}.medium-push-5{position:relative;left:41.66667%;right:auto}.medium-pull-5{position:relative;right:41.66667%;left:auto}.medium-push-6{position:relative;left:50%;right:auto}.medium-pull-6{position:relative;right:50%;left:auto}.medium-push-7{position:relative;left:58.33333%;right:auto}.medium-pull-7{position:relative;right:58.33333%;left:auto}.medium-push-8{position:relative;left:66.66667%;right:auto}.medium-pull-8{position:relative;right:66.66667%;left:auto}.medium-push-9{position:relative;left:75%;right:auto}.medium-pull-9{position:relative;right:75%;left:auto}.medium-push-10{position:relative;left:83.33333%;right:auto}.medium-pull-10{position:relative;right:83.33333%;left:auto}.medium-push-11{position:relative;left:91.66667%;right:auto}.medium-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375rem;padding-right:0.9375rem;float:left}.medium-1{width:8.33333%}.medium-2{width:16.66667%}.medium-3{width:25%}.medium-4{width:33.33333%}.medium-5{width:41.66667%}.medium-6{width:50%}.medium-7{width:58.33333%}.medium-8{width:66.66667%}.medium-9{width:75%}.medium-10{width:83.33333%}.medium-11{width:91.66667%}.medium-12{width:100%}.medium-offset-0{margin-left:0 !important}.medium-offset-1{margin-left:8.33333% !important}.medium-offset-2{margin-left:16.66667% !important}.medium-offset-3{margin-left:25% !important}.medium-offset-4{margin-left:33.33333% !important}.medium-offset-5{margin-left:41.66667% !important}.medium-offset-6{margin-left:50% !important}.medium-offset-7{margin-left:58.33333% !important}.medium-offset-8{margin-left:66.66667% !important}.medium-offset-9{margin-left:75% !important}.medium-offset-10{margin-left:83.33333% !important}.medium-offset-11{margin-left:91.66667% !important}.medium-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.medium-centered,.columns.medium-centered{margin-left:auto;margin-right:auto;float:none}.column.medium-uncentered,.columns.medium-uncentered{float:left;margin-left:0;margin-right:0}.column.medium-centered:last-child,.columns.medium-centered:last-child{float:none}.column.medium-uncentered:last-child,.columns.medium-uncentered:last-child{float:left}.column.medium-uncentered.opposite,.columns.medium-uncentered.opposite{float:right}.row.medium-collapse>.column,.row.medium-collapse>.columns{padding-left:0;padding-right:0}.row.medium-collapse .row{margin-left:0;margin-right:0}.row.medium-uncollapse>.column,.row.medium-uncollapse>.columns{padding-left:0.9375rem;padding-right:0.9375rem;float:left}.push-0{position:relative;left:0;right:auto}.pull-0{position:relative;right:0;left:auto}.push-1{position:relative;left:8.33333%;right:auto}.pull-1{position:relative;right:8.33333%;left:auto}.push-2{position:relative;left:16.66667%;right:auto}.pull-2{position:relative;right:16.66667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333%;right:auto}.pull-4{position:relative;right:33.33333%;left:auto}.push-5{position:relative;left:41.66667%;right:auto}.pull-5{position:relative;right:41.66667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333%;right:auto}.pull-7{position:relative;right:58.33333%;left:auto}.push-8{position:relative;left:66.66667%;right:auto}.pull-8{position:relative;right:66.66667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333%;right:auto}.pull-10{position:relative;right:83.33333%;left:auto}.push-11{position:relative;left:91.66667%;right:auto}.pull-11{position:relative;right:91.66667%;left:auto}}@media only screen and (min-width: 64.0625em){.large-push-0{position:relative;left:0;right:auto}.large-pull-0{position:relative;right:0;left:auto}.large-push-1{position:relative;left:8.33333%;right:auto}.large-pull-1{position:relative;right:8.33333%;left:auto}.large-push-2{position:relative;left:16.66667%;right:auto}.large-pull-2{position:relative;right:16.66667%;left:auto}.large-push-3{position:relative;left:25%;right:auto}.large-pull-3{position:relative;right:25%;left:auto}.large-push-4{position:relative;left:33.33333%;right:auto}.large-pull-4{position:relative;right:33.33333%;left:auto}.large-push-5{position:relative;left:41.66667%;right:auto}.large-pull-5{position:relative;right:41.66667%;left:auto}.large-push-6{position:relative;left:50%;right:auto}.large-pull-6{position:relative;right:50%;left:auto}.large-push-7{position:relative;left:58.33333%;right:auto}.large-pull-7{position:relative;right:58.33333%;left:auto}.large-push-8{position:relative;left:66.66667%;right:auto}.large-pull-8{position:relative;right:66.66667%;left:auto}.large-push-9{position:relative;left:75%;right:auto}.large-pull-9{position:relative;right:75%;left:auto}.large-push-10{position:relative;left:83.33333%;right:auto}.large-pull-10{position:relative;right:83.33333%;left:auto}.large-push-11{position:relative;left:91.66667%;right:auto}.large-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375rem;padding-right:0.9375rem;float:left}.large-1{width:8.33333%}.large-2{width:16.66667%}.large-3{width:25%}.large-4{width:33.33333%}.large-5{width:41.66667%}.large-6{width:50%}.large-7{width:58.33333%}.large-8{width:66.66667%}.large-9{width:75%}.large-10{width:83.33333%}.large-11{width:91.66667%}.large-12{width:100%}.large-offset-0{margin-left:0 !important}.large-offset-1{margin-left:8.33333% !important}.large-offset-2{margin-left:16.66667% !important}.large-offset-3{margin-left:25% !important}.large-offset-4{margin-left:33.33333% !important}.large-offset-5{margin-left:41.66667% !important}.large-offset-6{margin-left:50% !important}.large-offset-7{margin-left:58.33333% !important}.large-offset-8{margin-left:66.66667% !important}.large-offset-9{margin-left:75% !important}.large-offset-10{margin-left:83.33333% !important}.large-offset-11{margin-left:91.66667% !important}.large-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.large-centered,.columns.large-centered{margin-left:auto;margin-right:auto;float:none}.column.large-uncentered,.columns.large-uncentered{float:left;margin-left:0;margin-right:0}.column.large-centered:last-child,.columns.large-centered:last-child{float:none}.column.large-uncentered:last-child,.columns.large-uncentered:last-child{float:left}.column.large-uncentered.opposite,.columns.large-uncentered.opposite{float:right}.row.large-collapse>.column,.row.large-collapse>.columns{padding-left:0;padding-right:0}.row.large-collapse .row{margin-left:0;margin-right:0}.row.large-uncollapse>.column,.row.large-uncollapse>.columns{padding-left:0.9375rem;padding-right:0.9375rem;float:left}.push-0{position:relative;left:0;right:auto}.pull-0{position:relative;right:0;left:auto}.push-1{position:relative;left:8.33333%;right:auto}.pull-1{position:relative;right:8.33333%;left:auto}.push-2{position:relative;left:16.66667%;right:auto}.pull-2{position:relative;right:16.66667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333%;right:auto}.pull-4{position:relative;right:33.33333%;left:auto}.push-5{position:relative;left:41.66667%;right:auto}.pull-5{position:relative;right:41.66667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333%;right:auto}.pull-7{position:relative;right:58.33333%;left:auto}.push-8{position:relative;left:66.66667%;right:auto}.pull-8{position:relative;right:66.66667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333%;right:auto}.pull-10{position:relative;right:83.33333%;left:auto}.push-11{position:relative;left:91.66667%;right:auto}.pull-11{position:relative;right:91.66667%;left:auto}}button,.button{-webkit-appearance:none;-moz-appearance:none;border-radius:0;border-style:solid;border-width:0;cursor:pointer;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal;line-height:normal;margin:0 0 1.25rem;position:relative;text-align:center;text-decoration:none;display:inline-block;padding:1rem 2rem 1.0625rem 2rem;font-size:1rem;background-color:#008CBA;border-color:#007095;color:#fff;transition:background-color 300ms ease-out}button:hover,button:focus,.button:hover,.button:focus{background-color:#007095}button:hover,button:focus,.button:hover,.button:focus{color:#fff}button.secondary,.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{background-color:#b9b9b9}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{color:#333}button.success,.button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{background-color:#368a55}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{color:#fff}button.alert,.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{background-color:#cf2a0e}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{color:#fff}button.warning,.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{background-color:#cf6e0e}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{color:#fff}button.info,.button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{background-color:#61b6d9}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{color:#fff}button.large,.button.large{padding:1.125rem 2.25rem 1.1875rem 2.25rem;font-size:1.25rem}button.small,.button.small{padding:0.875rem 1.75rem 0.9375rem 1.75rem;font-size:0.8125rem}button.tiny,.button.tiny{padding:0.625rem 1.25rem 0.6875rem 1.25rem;font-size:0.6875rem}button.expand,.button.expand{padding-left:0;padding-right:0;width:100%}button.left-align,.button.left-align{text-align:left;text-indent:0.75rem}button.right-align,.button.right-align{text-align:right;padding-right:0.75rem}button.radius,.button.radius{border-radius:3px}button.round,.button.round{border-radius:1000px}button.disabled,button[disabled],.button.disabled,.button[disabled]{background-color:#008CBA;border-color:#007095;color:#fff;box-shadow:none;cursor:default;opacity:0.7}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#007095}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{color:#fff}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#008CBA}button.disabled.secondary,button[disabled].secondary,.button.disabled.secondary,.button[disabled].secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333;box-shadow:none;cursor:default;opacity:0.7}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#b9b9b9}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{color:#333}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#e7e7e7}button.disabled.success,button[disabled].success,.button.disabled.success,.button[disabled].success{background-color:#43AC6A;border-color:#368a55;color:#fff;box-shadow:none;cursor:default;opacity:0.7}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#368a55}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{color:#fff}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#43AC6A}button.disabled.alert,button[disabled].alert,.button.disabled.alert,.button[disabled].alert{background-color:#f04124;border-color:#cf2a0e;color:#fff;box-shadow:none;cursor:default;opacity:0.7}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#cf2a0e}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{color:#fff}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#f04124}button.disabled.warning,button[disabled].warning,.button.disabled.warning,.button[disabled].warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff;box-shadow:none;cursor:default;opacity:0.7}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#cf6e0e}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{color:#fff}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#f08a24}button.disabled.info,button[disabled].info,.button.disabled.info,.button[disabled].info{background-color:#a0d3e8;border-color:#61b6d9;color:#333;box-shadow:none;cursor:default;opacity:0.7}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#61b6d9}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{color:#fff}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#a0d3e8}button::-moz-focus-inner{border:0;padding:0}@media only screen and (min-width: 40.0625em){button,.button{display:inline-block}}form{margin:0 0 1rem}form .row .row{margin:0 -0.5rem}form .row .row .column,form .row .row .columns{padding:0 0.5rem}form .row .row.collapse{margin:0}form .row .row.collapse .column,form .row .row.collapse .columns{padding:0}form .row .row.collapse input{-webkit-border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-bottom-right-radius:0;border-top-right-radius:0}form .row input.column,form .row input.columns,form .row textarea.column,form .row textarea.columns{padding-left:0.5rem}label{color:#4d4d4d;cursor:pointer;display:block;font-size:0.875rem;font-weight:normal;line-height:1.5;margin-bottom:0}label.right{float:none !important;text-align:right}label.inline{margin:0 0 1rem 0;padding:0.5625rem 0}label small{text-transform:capitalize;color:#676767}.prefix,.postfix{border-style:solid;border-width:1px;display:block;font-size:0.875rem;height:2.3125rem;line-height:2.3125rem;overflow:visible;padding-bottom:0;padding-top:0;position:relative;text-align:center;width:100%;z-index:2}.postfix.button{border-color:true}.prefix.button{border:none;padding-left:0;padding-right:0;padding-bottom:0;padding-top:0;text-align:center}.prefix.button.radius{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.postfix.button.radius{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.prefix.button.round{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.postfix.button.round{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}span.prefix,label.prefix{background:#f2f2f2;border-right:none;color:#333;border-color:#ccc}span.postfix,label.postfix{background:#f2f2f2;color:#333;border-color:#ccc}input[type="text"],input[type="password"],input[type="date"],input[type="datetime"],input[type="datetime-local"],input[type="month"],input[type="week"],input[type="email"],input[type="number"],input[type="search"],input[type="tel"],input[type="time"],input[type="url"],input[type="color"],textarea{-webkit-appearance:none;-moz-appearance:none;border-radius:0;background-color:#fff;border-style:solid;border-width:1px;border-color:#ccc;box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);color:rgba(0,0,0,0.75);display:block;font-family:inherit;font-size:0.875rem;height:2.3125rem;margin:0 0 1rem 0;padding:0.5rem;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:border-color 0.15s linear,background 0.15s linear;-moz-transition:border-color 0.15s linear,background 0.15s linear;-ms-transition:border-color 0.15s linear,background 0.15s linear;-o-transition:border-color 0.15s linear,background 0.15s linear;transition:border-color 0.15s linear,background 0.15s linear}input[type="text"]:focus,input[type="password"]:focus,input[type="date"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="month"]:focus,input[type="week"]:focus,input[type="email"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="time"]:focus,input[type="url"]:focus,input[type="color"]:focus,textarea:focus{background:#fafafa;border-color:#999;outline:none}input[type="text"]:disabled,input[type="password"]:disabled,input[type="date"]:disabled,input[type="datetime"]:disabled,input[type="datetime-local"]:disabled,input[type="month"]:disabled,input[type="week"]:disabled,input[type="email"]:disabled,input[type="number"]:disabled,input[type="search"]:disabled,input[type="tel"]:disabled,input[type="time"]:disabled,input[type="url"]:disabled,input[type="color"]:disabled,textarea:disabled{background-color:#ddd;cursor:default}input[type="text"][disabled],input[type="text"][readonly],fieldset[disabled] input[type="text"],input[type="password"][disabled],input[type="password"][readonly],fieldset[disabled] input[type="password"],input[type="date"][disabled],input[type="date"][readonly],fieldset[disabled] input[type="date"],input[type="datetime"][disabled],input[type="datetime"][readonly],fieldset[disabled] input[type="datetime"],input[type="datetime-local"][disabled],input[type="datetime-local"][readonly],fieldset[disabled] input[type="datetime-local"],input[type="month"][disabled],input[type="month"][readonly],fieldset[disabled] input[type="month"],input[type="week"][disabled],input[type="week"][readonly],fieldset[disabled] input[type="week"],input[type="email"][disabled],input[type="email"][readonly],fieldset[disabled] input[type="email"],input[type="number"][disabled],input[type="number"][readonly],fieldset[disabled] input[type="number"],input[type="search"][disabled],input[type="search"][readonly],fieldset[disabled] input[type="search"],input[type="tel"][disabled],input[type="tel"][readonly],fieldset[disabled] input[type="tel"],input[type="time"][disabled],input[type="time"][readonly],fieldset[disabled] input[type="time"],input[type="url"][disabled],input[type="url"][readonly],fieldset[disabled] input[type="url"],input[type="color"][disabled],input[type="color"][readonly],fieldset[disabled] input[type="color"],textarea[disabled],textarea[readonly],fieldset[disabled] textarea{background-color:#ddd;cursor:default}input[type="text"].radius,input[type="password"].radius,input[type="date"].radius,input[type="datetime"].radius,input[type="datetime-local"].radius,input[type="month"].radius,input[type="week"].radius,input[type="email"].radius,input[type="number"].radius,input[type="search"].radius,input[type="tel"].radius,input[type="time"].radius,input[type="url"].radius,input[type="color"].radius,textarea.radius{border-radius:3px}form .row .prefix-radius.row.collapse input,form .row .prefix-radius.row.collapse textarea,form .row .prefix-radius.row.collapse select,form .row .prefix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-radius.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse input,form .row .postfix-radius.row.collapse textarea,form .row .postfix-radius.row.collapse select,form .row .postfix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-round.row.collapse input,form .row .prefix-round.row.collapse textarea,form .row .prefix-round.row.collapse select,form .row .prefix-round.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}form .row .prefix-round.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse input,form .row .postfix-round.row.collapse textarea,form .row .postfix-round.row.collapse select,form .row .postfix-round.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}input[type="submit"]{-webkit-appearance:none;-moz-appearance:none;border-radius:0}textarea[rows]{height:auto}textarea{max-width:100%}::-webkit-input-placeholder{color:#ccc}:-moz-placeholder{color:#ccc}::-moz-placeholder{color:#ccc}:-ms-input-placeholder{color:#ccc}select{-webkit-appearance:none !important;-moz-appearance:none !important;background-color:#FAFAFA;border-radius:0;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeD0iMTJweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzcHgiIHZpZXdCb3g9IjAgMCA2IDMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYgMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBvbHlnb24gcG9pbnRzPSI1Ljk5MiwwIDIuOTkyLDMgLTAuMDA4LDAgIi8+PC9zdmc+);background-position:100% center;background-repeat:no-repeat;border-style:solid;border-width:1px;border-color:#ccc;color:rgba(0,0,0,0.75);font-family:inherit;font-size:0.875rem;line-height:normal;padding:0.5rem;border-radius:0;height:2.3125rem}select::-ms-expand{display:none}select.radius{border-radius:3px}select:hover{background-color:#f3f3f3;border-color:#999}select:disabled{background-color:#ddd;cursor:default}select[multiple]{height:auto}input[type="file"],input[type="checkbox"],input[type="radio"],select{margin:0 0 1rem 0}input[type="checkbox"]+label,input[type="radio"]+label{display:inline-block;margin-left:0.5rem;margin-right:1rem;margin-bottom:0;vertical-align:baseline}input[type="file"]{width:100%}fieldset{border:1px solid #ddd;margin:1.125rem 0;padding:1.25rem}fieldset legend{background:#fff;font-weight:bold;margin-left:-0.1875rem;margin:0;padding:0 0.1875rem}[data-abide] .error small.error,[data-abide] .error span.error,[data-abide] span.error,[data-abide] small.error{display:block;font-size:0.75rem;font-style:italic;font-weight:normal;margin-bottom:1rem;margin-top:-1px;padding:0.375rem 0.5625rem 0.5625rem;background:#f04124;color:#fff}[data-abide] span.error,[data-abide] small.error{display:none}span.error,small.error{display:block;font-size:0.75rem;font-style:italic;font-weight:normal;margin-bottom:1rem;margin-top:-1px;padding:0.375rem 0.5625rem 0.5625rem;background:#f04124;color:#fff}.error input,.error textarea,.error select{margin-bottom:0}.error input[type="checkbox"],.error input[type="radio"]{margin-bottom:1rem}.error label,.error label.error{color:#f04124}.error small.error{display:block;font-size:0.75rem;font-style:italic;font-weight:normal;margin-bottom:1rem;margin-top:-1px;padding:0.375rem 0.5625rem 0.5625rem;background:#f04124;color:#fff}.error>label>small{background:transparent;color:#676767;display:inline;font-size:60%;font-style:normal;margin:0;padding:0;text-transform:capitalize}.error span.error-message{display:block}input.error,textarea.error,select.error{margin-bottom:0}label.error{color:#f04124}meta.foundation-mq-topbar{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}.contain-to-grid{width:100%;background:#333}.contain-to-grid .top-bar{margin-bottom:0}.fixed{position:fixed;top:0;width:100%;z-index:99;left:0}.fixed.expanded:not(.top-bar){height:auto;max-height:100%;overflow-y:auto;width:100%}.fixed.expanded:not(.top-bar) .title-area{position:fixed;width:100%;z-index:99}.fixed.expanded:not(.top-bar) .top-bar-section{margin-top:2.8125rem;z-index:98}.top-bar{background:#333;height:2.8125rem;line-height:2.8125rem;margin-bottom:0;overflow:hidden;position:relative}.top-bar ul{list-style:none;margin-bottom:0}.top-bar .row{max-width:none}.top-bar form,.top-bar input,.top-bar select{margin-bottom:0}.top-bar input,.top-bar select{font-size:0.75rem;height:1.75rem;padding-bottom:.35rem;padding-top:.35rem}.top-bar .button,.top-bar button{font-size:0.75rem;margin-bottom:0;padding-bottom:0.4125rem;padding-top:0.4125rem}@media only screen and (max-width: 40em){.top-bar .button,.top-bar button{position:relative;top:-1px}}.top-bar .title-area{margin:0;position:relative}.top-bar .name{font-size:16px;height:2.8125rem;margin:0}.top-bar .name h1,.top-bar .name h2,.top-bar .name h3,.top-bar .name h4,.top-bar .name p,.top-bar .name span{font-size:1.0625rem;line-height:2.8125rem;margin:0}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name p a,.top-bar .name span a{color:#fff;display:block;font-weight:normal;padding:0 0.9375rem;width:75%}.top-bar .toggle-topbar{position:absolute;right:0;top:0}.top-bar .toggle-topbar a{color:#fff;display:block;font-size:0.8125rem;font-weight:bold;height:2.8125rem;line-height:2.8125rem;padding:0 0.9375rem;position:relative;text-transform:uppercase}.top-bar .toggle-topbar.menu-icon{margin-top:-16px;top:50%}.top-bar .toggle-topbar.menu-icon a{color:#fff;height:34px;line-height:33px;padding:0 2.5rem 0 0.9375rem;position:relative}.top-bar .toggle-topbar.menu-icon a span::after{content:"";display:block;height:0;position:absolute;margin-top:-8px;top:50%;right:0.9375rem;box-shadow:0 0 0 1px #fff,0 7px 0 1px #fff,0 14px 0 1px #fff;width:16px}.top-bar .toggle-topbar.menu-icon a span:hover:after{box-shadow:0 0 0 1px "",0 7px 0 1px "",0 14px 0 1px ""}.top-bar.expanded{background:transparent;height:auto}.top-bar.expanded .title-area{background:#333}.top-bar.expanded .toggle-topbar a{color:#888}.top-bar.expanded .toggle-topbar a span::after{box-shadow:0 0 0 1px #888,0 7px 0 1px #888,0 14px 0 1px #888}@media screen and (-webkit-min-device-pixel-ratio: 0){.top-bar.expanded .top-bar-section .has-dropdown.moved>.dropdown,.top-bar.expanded .top-bar-section .dropdown{clip:initial}.top-bar.expanded .top-bar-section .has-dropdown:not(.moved)>ul{padding:0}}.top-bar-section{left:0;position:relative;width:auto;transition:left 300ms ease-out}.top-bar-section ul{display:block;font-size:16px;height:auto;margin:0;padding:0;width:100%}.top-bar-section .divider,.top-bar-section [role="separator"]{border-top:solid 1px #1a1a1a;clear:both;height:1px;width:100%}.top-bar-section ul li{background:#333}.top-bar-section ul li>a{color:#fff;display:block;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:0.8125rem;font-weight:normal;padding-left:0.9375rem;padding:12px 0 12px 0.9375rem;text-transform:none;width:100%}.top-bar-section ul li>a.button{font-size:0.8125rem;padding-left:0.9375rem;padding-right:0.9375rem;background-color:#008CBA;border-color:#007095;color:#fff}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{background-color:#007095}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{color:#fff}.top-bar-section ul li>a.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{color:#333}.top-bar-section ul li>a.button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{background-color:#368a55}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{color:#fff}.top-bar-section ul li>a.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{color:#fff}.top-bar-section ul li>a.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{color:#fff}.top-bar-section ul li>a.button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}.top-bar-section ul li>a.button.info:hover,.top-bar-section ul li>a.button.info:focus{background-color:#61b6d9}.top-bar-section ul li>a.button.info:hover,.top-bar-section ul li>a.button.info:focus{color:#fff}.top-bar-section ul li>button{font-size:0.8125rem;padding-left:0.9375rem;padding-right:0.9375rem;background-color:#008CBA;border-color:#007095;color:#fff}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{background-color:#007095}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{color:#fff}.top-bar-section ul li>button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{color:#333}.top-bar-section ul li>button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{background-color:#368a55}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{color:#fff}.top-bar-section ul li>button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{color:#fff}.top-bar-section ul li>button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{color:#fff}.top-bar-section ul li>button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}.top-bar-section ul li>button.info:hover,.top-bar-section ul li>button.info:focus{background-color:#61b6d9}.top-bar-section ul li>button.info:hover,.top-bar-section ul li>button.info:focus{color:#fff}.top-bar-section ul li:hover:not(.has-form)>a{background-color:#555;color:#fff;background:#222}.top-bar-section ul li.active>a{background:#008CBA;color:#fff}.top-bar-section ul li.active>a:hover{background:#0078a0;color:#fff}.top-bar-section .has-form{padding:0.9375rem}.top-bar-section .has-dropdown{position:relative}.top-bar-section .has-dropdown>a:after{border:inset 5px;content:"";display:block;height:0;width:0;border-color:transparent transparent transparent rgba(255,255,255,0.4);border-left-style:solid;margin-right:0.9375rem;margin-top:-4.5px;position:absolute;top:50%;right:0}.top-bar-section .has-dropdown.moved{position:static}.top-bar-section .has-dropdown.moved>.dropdown{position:static !important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute !important;width:100%}.top-bar-section .has-dropdown.moved>a:after{display:none}.top-bar-section .dropdown{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px;display:block;padding:0;position:absolute;top:0;z-index:99;left:100%}.top-bar-section .dropdown li{height:auto;width:100%}.top-bar-section .dropdown li a{font-weight:normal;padding:8px 0.9375rem}.top-bar-section .dropdown li a.parent-link{font-weight:normal}.top-bar-section .dropdown li.title h5,.top-bar-section .dropdown li.parent-link{margin-bottom:0;margin-top:0;font-size:1.125rem}.top-bar-section .dropdown li.title h5 a,.top-bar-section .dropdown li.parent-link a{color:#fff;display:block}.top-bar-section .dropdown li.title h5 a:hover,.top-bar-section .dropdown li.parent-link a:hover{background:none}.top-bar-section .dropdown li.has-form{padding:8px 0.9375rem}.top-bar-section .dropdown li .button,.top-bar-section .dropdown li button{top:auto}.top-bar-section .dropdown label{color:#777;font-size:0.625rem;font-weight:bold;margin-bottom:0;padding:8px 0.9375rem 2px;text-transform:uppercase}.js-generated{display:block}@media only screen and (min-width: 40.0625em){.top-bar{background:#333;overflow:visible}.top-bar:before,.top-bar:after{content:" ";display:table}.top-bar:after{clear:both}.top-bar .toggle-topbar{display:none}.top-bar .title-area{float:left}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name h5 a,.top-bar .name h6 a{width:auto}.top-bar input,.top-bar select,.top-bar .button,.top-bar button{font-size:0.875rem;height:1.75rem;position:relative;top:0.53125rem}.top-bar.expanded{background:#333}.contain-to-grid .top-bar{margin-bottom:0;margin:0 auto;max-width:62.5rem}.top-bar-section{transition:none 0 0;left:0 !important}.top-bar-section ul{display:inline;height:auto !important;width:auto}.top-bar-section ul li{float:left}.top-bar-section ul li .js-generated{display:none}.top-bar-section li.hover>a:not(.button){background-color:#555;background:#222;color:#fff}.top-bar-section li:not(.has-form) a:not(.button){background:#333;line-height:2.8125rem;padding:0 0.9375rem}.top-bar-section li:not(.has-form) a:not(.button):hover{background-color:#555;background:#222}.top-bar-section li.active:not(.has-form) a:not(.button){background:#008CBA;color:#fff;line-height:2.8125rem;padding:0 0.9375rem}.top-bar-section li.active:not(.has-form) a:not(.button):hover{background:#0078a0;color:#fff}.top-bar-section .has-dropdown>a{padding-right:2.1875rem !important}.top-bar-section .has-dropdown>a:after{border:inset 5px;content:"";display:block;height:0;width:0;border-color:rgba(255,255,255,0.4) transparent transparent transparent;border-top-style:solid;margin-top:-2.5px;top:1.40625rem}.top-bar-section .has-dropdown.moved{position:relative}.top-bar-section .has-dropdown.moved>.dropdown{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px;display:block}.top-bar-section .has-dropdown.hover>.dropdown,.top-bar-section .has-dropdown.not-click:hover>.dropdown{position:static !important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute !important}.top-bar-section .has-dropdown>a:focus+.dropdown{position:static !important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute !important}.top-bar-section .has-dropdown .dropdown li.has-dropdown>a:after{border:none;content:"\00bb";top:0.1875rem;right:5px}.top-bar-section .dropdown{left:0;background:transparent;min-width:100%;top:auto}.top-bar-section .dropdown li a{background:#333;color:#fff;line-height:2.8125rem;padding:12px 0.9375rem;white-space:nowrap}.top-bar-section .dropdown li:not(.has-form):not(.active)>a:not(.button){background:#333;color:#fff}.top-bar-section .dropdown li:not(.has-form):not(.active):hover>a:not(.button){background-color:#555;color:#fff;background:#222}.top-bar-section .dropdown li label{background:#333;white-space:nowrap}.top-bar-section .dropdown li .dropdown{left:100%;top:0}.top-bar-section>ul>.divider,.top-bar-section>ul>[role="separator"]{border-right:solid 1px #4e4e4e;border-bottom:none;border-top:none;clear:none;height:2.8125rem;width:0}.top-bar-section .has-form{background:#333;height:2.8125rem;padding:0 0.9375rem}.top-bar-section .right li .dropdown{left:auto;right:0}.top-bar-section .right li .dropdown li .dropdown{right:100%}.top-bar-section .left li .dropdown{right:auto;left:0}.top-bar-section .left li .dropdown li .dropdown{left:100%}.no-js .top-bar-section ul li:hover>a{background-color:#555;background:#222;color:#fff}.no-js .top-bar-section ul li:active>a{background:#008CBA;color:#fff}.no-js .top-bar-section .has-dropdown:hover>.dropdown{position:static !important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute !important}.no-js .top-bar-section .has-dropdown>a:focus+.dropdown{position:static !important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute !important}}.breadcrumbs{border-style:solid;border-width:1px;display:block;list-style:none;margin-left:0;overflow:hidden;padding:0.5625rem 0.875rem 0.5625rem;background-color:#f4f4f4;border-color:#dcdcdc;border-radius:3px}.breadcrumbs>*{color:#008CBA;float:left;font-size:0.6875rem;line-height:0.6875rem;margin:0;text-transform:uppercase}.breadcrumbs>*:hover a,.breadcrumbs>*:focus a{text-decoration:underline}.breadcrumbs>* a{color:#008CBA}.breadcrumbs>*.current{color:#333;cursor:default}.breadcrumbs>*.current a{color:#333;cursor:default}.breadcrumbs>*.current:hover,.breadcrumbs>*.current:hover a,.breadcrumbs>*.current:focus,.breadcrumbs>*.current:focus a{text-decoration:none}.breadcrumbs>*.unavailable{color:#999}.breadcrumbs>*.unavailable a{color:#999}.breadcrumbs>*.unavailable:hover,.breadcrumbs>*.unavailable:hover a,.breadcrumbs>*.unavailable:focus,.breadcrumbs>*.unavailable a:focus{color:#999;cursor:not-allowed;text-decoration:none}.breadcrumbs>*:before{color:#aaa;content:"/";margin:0 0.75rem;position:relative;top:1px}.breadcrumbs>*:first-child:before{content:" ";margin:0}[aria-label="breadcrumbs"] [aria-hidden="true"]:after{content:"/"}.alert-box{border-style:solid;border-width:1px;display:block;font-size:0.8125rem;font-weight:normal;margin-bottom:1.25rem;padding:0.875rem 1.5rem 0.875rem 0.875rem;position:relative;transition:opacity 300ms ease-out;background-color:#008CBA;border-color:#0078a0;color:#fff}.alert-box .close{right:0.25rem;background:inherit;color:#333;font-size:1.375rem;line-height:.9;margin-top:-0.6875rem;opacity:0.3;padding:0 6px 4px;position:absolute;top:50%}.alert-box .close:hover,.alert-box .close:focus{opacity:0.5}.alert-box.radius{border-radius:3px}.alert-box.round{border-radius:1000px}.alert-box.success{background-color:#43AC6A;border-color:#3a945b;color:#fff}.alert-box.alert{background-color:#f04124;border-color:#de2d0f;color:#fff}.alert-box.secondary{background-color:#e7e7e7;border-color:#c7c7c7;color:#4f4f4f}.alert-box.warning{background-color:#f08a24;border-color:#de770f;color:#fff}.alert-box.info{background-color:#a0d3e8;border-color:#74bfdd;color:#4f4f4f}.alert-box.alert-close{opacity:0}.inline-list{list-style:none;margin-left:-1.375rem;margin-right:0;margin:0 auto 1.0625rem auto;overflow:hidden;padding:0}.inline-list>li{display:block;float:left;list-style:none;margin-left:1.375rem}.inline-list>li>*{display:block}.button-group{list-style:none;margin:0;left:0}.button-group:before,.button-group:after{content:" ";display:table}.button-group:after{clear:both}.button-group.even-2 li{display:inline-block;margin:0 -2px;width:50%}.button-group.even-2 li>button,.button-group.even-2 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-2 li:first-child button,.button-group.even-2 li:first-child .button{border-left:0}.button-group.even-2 li button,.button-group.even-2 li .button{width:100%}.button-group.even-3 li{display:inline-block;margin:0 -2px;width:33.33333%}.button-group.even-3 li>button,.button-group.even-3 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-3 li:first-child button,.button-group.even-3 li:first-child .button{border-left:0}.button-group.even-3 li button,.button-group.even-3 li .button{width:100%}.button-group.even-4 li{display:inline-block;margin:0 -2px;width:25%}.button-group.even-4 li>button,.button-group.even-4 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-4 li:first-child button,.button-group.even-4 li:first-child .button{border-left:0}.button-group.even-4 li button,.button-group.even-4 li .button{width:100%}.button-group.even-5 li{display:inline-block;margin:0 -2px;width:20%}.button-group.even-5 li>button,.button-group.even-5 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-5 li:first-child button,.button-group.even-5 li:first-child .button{border-left:0}.button-group.even-5 li button,.button-group.even-5 li .button{width:100%}.button-group.even-6 li{display:inline-block;margin:0 -2px;width:16.66667%}.button-group.even-6 li>button,.button-group.even-6 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-6 li:first-child button,.button-group.even-6 li:first-child .button{border-left:0}.button-group.even-6 li button,.button-group.even-6 li .button{width:100%}.button-group.even-7 li{display:inline-block;margin:0 -2px;width:14.28571%}.button-group.even-7 li>button,.button-group.even-7 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-7 li:first-child button,.button-group.even-7 li:first-child .button{border-left:0}.button-group.even-7 li button,.button-group.even-7 li .button{width:100%}.button-group.even-8 li{display:inline-block;margin:0 -2px;width:12.5%}.button-group.even-8 li>button,.button-group.even-8 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-8 li:first-child button,.button-group.even-8 li:first-child .button{border-left:0}.button-group.even-8 li button,.button-group.even-8 li .button{width:100%}.button-group>li{display:inline-block;margin:0 -2px}.button-group>li>button,.button-group>li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group>li:first-child button,.button-group>li:first-child .button{border-left:0}.button-group.stack>li{display:block;margin:0;float:none}.button-group.stack>li>button,.button-group.stack>li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.stack>li:first-child button,.button-group.stack>li:first-child .button{border-left:0}.button-group.stack>li>button,.button-group.stack>li .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.stack>li>button{width:100%}.button-group.stack>li:first-child button,.button-group.stack>li:first-child .button{border-top:0}.button-group.stack-for-small>li{display:inline-block;margin:0 -2px}.button-group.stack-for-small>li>button,.button-group.stack-for-small>li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.stack-for-small>li:first-child button,.button-group.stack-for-small>li:first-child .button{border-left:0}@media only screen and (max-width: 40em){.button-group.stack-for-small>li{display:block;margin:0}.button-group.stack-for-small>li>button,.button-group.stack-for-small>li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.stack-for-small>li:first-child button,.button-group.stack-for-small>li:first-child .button{border-left:0}.button-group.stack-for-small>li>button,.button-group.stack-for-small>li .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.stack-for-small>li>button{width:100%}.button-group.stack-for-small>li:first-child button,.button-group.stack-for-small>li:first-child .button{border-top:0}}.button-group.radius>*{display:inline-block;margin:0 -2px}.button-group.radius>*>button,.button-group.radius>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.radius>*:first-child button,.button-group.radius>*:first-child .button{border-left:0}.button-group.radius>*,.button-group.radius>*>a,.button-group.radius>*>button,.button-group.radius>*>.button{border-radius:0}.button-group.radius>*:first-child,.button-group.radius>*:first-child>a,.button-group.radius>*:first-child>button,.button-group.radius>*:first-child>.button{-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.button-group.radius>*:last-child,.button-group.radius>*:last-child>a,.button-group.radius>*:last-child>button,.button-group.radius>*:last-child>.button{-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.button-group.radius.stack>*{display:block;margin:0}.button-group.radius.stack>*>button,.button-group.radius.stack>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.radius.stack>*:first-child button,.button-group.radius.stack>*:first-child .button{border-left:0}.button-group.radius.stack>*>button,.button-group.radius.stack>* .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.radius.stack>*>button{width:100%}.button-group.radius.stack>*:first-child button,.button-group.radius.stack>*:first-child .button{border-top:0}.button-group.radius.stack>*,.button-group.radius.stack>*>a,.button-group.radius.stack>*>button,.button-group.radius.stack>*>.button{border-radius:0}.button-group.radius.stack>*:first-child,.button-group.radius.stack>*:first-child>a,.button-group.radius.stack>*:first-child>button,.button-group.radius.stack>*:first-child>.button{-webkit-top-left-radius:3px;-webkit-top-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px}.button-group.radius.stack>*:last-child,.button-group.radius.stack>*:last-child>a,.button-group.radius.stack>*:last-child>button,.button-group.radius.stack>*:last-child>.button{-webkit-bottom-left-radius:3px;-webkit-bottom-right-radius:3px;border-bottom-left-radius:3px;border-bottom-right-radius:3px}@media only screen and (min-width: 40.0625em){.button-group.radius.stack-for-small>*{display:inline-block;margin:0 -2px}.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.radius.stack-for-small>*:first-child button,.button-group.radius.stack-for-small>*:first-child .button{border-left:0}.button-group.radius.stack-for-small>*,.button-group.radius.stack-for-small>*>a,.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>*>.button{border-radius:0}.button-group.radius.stack-for-small>*:first-child,.button-group.radius.stack-for-small>*:first-child>a,.button-group.radius.stack-for-small>*:first-child>button,.button-group.radius.stack-for-small>*:first-child>.button{-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.button-group.radius.stack-for-small>*:last-child,.button-group.radius.stack-for-small>*:last-child>a,.button-group.radius.stack-for-small>*:last-child>button,.button-group.radius.stack-for-small>*:last-child>.button{-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}}@media only screen and (max-width: 40em){.button-group.radius.stack-for-small>*{display:block;margin:0}.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.radius.stack-for-small>*:first-child button,.button-group.radius.stack-for-small>*:first-child .button{border-left:0}.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>* .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.radius.stack-for-small>*>button{width:100%}.button-group.radius.stack-for-small>*:first-child button,.button-group.radius.stack-for-small>*:first-child .button{border-top:0}.button-group.radius.stack-for-small>*,.button-group.radius.stack-for-small>*>a,.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>*>.button{border-radius:0}.button-group.radius.stack-for-small>*:first-child,.button-group.radius.stack-for-small>*:first-child>a,.button-group.radius.stack-for-small>*:first-child>button,.button-group.radius.stack-for-small>*:first-child>.button{-webkit-top-left-radius:3px;-webkit-top-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px}.button-group.radius.stack-for-small>*:last-child,.button-group.radius.stack-for-small>*:last-child>a,.button-group.radius.stack-for-small>*:last-child>button,.button-group.radius.stack-for-small>*:last-child>.button{-webkit-bottom-left-radius:3px;-webkit-bottom-right-radius:3px;border-bottom-left-radius:3px;border-bottom-right-radius:3px}}.button-group.round>*{display:inline-block;margin:0 -2px}.button-group.round>*>button,.button-group.round>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.round>*:first-child button,.button-group.round>*:first-child .button{border-left:0}.button-group.round>*,.button-group.round>*>a,.button-group.round>*>button,.button-group.round>*>.button{border-radius:0}.button-group.round>*:first-child,.button-group.round>*:first-child>a,.button-group.round>*:first-child>button,.button-group.round>*:first-child>.button{-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.button-group.round>*:last-child,.button-group.round>*:last-child>a,.button-group.round>*:last-child>button,.button-group.round>*:last-child>.button{-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}.button-group.round.stack>*{display:block;margin:0}.button-group.round.stack>*>button,.button-group.round.stack>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.round.stack>*:first-child button,.button-group.round.stack>*:first-child .button{border-left:0}.button-group.round.stack>*>button,.button-group.round.stack>* .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.round.stack>*>button{width:100%}.button-group.round.stack>*:first-child button,.button-group.round.stack>*:first-child .button{border-top:0}.button-group.round.stack>*,.button-group.round.stack>*>a,.button-group.round.stack>*>button,.button-group.round.stack>*>.button{border-radius:0}.button-group.round.stack>*:first-child,.button-group.round.stack>*:first-child>a,.button-group.round.stack>*:first-child>button,.button-group.round.stack>*:first-child>.button{-webkit-top-left-radius:1rem;-webkit-top-right-radius:1rem;border-top-left-radius:1rem;border-top-right-radius:1rem}.button-group.round.stack>*:last-child,.button-group.round.stack>*:last-child>a,.button-group.round.stack>*:last-child>button,.button-group.round.stack>*:last-child>.button{-webkit-bottom-left-radius:1rem;-webkit-bottom-right-radius:1rem;border-bottom-left-radius:1rem;border-bottom-right-radius:1rem}@media only screen and (min-width: 40.0625em){.button-group.round.stack-for-small>*{display:inline-block;margin:0 -2px}.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.round.stack-for-small>*:first-child button,.button-group.round.stack-for-small>*:first-child .button{border-left:0}.button-group.round.stack-for-small>*,.button-group.round.stack-for-small>*>a,.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>*>.button{border-radius:0}.button-group.round.stack-for-small>*:first-child,.button-group.round.stack-for-small>*:first-child>a,.button-group.round.stack-for-small>*:first-child>button,.button-group.round.stack-for-small>*:first-child>.button{-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.button-group.round.stack-for-small>*:last-child,.button-group.round.stack-for-small>*:last-child>a,.button-group.round.stack-for-small>*:last-child>button,.button-group.round.stack-for-small>*:last-child>.button{-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}}@media only screen and (max-width: 40em){.button-group.round.stack-for-small>*{display:block;margin:0}.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.round.stack-for-small>*:first-child button,.button-group.round.stack-for-small>*:first-child .button{border-left:0}.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>* .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.round.stack-for-small>*>button{width:100%}.button-group.round.stack-for-small>*:first-child button,.button-group.round.stack-for-small>*:first-child .button{border-top:0}.button-group.round.stack-for-small>*,.button-group.round.stack-for-small>*>a,.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>*>.button{border-radius:0}.button-group.round.stack-for-small>*:first-child,.button-group.round.stack-for-small>*:first-child>a,.button-group.round.stack-for-small>*:first-child>button,.button-group.round.stack-for-small>*:first-child>.button{-webkit-top-left-radius:1rem;-webkit-top-right-radius:1rem;border-top-left-radius:1rem;border-top-right-radius:1rem}.button-group.round.stack-for-small>*:last-child,.button-group.round.stack-for-small>*:last-child>a,.button-group.round.stack-for-small>*:last-child>button,.button-group.round.stack-for-small>*:last-child>.button{-webkit-bottom-left-radius:1rem;-webkit-bottom-right-radius:1rem;border-bottom-left-radius:1rem;border-bottom-right-radius:1rem}}.button-bar:before,.button-bar:after{content:" ";display:table}.button-bar:after{clear:both}.button-bar .button-group{float:left;margin-right:0.625rem}.button-bar .button-group div{overflow:hidden}.panel{border-style:solid;border-width:1px;border-color:#d8d8d8;margin-bottom:1.25rem;padding:1.25rem;background:#f2f2f2;color:#333}.panel>:first-child{margin-top:0}.panel>:last-child{margin-bottom:0}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6,.panel p,.panel li,.panel dl{color:#333}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6{line-height:1;margin-bottom:0.625rem}.panel h1.subheader,.panel h2.subheader,.panel h3.subheader,.panel h4.subheader,.panel h5.subheader,.panel h6.subheader{line-height:1.4}.panel.callout{border-style:solid;border-width:1px;border-color:#d8d8d8;margin-bottom:1.25rem;padding:1.25rem;background:#ecfaff;color:#333}.panel.callout>:first-child{margin-top:0}.panel.callout>:last-child{margin-bottom:0}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6,.panel.callout p,.panel.callout li,.panel.callout dl{color:#333}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6{line-height:1;margin-bottom:0.625rem}.panel.callout h1.subheader,.panel.callout h2.subheader,.panel.callout h3.subheader,.panel.callout h4.subheader,.panel.callout h5.subheader,.panel.callout h6.subheader{line-height:1.4}.panel.callout a:not(.button){color:#008CBA}.panel.callout a:not(.button):hover,.panel.callout a:not(.button):focus{color:#0078a0}.panel.radius{border-radius:3px}.dropdown.button,button.dropdown{position:relative;padding-right:3.5625rem}.dropdown.button::after,button.dropdown::after{border-color:#fff transparent transparent transparent;border-style:solid;content:"";display:block;height:0;position:absolute;top:50%;width:0}.dropdown.button::after,button.dropdown::after{border-width:0.375rem;right:1.40625rem;margin-top:-0.15625rem}.dropdown.button::after,button.dropdown::after{border-color:#fff transparent transparent transparent}.dropdown.button.tiny,button.dropdown.tiny{padding-right:2.625rem}.dropdown.button.tiny:after,button.dropdown.tiny:after{border-width:0.375rem;right:1.125rem;margin-top:-0.125rem}.dropdown.button.tiny::after,button.dropdown.tiny::after{border-color:#fff transparent transparent transparent}.dropdown.button.small,button.dropdown.small{padding-right:3.0625rem}.dropdown.button.small::after,button.dropdown.small::after{border-width:0.4375rem;right:1.3125rem;margin-top:-0.15625rem}.dropdown.button.small::after,button.dropdown.small::after{border-color:#fff transparent transparent transparent}.dropdown.button.large,button.dropdown.large{padding-right:3.625rem}.dropdown.button.large::after,button.dropdown.large::after{border-width:0.3125rem;right:1.71875rem;margin-top:-0.15625rem}.dropdown.button.large::after,button.dropdown.large::after{border-color:#fff transparent transparent transparent}.dropdown.button.secondary:after,button.dropdown.secondary:after{border-color:#333 transparent transparent transparent}.th{border:solid 4px #fff;box-shadow:0 0 0 1px rgba(0,0,0,0.2);display:inline-block;line-height:0;max-width:100%;transition:all 200ms ease-out}.th:hover,.th:focus{box-shadow:0 0 6px 1px rgba(0,140,186,0.5)}.th.radius{border-radius:3px}.pricing-table{border:solid 1px #ddd;margin-left:0;margin-bottom:1.25rem}.pricing-table *{list-style:none;line-height:1}.pricing-table .title{background-color:#333;color:#eee;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:1rem;font-weight:normal;padding:0.9375rem 1.25rem;text-align:center}.pricing-table .price{background-color:#F6F6F6;color:#333;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:2rem;font-weight:normal;padding:0.9375rem 1.25rem;text-align:center}.pricing-table .description{background-color:#fff;border-bottom:dotted 1px #ddd;color:#777;font-size:0.75rem;font-weight:normal;line-height:1.4;padding:0.9375rem;text-align:center}.pricing-table .bullet-item{background-color:#fff;border-bottom:dotted 1px #ddd;color:#333;font-size:0.875rem;font-weight:normal;padding:0.9375rem;text-align:center}.pricing-table .cta-button{background-color:#fff;padding:1.25rem 1.25rem 0;text-align:center}@-webkit-keyframes rotate{from{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{from{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}.slideshow-wrapper{position:relative}.slideshow-wrapper ul{list-style-type:none;margin:0}.slideshow-wrapper ul li,.slideshow-wrapper ul li .orbit-caption{display:none}.slideshow-wrapper ul li:first-child{display:block}.slideshow-wrapper .orbit-container{background-color:transparent}.slideshow-wrapper .orbit-container li{display:block}.slideshow-wrapper .orbit-container li .orbit-caption{display:block}.slideshow-wrapper .orbit-container .orbit-bullets li{display:inline-block}.slideshow-wrapper .preloader{border-radius:1000px;animation-duration:1.5s;animation-iteration-count:infinite;animation-name:rotate;animation-timing-function:linear;border-color:#555 #fff;border:solid 3px;display:block;height:40px;left:50%;margin-left:-20px;margin-top:-20px;position:absolute;top:50%;width:40px}.orbit-container{background:none;overflow:hidden;position:relative;width:100%}.orbit-container .orbit-slides-container{list-style:none;margin:0;padding:0;position:relative;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}.orbit-container .orbit-slides-container img{display:block;max-width:100%}.orbit-container .orbit-slides-container>*{position:absolute;top:0;width:100%;margin-left:100%}.orbit-container .orbit-slides-container>*:first-child{margin-left:0}.orbit-container .orbit-slides-container>* .orbit-caption{bottom:0;position:absolute;background-color:rgba(51,51,51,0.8);color:#fff;font-size:0.875rem;padding:0.625rem 0.875rem;width:100%}.orbit-container .orbit-slide-number{left:10px;background:transparent;color:#fff;font-size:12px;position:absolute;top:10px;z-index:10}.orbit-container .orbit-slide-number span{font-weight:700;padding:0.3125rem}.orbit-container .orbit-timer{position:absolute;top:12px;right:10px;height:6px;width:100px;z-index:10}.orbit-container .orbit-timer .orbit-progress{height:3px;background-color:rgba(255,255,255,0.3);display:block;width:0;position:relative;right:20px;top:5px}.orbit-container .orbit-timer>span{border:solid 4px #fff;border-bottom:none;border-top:none;display:none;height:14px;position:absolute;top:0;width:11px;right:0}.orbit-container .orbit-timer.paused>span{top:0;width:11px;height:14px;border:inset 8px;border-left-style:solid;border-color:transparent;border-left-color:#fff;right:-4px}.orbit-container .orbit-timer.paused>span.dark{border-left-color:#333}.orbit-container:hover .orbit-timer>span{display:block}.orbit-container .orbit-prev,.orbit-container .orbit-next{background-color:transparent;color:white;height:60px;line-height:50px;margin-top:-25px;position:absolute;text-indent:-9999px !important;top:45%;width:36px;z-index:10}.orbit-container .orbit-prev:hover,.orbit-container .orbit-next:hover{background-color:rgba(0,0,0,0.3)}.orbit-container .orbit-prev>span,.orbit-container .orbit-next>span{border:inset 10px;display:block;height:0;margin-top:-10px;position:absolute;top:50%;width:0}.orbit-container .orbit-prev{left:0}.orbit-container .orbit-prev>span{border-right-style:solid;border-color:transparent;border-right-color:#fff}.orbit-container .orbit-prev:hover>span{border-right-color:#fff}.orbit-container .orbit-next{right:0}.orbit-container .orbit-next>span{border-color:transparent;border-left-style:solid;border-left-color:#fff;left:50%;margin-left:-4px}.orbit-container .orbit-next:hover>span{border-left-color:#fff}.orbit-bullets-container{text-align:center}.orbit-bullets{display:block;float:none;margin:0 auto 30px auto;overflow:hidden;position:relative;text-align:center;top:10px}.orbit-bullets li{background:#ccc;cursor:pointer;display:inline-block;float:none;height:0.5625rem;margin-right:6px;width:0.5625rem;border-radius:1000px}.orbit-bullets li.active{background:#999}.orbit-bullets li:last-child{margin-right:0}.touch .orbit-container .orbit-prev,.touch .orbit-container .orbit-next{display:none}.touch .orbit-bullets{display:none}@media only screen and (min-width: 40.0625em){.touch .orbit-container .orbit-prev,.touch .orbit-container .orbit-next{display:inherit}.touch .orbit-bullets{display:block}}@media only screen and (max-width: 40em){.orbit-stack-on-small .orbit-slides-container{height:auto !important}.orbit-stack-on-small .orbit-slides-container>*{margin:0 !important;opacity:1 !important;position:relative}.orbit-stack-on-small .orbit-slide-number{display:none}.orbit-timer{display:none}.orbit-next,.orbit-prev{display:none}.orbit-bullets{display:none}}[data-magellan-expedition],[data-magellan-expedition-clone]{background:#fff;min-width:100%;padding:10px;z-index:50}[data-magellan-expedition] .sub-nav,[data-magellan-expedition-clone] .sub-nav{margin-bottom:0}[data-magellan-expedition] .sub-nav dd,[data-magellan-expedition-clone] .sub-nav dd{margin-bottom:0}[data-magellan-expedition] .sub-nav a,[data-magellan-expedition-clone] .sub-nav a{line-height:1.8em}.icon-bar{display:inline-block;font-size:0;width:100%;background:#333}.icon-bar>*{display:block;float:left;font-size:1rem;margin:0 auto;padding:1.25rem;text-align:center;width:25%}.icon-bar>* i,.icon-bar>* img{display:block;margin:0 auto}.icon-bar>* i+label,.icon-bar>* img+label{margin-top:.0625rem}.icon-bar>* i{font-size:1.875rem;vertical-align:middle}.icon-bar>* img{height:1.875rem;width:1.875rem}.icon-bar.label-right>* i,.icon-bar.label-right>* img{display:inline-block;margin:0 .0625rem 0 0}.icon-bar.label-right>* i+label,.icon-bar.label-right>* img+label{margin-top:0}.icon-bar.label-right>* label{display:inline-block}.icon-bar.vertical.label-right>*{text-align:left}.icon-bar.vertical,.icon-bar.small-vertical{height:100%;width:auto}.icon-bar.vertical .item,.icon-bar.small-vertical .item{float:none;margin:auto;width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.medium-vertical{height:100%;width:auto}.icon-bar.medium-vertical .item{float:none;margin:auto;width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.large-vertical{height:100%;width:auto}.icon-bar.large-vertical .item{float:none;margin:auto;width:auto}}.icon-bar>*{font-size:1rem;padding:1.25rem}.icon-bar>* i+label,.icon-bar>* img+label{margin-top:.0625rem;font-size:1rem}.icon-bar>* i{font-size:1.875rem}.icon-bar>* img{height:1.875rem;width:1.875rem}.icon-bar>* label{color:#fff}.icon-bar>* i{color:#fff}.icon-bar>a:hover{background:#008CBA}.icon-bar>a:hover label{color:#fff}.icon-bar>a:hover i{color:#fff}.icon-bar>a.active{background:#008CBA}.icon-bar>a.active label{color:#fff}.icon-bar>a.active i{color:#fff}.icon-bar .item.disabled{cursor:not-allowed;opacity:0.7;pointer-events:none}.icon-bar .item.disabled>*{opacity:0.7;cursor:not-allowed}.icon-bar.two-up .item{width:50%}.icon-bar.two-up.vertical .item,.icon-bar.two-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.two-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.two-up.large-vertical .item{width:auto}}.icon-bar.three-up .item{width:33.3333%}.icon-bar.three-up.vertical .item,.icon-bar.three-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.three-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.three-up.large-vertical .item{width:auto}}.icon-bar.four-up .item{width:25%}.icon-bar.four-up.vertical .item,.icon-bar.four-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.four-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.four-up.large-vertical .item{width:auto}}.icon-bar.five-up .item{width:20%}.icon-bar.five-up.vertical .item,.icon-bar.five-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.five-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.five-up.large-vertical .item{width:auto}}.icon-bar.six-up .item{width:16.66667%}.icon-bar.six-up.vertical .item,.icon-bar.six-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.six-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.six-up.large-vertical .item{width:auto}}.icon-bar.seven-up .item{width:14.28571%}.icon-bar.seven-up.vertical .item,.icon-bar.seven-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.seven-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.seven-up.large-vertical .item{width:auto}}.icon-bar.eight-up .item{width:12.5%}.icon-bar.eight-up.vertical .item,.icon-bar.eight-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.eight-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.eight-up.large-vertical .item{width:auto}}.icon-bar.two-up .item{width:50%}.icon-bar.two-up.vertical .item,.icon-bar.two-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.two-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.two-up.large-vertical .item{width:auto}}.icon-bar.three-up .item{width:33.3333%}.icon-bar.three-up.vertical .item,.icon-bar.three-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.three-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.three-up.large-vertical .item{width:auto}}.icon-bar.four-up .item{width:25%}.icon-bar.four-up.vertical .item,.icon-bar.four-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.four-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.four-up.large-vertical .item{width:auto}}.icon-bar.five-up .item{width:20%}.icon-bar.five-up.vertical .item,.icon-bar.five-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.five-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.five-up.large-vertical .item{width:auto}}.icon-bar.six-up .item{width:16.66667%}.icon-bar.six-up.vertical .item,.icon-bar.six-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.six-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.six-up.large-vertical .item{width:auto}}.icon-bar.seven-up .item{width:14.28571%}.icon-bar.seven-up.vertical .item,.icon-bar.seven-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.seven-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.seven-up.large-vertical .item{width:auto}}.icon-bar.eight-up .item{width:12.5%}.icon-bar.eight-up.vertical .item,.icon-bar.eight-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.eight-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.eight-up.large-vertical .item{width:auto}}.tabs{margin-bottom:0 !important;margin-left:0}.tabs:before,.tabs:after{content:" ";display:table}.tabs:after{clear:both}.tabs dd,.tabs .tab-title{float:left;list-style:none;margin-bottom:0 !important;position:relative}.tabs dd>a,.tabs .tab-title>a{display:block;background-color:#EFEFEF;color:#222;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:1rem;padding:1rem 2rem}.tabs dd>a:hover,.tabs .tab-title>a:hover{background-color:#e1e1e1}.tabs dd.active a,.tabs .tab-title.active a{background-color:#fff;color:#222}.tabs.radius dd:first-child a,.tabs.radius .tab:first-child a{-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.tabs.radius dd:last-child a,.tabs.radius .tab:last-child a{-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.tabs.vertical dd,.tabs.vertical .tab-title{position:inherit;float:none;display:block;top:auto}.tabs-content{margin-bottom:1.5rem;width:100%}.tabs-content:before,.tabs-content:after{content:" ";display:table}.tabs-content:after{clear:both}.tabs-content>.content{display:none;float:left;padding:0.9375rem 0;width:100%}.tabs-content>.content.active{display:block;float:none}.tabs-content>.content.contained{padding:0.9375rem}.tabs-content.vertical{display:block}.tabs-content.vertical>.content{padding:0 0.9375rem}@media only screen and (min-width: 40.0625em){.tabs.vertical{float:left;margin:0;margin-bottom:1.25rem !important;max-width:20%;width:20%}.tabs-content.vertical{float:left;margin-left:-1px;max-width:80%;padding-left:1rem;width:80%}}.no-js .tabs-content>.content{display:block;float:none}ul.pagination{display:block;margin-left:-0.3125rem;min-height:1.5rem}ul.pagination li{color:#222;font-size:0.875rem;height:1.5rem;margin-left:0.3125rem}ul.pagination li a,ul.pagination li button{border-radius:3px;transition:background-color 300ms ease-out;background:none;color:#999;display:block;font-size:1em;font-weight:normal;line-height:inherit;padding:0.0625rem 0.625rem 0.0625rem}ul.pagination li:hover a,ul.pagination li a:focus,ul.pagination li:hover button,ul.pagination li button:focus{background:#e6e6e6}ul.pagination li.unavailable a,ul.pagination li.unavailable button{cursor:default;color:#999}ul.pagination li.unavailable:hover a,ul.pagination li.unavailable a:focus,ul.pagination li.unavailable:hover button,ul.pagination li.unavailable button:focus{background:transparent}ul.pagination li.current a,ul.pagination li.current button{background:#008CBA;color:#fff;cursor:default;font-weight:bold}ul.pagination li.current a:hover,ul.pagination li.current a:focus,ul.pagination li.current button:hover,ul.pagination li.current button:focus{background:#008CBA}ul.pagination li{display:block;float:left}.pagination-centered{text-align:center}.pagination-centered ul.pagination li{display:inline-block;float:none}.side-nav{display:block;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;list-style-position:outside;list-style-type:none;margin:0;padding:0.875rem 0}.side-nav li{font-size:0.875rem;font-weight:normal;margin:0 0 0.4375rem 0}.side-nav li a:not(.button){color:#008CBA;display:block;margin:0;padding:0.4375rem 0.875rem}.side-nav li a:not(.button):hover,.side-nav li a:not(.button):focus{background:rgba(0,0,0,0.025);color:#1cc7ff}.side-nav li a:not(.button):active{color:#1cc7ff}.side-nav li.active>a:first-child:not(.button){color:#1cc7ff;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal}.side-nav li.divider{border-top:1px solid;height:0;list-style:none;padding:0;border-top-color:#e6e6e6}.side-nav li.heading{color:#008CBA;font-size:0.875rem;font-weight:bold;text-transform:uppercase}.accordion{margin-bottom:0}.accordion:before,.accordion:after{content:" ";display:table}.accordion:after{clear:both}.accordion .accordion-navigation,.accordion dd{display:block;margin-bottom:0 !important}.accordion .accordion-navigation.active>a,.accordion dd.active>a{background:#e8e8e8}.accordion .accordion-navigation>a,.accordion dd>a{background:#EFEFEF;color:#222;display:block;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:1rem;padding:1rem}.accordion .accordion-navigation>a:hover,.accordion dd>a:hover{background:#e3e3e3}.accordion .accordion-navigation>.content,.accordion dd>.content{display:none;padding:0.9375rem}.accordion .accordion-navigation>.content.active,.accordion dd>.content.active{background:#fff;display:block}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.text-justify{text-align:justify !important}@media only screen and (max-width: 40em){.small-only-text-left{text-align:left !important}.small-only-text-right{text-align:right !important}.small-only-text-center{text-align:center !important}.small-only-text-justify{text-align:justify !important}}@media only screen{.small-text-left{text-align:left !important}.small-text-right{text-align:right !important}.small-text-center{text-align:center !important}.small-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em) and (max-width: 64em){.medium-only-text-left{text-align:left !important}.medium-only-text-right{text-align:right !important}.medium-only-text-center{text-align:center !important}.medium-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em){.medium-text-left{text-align:left !important}.medium-text-right{text-align:right !important}.medium-text-center{text-align:center !important}.medium-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em) and (max-width: 90em){.large-only-text-left{text-align:left !important}.large-only-text-right{text-align:right !important}.large-only-text-center{text-align:center !important}.large-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em){.large-text-left{text-align:left !important}.large-text-right{text-align:right !important}.large-text-center{text-align:center !important}.large-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em) and (max-width: 120em){.xlarge-only-text-left{text-align:left !important}.xlarge-only-text-right{text-align:right !important}.xlarge-only-text-center{text-align:center !important}.xlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em){.xlarge-text-left{text-align:left !important}.xlarge-text-right{text-align:right !important}.xlarge-text-center{text-align:center !important}.xlarge-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em) and (max-width: 6249999.9375em){.xxlarge-only-text-left{text-align:left !important}.xxlarge-only-text-right{text-align:right !important}.xxlarge-only-text-center{text-align:center !important}.xxlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em){.xxlarge-text-left{text-align:left !important}.xxlarge-text-right{text-align:right !important}.xxlarge-text-center{text-align:center !important}.xxlarge-text-justify{text-align:justify !important}}div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}a{color:#008CBA;line-height:inherit;text-decoration:none}a:hover,a:focus{color:#0078a0}a img{border:none}p{font-family:inherit;font-size:1rem;font-weight:normal;line-height:1.6;margin-bottom:1.25rem;text-rendering:optimizeLegibility}p.lead{font-size:1.21875rem;line-height:1.6}p aside{font-size:0.875rem;font-style:italic;line-height:1.35}h1,h2,h3,h4,h5,h6{color:#222;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:normal;line-height:1.4;margin-bottom:0.5rem;margin-top:0.2rem;text-rendering:optimizeLegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#6f6f6f;font-size:60%;line-height:0}h1{font-size:2.125rem}h2{font-size:1.6875rem}h3{font-size:1.375rem}h4{font-size:1.125rem}h5{font-size:1.125rem}h6{font-size:1rem}.subheader{line-height:1.4;color:#6f6f6f;font-weight:normal;margin-top:0.2rem;margin-bottom:0.5rem}hr{border:solid #ddd;border-width:1px 0 0;clear:both;height:0;margin:1.25rem 0 1.1875rem}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:bold;line-height:inherit}small{font-size:60%;line-height:inherit}code{background-color:#f8f8f8;border-color:#dfdfdf;border-style:solid;border-width:1px;color:#333;font-family:Consolas,"Liberation Mono",Courier,monospace;font-weight:normal;padding:0.125rem 0.3125rem 0.0625rem}ul,ol,dl{font-family:inherit;font-size:1rem;line-height:1.6;list-style-position:outside;margin-bottom:1.25rem}ul{margin-left:1.1rem}ul.no-bullet{margin-left:0}ul.no-bullet li ul,ul.no-bullet li ol{margin-left:1.25rem;margin-bottom:0;list-style:none}ul li ul,ul li ol{margin-left:1.25rem;margin-bottom:0}ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}ul.square{list-style-type:square;margin-left:1.1rem}ul.circle{list-style-type:circle;margin-left:1.1rem}ul.disc{list-style-type:disc;margin-left:1.1rem}ul.no-bullet{list-style:none}ol{margin-left:1.4rem}ol li ul,ol li ol{margin-left:1.25rem;margin-bottom:0}dl dt{margin-bottom:0.3rem;font-weight:bold}dl dd{margin-bottom:0.75rem}abbr,acronym{text-transform:uppercase;font-size:90%;color:#222;cursor:help}abbr{text-transform:none}abbr[title]{border-bottom:1px dotted #ddd}blockquote{margin:0 0 1.25rem;padding:0.5625rem 1.25rem 0 1.1875rem;border-left:1px solid #ddd}blockquote cite{display:block;font-size:0.8125rem;color:#555}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:#555}blockquote,blockquote p{line-height:1.6;color:#6f6f6f}.vcard{display:inline-block;margin:0 0 1.25rem 0;border:1px solid #ddd;padding:0.625rem 0.75rem}.vcard li{margin:0;display:block}.vcard .fn{font-weight:bold;font-size:0.9375rem}.vevent .summary{font-weight:bold}.vevent abbr{cursor:default;text-decoration:none;font-weight:bold;border:none;padding:0 0.0625rem}@media only screen and (min-width: 40.0625em){h1,h2,h3,h4,h5,h6{line-height:1.4}h1{font-size:2.75rem}h2{font-size:2.3125rem}h3{font-size:1.6875rem}h4{font-size:1.4375rem}h5{font-size:1.125rem}h6{font-size:1rem}}.split.button{position:relative;padding-right:5.0625rem}.split.button span{display:block;height:100%;position:absolute;right:0;top:0;border-left:solid 1px}.split.button span:after{position:absolute;content:"";width:0;height:0;display:block;border-style:inset;top:50%;left:50%}.split.button span:active{background-color:rgba(0,0,0,0.1)}.split.button span{border-left-color:rgba(255,255,255,0.5)}.split.button span{width:3.09375rem}.split.button span:after{border-top-style:solid;border-width:0.375rem;margin-left:-0.375rem;top:48%}.split.button span:after{border-color:#fff transparent transparent transparent}.split.button.secondary span{border-left-color:rgba(255,255,255,0.5)}.split.button.secondary span:after{border-color:#fff transparent transparent transparent}.split.button.alert span{border-left-color:rgba(255,255,255,0.5)}.split.button.success span{border-left-color:rgba(255,255,255,0.5)}.split.button.tiny{padding-right:3.75rem}.split.button.tiny span{width:2.25rem}.split.button.tiny span:after{border-top-style:solid;border-width:0.375rem;margin-left:-0.375rem;top:48%}.split.button.small{padding-right:4.375rem}.split.button.small span{width:2.625rem}.split.button.small span:after{border-top-style:solid;border-width:0.4375rem;margin-left:-0.375rem;top:48%}.split.button.large{padding-right:5.5rem}.split.button.large span{width:3.4375rem}.split.button.large span:after{border-top-style:solid;border-width:0.3125rem;margin-left:-0.375rem;top:48%}.split.button.expand{padding-left:2rem}.split.button.secondary span:after{border-color:#333 transparent transparent transparent}.split.button.radius span{-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.split.button.round span{-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}.split.button.no-pip span:before{border-style:none}.split.button.no-pip span:after{border-style:none}.split.button.no-pip span>i{display:block;left:50%;margin-left:-0.28889em;margin-top:-0.48889em;position:absolute;top:50%}.reveal-modal-bg{background:#000;background:rgba(0,0,0,0.45);bottom:0;display:none;left:0;position:fixed;right:0;top:0;z-index:1004;left:0}.reveal-modal{border-radius:3px;display:none;position:absolute;top:0;visibility:hidden;width:100%;z-index:1005;left:0;background-color:#fff;padding:1.875rem;border:solid 1px #666;box-shadow:0 0 10px rgba(0,0,0,0.4)}@media only screen and (max-width: 40em){.reveal-modal{min-height:100vh}}.reveal-modal .column,.reveal-modal .columns{min-width:0}.reveal-modal>:first-child{margin-top:0}.reveal-modal>:last-child{margin-bottom:0}@media only screen and (min-width: 40.0625em){.reveal-modal{left:0;margin:0 auto;max-width:62.5rem;right:0;width:80%}}@media only screen and (min-width: 40.0625em){.reveal-modal{top:6.25rem}}.reveal-modal.radius{border-radius:3px}.reveal-modal.round{border-radius:1000px}.reveal-modal.collapse{padding:0}@media only screen and (min-width: 40.0625em){.reveal-modal.tiny{left:0;margin:0 auto;max-width:62.5rem;right:0;width:30%}}@media only screen and (min-width: 40.0625em){.reveal-modal.small{left:0;margin:0 auto;max-width:62.5rem;right:0;width:40%}}@media only screen and (min-width: 40.0625em){.reveal-modal.medium{left:0;margin:0 auto;max-width:62.5rem;right:0;width:60%}}@media only screen and (min-width: 40.0625em){.reveal-modal.large{left:0;margin:0 auto;max-width:62.5rem;right:0;width:70%}}@media only screen and (min-width: 40.0625em){.reveal-modal.xlarge{left:0;margin:0 auto;max-width:62.5rem;right:0;width:95%}}.reveal-modal.full{height:100vh;height:100%;left:0;margin-left:0 !important;max-width:none !important;min-height:100vh;top:0}@media only screen and (min-width: 40.0625em){.reveal-modal.full{left:0;margin:0 auto;max-width:62.5rem;right:0;width:100%}}.reveal-modal.toback{z-index:1003}.reveal-modal .close-reveal-modal{color:#aaa;cursor:pointer;font-size:2.5rem;font-weight:bold;line-height:1;position:absolute;top:0.625rem;right:1.375rem}.has-tip{border-bottom:dotted 1px #ccc;color:#333;cursor:help;font-weight:bold}.has-tip:hover,.has-tip:focus{border-bottom:dotted 1px #003f54;color:#008CBA}.has-tip.tip-left,.has-tip.tip-right{float:none !important}.tooltip{background:#333;color:#fff;display:none;font-size:0.875rem;font-weight:normal;line-height:1.3;max-width:300px;padding:0.75rem;position:absolute;width:100%;z-index:1006;left:50%}.tooltip>.nub{border-color:transparent transparent #333 transparent;border:solid 5px;display:block;height:0;pointer-events:none;position:absolute;top:-10px;width:0;left:5px}.tooltip>.nub.rtl{left:auto;right:5px}.tooltip.radius{border-radius:3px}.tooltip.round{border-radius:1000px}.tooltip.round>.nub{left:2rem}.tooltip.opened{border-bottom:dotted 1px #003f54 !important;color:#008CBA !important}.tap-to-close{color:#777;display:block;font-size:0.625rem;font-weight:normal}@media only screen and (min-width: 40.0625em){.tooltip>.nub{border-color:transparent transparent #333 transparent;top:-10px}.tooltip.tip-top>.nub{border-color:#333 transparent transparent transparent;bottom:-10px;top:auto}.tooltip.tip-left,.tooltip.tip-right{float:none !important}.tooltip.tip-left>.nub{border-color:transparent transparent transparent #333;left:auto;margin-top:-5px;right:-10px;top:50%}.tooltip.tip-right>.nub{border-color:transparent #333 transparent transparent;left:-10px;margin-top:-5px;right:auto;top:50%}}.clearing-thumbs,[data-clearing]{list-style:none;margin-left:0;margin-bottom:0}.clearing-thumbs:before,.clearing-thumbs:after,[data-clearing]:before,[data-clearing]:after{content:" ";display:table}.clearing-thumbs:after,[data-clearing]:after{clear:both}.clearing-thumbs li,[data-clearing] li{float:left;margin-right:10px}.clearing-thumbs[class*="block-grid-"] li,[data-clearing][class*="block-grid-"] li{margin-right:0}.clearing-blackout{background:#333;height:100%;position:fixed;top:0;width:100%;z-index:998;left:0}.clearing-blackout .clearing-close{display:block}.clearing-container{height:100%;margin:0;overflow:hidden;position:relative;z-index:998}.clearing-touch-label{color:#aaa;font-size:.6em;left:50%;position:absolute;top:50%}.visible-img{height:95%;position:relative}.visible-img img{position:absolute;left:50%;top:50%;-webkit-transform:translateY(-50%) translateX(-50%);-moz-transform:translateY(-50%) translateX(-50%);-ms-transform:translateY(-50%) translateX(-50%);-o-transform:translateY(-50%) translateX(-50%);transform:translateY(-50%) translateX(-50%);max-height:100%;max-width:100%}.clearing-caption{background:#333;bottom:0;color:#ccc;font-size:0.875em;line-height:1.3;margin-bottom:0;padding:10px 30px 20px;position:absolute;text-align:center;width:100%;left:0}.clearing-close{color:#ccc;display:none;font-size:30px;line-height:1;padding-left:20px;padding-top:10px;z-index:999}.clearing-close:hover,.clearing-close:focus{color:#ccc}.clearing-assembled .clearing-container{height:100%}.clearing-assembled .clearing-container .carousel>ul{display:none}.clearing-feature li{display:none}.clearing-feature li.clearing-featured-img{display:block}@media only screen and (min-width: 40.0625em){.clearing-main-prev,.clearing-main-next{height:100%;position:absolute;top:0;width:40px}.clearing-main-prev>span,.clearing-main-next>span{border:solid 12px;display:block;height:0;position:absolute;top:50%;width:0}.clearing-main-prev>span:hover,.clearing-main-next>span:hover{opacity:.8}.clearing-main-prev{left:0}.clearing-main-prev>span{left:5px;border-color:transparent;border-right-color:#ccc}.clearing-main-next{right:0}.clearing-main-next>span{border-color:transparent;border-left-color:#ccc}.clearing-main-prev.disabled,.clearing-main-next.disabled{opacity:.3}.clearing-assembled .clearing-container .carousel{background:rgba(51,51,51,0.8);height:120px;margin-top:10px;text-align:center}.clearing-assembled .clearing-container .carousel>ul{display:inline-block;z-index:999;height:100%;position:relative;float:none}.clearing-assembled .clearing-container .carousel>ul li{clear:none;cursor:pointer;display:block;float:left;margin-right:0;min-height:inherit;opacity:.4;overflow:hidden;padding:0;position:relative;width:120px}.clearing-assembled .clearing-container .carousel>ul li.fix-height img{height:100%;max-width:none}.clearing-assembled .clearing-container .carousel>ul li a.th{border:none;box-shadow:none;display:block}.clearing-assembled .clearing-container .carousel>ul li img{cursor:pointer !important;width:100% !important}.clearing-assembled .clearing-container .carousel>ul li.visible{opacity:1}.clearing-assembled .clearing-container .carousel>ul li:hover{opacity:.8}.clearing-assembled .clearing-container .visible-img{background:#333;height:85%;overflow:hidden}.clearing-close{padding-left:0;padding-top:0;position:absolute;top:10px;right:20px}}.progress{background-color:#F6F6F6;border:1px solid #fff;height:1.5625rem;margin-bottom:0.625rem;padding:0.125rem}.progress .meter{background:#008CBA;display:block;height:100%}.progress.secondary .meter{background:#e7e7e7;display:block;height:100%}.progress.success .meter{background:#43AC6A;display:block;height:100%}.progress.alert .meter{background:#f04124;display:block;height:100%}.progress.radius{border-radius:3px}.progress.radius .meter{border-radius:2px}.progress.round{border-radius:1000px}.progress.round .meter{border-radius:999px}.sub-nav{display:block;margin:-0.25rem 0 1.125rem;overflow:hidden;padding-top:0.25rem;width:auto}.sub-nav dt{text-transform:uppercase}.sub-nav dt,.sub-nav dd,.sub-nav li{color:#999;float:left;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:0.875rem;font-weight:normal;margin-left:1rem;margin-bottom:0}.sub-nav dt a,.sub-nav dd a,.sub-nav li a{color:#999;padding:0.1875rem 1rem;text-decoration:none}.sub-nav dt a:hover,.sub-nav dd a:hover,.sub-nav li a:hover{color:#737373}.sub-nav dt.active a,.sub-nav dd.active a,.sub-nav li.active a{border-radius:3px;background:#008CBA;color:#fff;cursor:default;font-weight:normal;padding:0.1875rem 1rem}.sub-nav dt.active a:hover,.sub-nav dd.active a:hover,.sub-nav li.active a:hover{background:#0078a0}.joyride-list{display:none}.joyride-tip-guide{background:#333;color:#fff;display:none;font-family:inherit;font-weight:normal;position:absolute;top:0;width:95%;z-index:101;left:2.5%}.lt-ie9 .joyride-tip-guide{margin-left:-400px;max-width:800px;left:50%}.joyride-content-wrapper{padding:1.125rem 1.25rem 1.5rem;width:100%}.joyride-content-wrapper .button{margin-bottom:0 !important}.joyride-content-wrapper .joyride-prev-tip{margin-right:10px}.joyride-tip-guide .joyride-nub{border:10px solid #333;display:block;height:0;position:absolute;width:0;left:22px}.joyride-tip-guide .joyride-nub.top{border-color:#333;border-top-color:transparent !important;border-top-style:solid;border-left-color:transparent !important;border-right-color:transparent !important;top:-20px}.joyride-tip-guide .joyride-nub.bottom{border-color:#333 !important;border-bottom-color:transparent !important;border-bottom-style:solid;border-left-color:transparent !important;border-right-color:transparent !important;bottom:-20px}.joyride-tip-guide .joyride-nub.right{right:-20px}.joyride-tip-guide .joyride-nub.left{left:-20px}.joyride-tip-guide h1,.joyride-tip-guide h2,.joyride-tip-guide h3,.joyride-tip-guide h4,.joyride-tip-guide h5,.joyride-tip-guide h6{color:#fff;font-weight:bold;line-height:1.25;margin:0}.joyride-tip-guide p{font-size:0.875rem;line-height:1.3;margin:0 0 1.125rem 0}.joyride-timer-indicator-wrap{border:solid 1px #555;bottom:1rem;height:3px;position:absolute;width:50px;right:1.0625rem}.joyride-timer-indicator{background:#666;display:block;height:inherit;width:0}.joyride-close-tip{color:#777 !important;font-size:24px;font-weight:normal;line-height:.5 !important;position:absolute;text-decoration:none;top:10px;right:12px}.joyride-close-tip:hover,.joyride-close-tip:focus{color:#eee !important}.joyride-modal-bg{background:rgba(0,0,0,0.5);cursor:pointer;display:none;height:100%;position:fixed;top:0;width:100%;z-index:100;left:0}.joyride-expose-wrapper{background-color:#fff;border-radius:3px;box-shadow:0 0 15px #fff;position:absolute;z-index:102}.joyride-expose-cover{background:transparent;border-radius:3px;left:0;position:absolute;top:0;z-index:9999}@media only screen and (min-width: 40.0625em){.joyride-tip-guide{width:300px;left:inherit}.joyride-tip-guide .joyride-nub.bottom{border-color:#333 !important;border-bottom-color:transparent !important;border-left-color:transparent !important;border-right-color:transparent !important;bottom:-20px}.joyride-tip-guide .joyride-nub.right{border-color:#333 !important;border-right-color:transparent !important;border-bottom-color:transparent !important;border-top-color:transparent !important;left:auto;right:-20px;top:22px}.joyride-tip-guide .joyride-nub.left{border-color:#333 !important;border-bottom-color:transparent !important;border-left-color:transparent !important;border-top-color:transparent !important;left:-20px;right:auto;top:22px}}.label{display:inline-block;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal;line-height:1;margin-bottom:auto;position:relative;text-align:center;text-decoration:none;white-space:nowrap;padding:0.25rem 0.5rem 0.25rem;font-size:0.6875rem;background-color:#008CBA;color:#fff}.label.radius{border-radius:3px}.label.round{border-radius:1000px}.label.alert{background-color:#f04124;color:#fff}.label.warning{background-color:#f08a24;color:#fff}.label.success{background-color:#43AC6A;color:#fff}.label.secondary{background-color:#e7e7e7;color:#333}.label.info{background-color:#a0d3e8;color:#333}.off-canvas-wrap{-webkit-backface-visibility:hidden;position:relative;width:100%;overflow:hidden}.off-canvas-wrap.move-right,.off-canvas-wrap.move-left{min-height:100%;-webkit-overflow-scrolling:touch}.inner-wrap{position:relative;width:100%;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.inner-wrap:before,.inner-wrap:after{content:" ";display:table}.inner-wrap:after{clear:both}.tab-bar{-webkit-backface-visibility:hidden;background:#333;color:#fff;height:2.8125rem;line-height:2.8125rem;position:relative}.tab-bar h1,.tab-bar h2,.tab-bar h3,.tab-bar h4,.tab-bar h5,.tab-bar h6{color:#fff;font-weight:bold;line-height:2.8125rem;margin:0}.tab-bar h1,.tab-bar h2,.tab-bar h3,.tab-bar h4{font-size:1.125rem}.left-small{height:2.8125rem;position:absolute;top:0;width:2.8125rem;border-right:solid 1px #1a1a1a;left:0}.right-small{height:2.8125rem;position:absolute;top:0;width:2.8125rem;border-left:solid 1px #1a1a1a;right:0}.tab-bar-section{height:2.8125rem;padding:0 0.625rem;position:absolute;text-align:center;top:0}.tab-bar-section.left{text-align:left}.tab-bar-section.right{text-align:right}.tab-bar-section.left{left:0;right:2.8125rem}.tab-bar-section.right{left:2.8125rem;right:0}.tab-bar-section.middle{left:2.8125rem;right:2.8125rem}.tab-bar .menu-icon{color:#fff;display:block;height:2.8125rem;padding:0;position:relative;text-indent:2.1875rem;transform:translate3d(0, 0, 0);width:2.8125rem}.tab-bar .menu-icon span::after{content:"";display:block;height:0;position:absolute;top:50%;margin-top:-0.5rem;left:0.90625rem;box-shadow:0 0 0 1px #fff,0 7px 0 1px #fff,0 14px 0 1px #fff;width:1rem}.tab-bar .menu-icon span:hover:after{box-shadow:0 0 0 1px #b3b3b3,0 7px 0 1px #b3b3b3,0 14px 0 1px #b3b3b3}.left-off-canvas-menu{-webkit-backface-visibility:hidden;background:#333;bottom:0;box-sizing:content-box;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;transition:transform 500ms ease 0s;width:15.625rem;z-index:1001;-webkit-transform:translate3d(-100%, 0, 0);-moz-transform:translate3d(-100%, 0, 0);-ms-transform:translate(-100%, 0);-ms-transform:translate3d(-100%, 0, 0);-o-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.left-off-canvas-menu *{-webkit-backface-visibility:hidden}.right-off-canvas-menu{-webkit-backface-visibility:hidden;background:#333;bottom:0;box-sizing:content-box;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;transition:transform 500ms ease 0s;width:15.625rem;z-index:1001;-webkit-transform:translate3d(100%, 0, 0);-moz-transform:translate3d(100%, 0, 0);-ms-transform:translate(100%, 0);-ms-transform:translate3d(100%, 0, 0);-o-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);right:0}.right-off-canvas-menu *{-webkit-backface-visibility:hidden}ul.off-canvas-list{list-style-type:none;margin:0;padding:0}ul.off-canvas-list li label{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;display:block;font-size:0.75rem;font-weight:bold;margin:0;padding:0.3rem 0.9375rem;text-transform:uppercase}ul.off-canvas-list li a{border-bottom:1px solid #262626;color:rgba(255,255,255,0.7);display:block;padding:0.66667rem;transition:background 300ms ease}ul.off-canvas-list li a:hover{background:#242424}ul.off-canvas-list li a:active{background:#242424}.move-right>.inner-wrap{-webkit-transform:translate3d(15.625rem, 0, 0);-moz-transform:translate3d(15.625rem, 0, 0);-ms-transform:translate(15.625rem, 0);-ms-transform:translate3d(15.625rem, 0, 0);-o-transform:translate3d(15.625rem, 0, 0);transform:translate3d(15.625rem, 0, 0)}.move-right .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.move-right .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.move-left>.inner-wrap{-webkit-transform:translate3d(-15.625rem, 0, 0);-moz-transform:translate3d(-15.625rem, 0, 0);-ms-transform:translate(-15.625rem, 0);-ms-transform:translate3d(-15.625rem, 0, 0);-o-transform:translate3d(-15.625rem, 0, 0);transform:translate3d(-15.625rem, 0, 0)}.move-left .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.move-left .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.offcanvas-overlap .left-off-canvas-menu,.offcanvas-overlap .right-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.offcanvas-overlap .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.offcanvas-overlap-left .right-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap-left .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.offcanvas-overlap-left .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.offcanvas-overlap-right .left-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap-right .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.offcanvas-overlap-right .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.no-csstransforms .left-off-canvas-menu{left:-15.625rem}.no-csstransforms .right-off-canvas-menu{right:-15.625rem}.no-csstransforms .move-left>.inner-wrap{right:15.625rem}.no-csstransforms .move-right>.inner-wrap{left:15.625rem}.left-submenu{-webkit-backface-visibility:hidden;-webkit-overflow-scrolling:touch;background:#333;bottom:0;box-sizing:content-box;margin:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;width:15.625rem;z-index:1002;-webkit-transform:translate3d(-100%, 0, 0);-moz-transform:translate3d(-100%, 0, 0);-ms-transform:translate(-100%, 0);-ms-transform:translate3d(-100%, 0, 0);-o-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.left-submenu *{-webkit-backface-visibility:hidden}.left-submenu .back>a{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;font-weight:bold;padding:0.3rem 0.9375rem;text-transform:uppercase;margin:0}.left-submenu .back>a:hover{background:#303030;border-bottom:none;border-top:1px solid #5e5e5e}.left-submenu .back>a:before{content:"\AB";margin-right:.5rem;display:inline}.left-submenu.move-right,.left-submenu.offcanvas-overlap-right,.left-submenu.offcanvas-overlap{-webkit-transform:translate3d(0%, 0, 0);-moz-transform:translate3d(0%, 0, 0);-ms-transform:translate(0%, 0);-ms-transform:translate3d(0%, 0, 0);-o-transform:translate3d(0%, 0, 0);transform:translate3d(0%, 0, 0)}.right-submenu{-webkit-backface-visibility:hidden;-webkit-overflow-scrolling:touch;background:#333;bottom:0;box-sizing:content-box;margin:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;width:15.625rem;z-index:1002;-webkit-transform:translate3d(100%, 0, 0);-moz-transform:translate3d(100%, 0, 0);-ms-transform:translate(100%, 0);-ms-transform:translate3d(100%, 0, 0);-o-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);right:0;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.right-submenu *{-webkit-backface-visibility:hidden}.right-submenu .back>a{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;font-weight:bold;padding:0.3rem 0.9375rem;text-transform:uppercase;margin:0}.right-submenu .back>a:hover{background:#303030;border-bottom:none;border-top:1px solid #5e5e5e}.right-submenu .back>a:after{content:"\BB";margin-left:.5rem;display:inline}.right-submenu.move-left,.right-submenu.offcanvas-overlap-left,.right-submenu.offcanvas-overlap{-webkit-transform:translate3d(0%, 0, 0);-moz-transform:translate3d(0%, 0, 0);-ms-transform:translate(0%, 0);-ms-transform:translate3d(0%, 0, 0);-o-transform:translate3d(0%, 0, 0);transform:translate3d(0%, 0, 0)}.left-off-canvas-menu ul.off-canvas-list li.has-submenu>a:after{content:"\BB";margin-left:.5rem;display:inline}.right-off-canvas-menu ul.off-canvas-list li.has-submenu>a:before{content:"\AB";margin-right:.5rem;display:inline}.f-dropdown{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ccc;font-size:0.875rem;height:auto;max-height:none;width:100%;z-index:89;margin-top:2px;max-width:200px}.f-dropdown.open{display:block}.f-dropdown>*:first-child{margin-top:0}.f-dropdown>*:last-child{margin-bottom:0}.f-dropdown:before{border:inset 6px;content:"";display:block;height:0;width:0;border-color:transparent transparent #fff transparent;border-bottom-style:solid;position:absolute;top:-12px;left:10px;z-index:89}.f-dropdown:after{border:inset 7px;content:"";display:block;height:0;width:0;border-color:transparent transparent #ccc transparent;border-bottom-style:solid;position:absolute;top:-14px;left:9px;z-index:88}.f-dropdown.right:before{left:auto;right:10px}.f-dropdown.right:after{left:auto;right:9px}.f-dropdown.drop-right{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ccc;font-size:0.875rem;height:auto;max-height:none;width:100%;z-index:89;margin-top:0;margin-left:2px;max-width:200px}.f-dropdown.drop-right.open{display:block}.f-dropdown.drop-right>*:first-child{margin-top:0}.f-dropdown.drop-right>*:last-child{margin-bottom:0}.f-dropdown.drop-right:before{border:inset 6px;content:"";display:block;height:0;width:0;border-color:transparent #fff transparent transparent;border-right-style:solid;position:absolute;top:10px;left:-12px;z-index:89}.f-dropdown.drop-right:after{border:inset 7px;content:"";display:block;height:0;width:0;border-color:transparent #ccc transparent transparent;border-right-style:solid;position:absolute;top:9px;left:-14px;z-index:88}.f-dropdown.drop-left{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ccc;font-size:0.875rem;height:auto;max-height:none;width:100%;z-index:89;margin-top:0;margin-left:-2px;max-width:200px}.f-dropdown.drop-left.open{display:block}.f-dropdown.drop-left>*:first-child{margin-top:0}.f-dropdown.drop-left>*:last-child{margin-bottom:0}.f-dropdown.drop-left:before{border:inset 6px;content:"";display:block;height:0;width:0;border-color:transparent transparent transparent #fff;border-left-style:solid;position:absolute;top:10px;right:-12px;left:auto;z-index:89}.f-dropdown.drop-left:after{border:inset 7px;content:"";display:block;height:0;width:0;border-color:transparent transparent transparent #ccc;border-left-style:solid;position:absolute;top:9px;right:-14px;left:auto;z-index:88}.f-dropdown.drop-top{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ccc;font-size:0.875rem;height:auto;max-height:none;width:100%;z-index:89;margin-left:0;margin-top:-2px;max-width:200px}.f-dropdown.drop-top.open{display:block}.f-dropdown.drop-top>*:first-child{margin-top:0}.f-dropdown.drop-top>*:last-child{margin-bottom:0}.f-dropdown.drop-top:before{border:inset 6px;content:"";display:block;height:0;width:0;border-color:#fff transparent transparent transparent;border-top-style:solid;bottom:-12px;position:absolute;top:auto;left:10px;right:auto;z-index:89}.f-dropdown.drop-top:after{border:inset 7px;content:"";display:block;height:0;width:0;border-color:#ccc transparent transparent transparent;border-top-style:solid;bottom:-14px;position:absolute;top:auto;left:9px;right:auto;z-index:88}.f-dropdown li{cursor:pointer;font-size:0.875rem;line-height:1.125rem;margin:0}.f-dropdown li:hover,.f-dropdown li:focus{background:#eee}.f-dropdown li.radius{border-radius:3px}.f-dropdown li a{display:block;padding:0.5rem;color:#555}.f-dropdown.content{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ccc;font-size:0.875rem;height:auto;max-height:none;padding:1.25rem;width:100%;z-index:89;max-width:200px}.f-dropdown.content.open{display:block}.f-dropdown.content>*:first-child{margin-top:0}.f-dropdown.content>*:last-child{margin-bottom:0}.f-dropdown.tiny{max-width:200px}.f-dropdown.small{max-width:300px}.f-dropdown.medium{max-width:500px}.f-dropdown.large{max-width:800px}.f-dropdown.mega{width:100% !important;max-width:100% !important}.f-dropdown.mega.open{left:0 !important}table{background:#fff;border:solid 1px #ddd;margin-bottom:1.25rem;table-layout:auto}table caption{background:transparent;color:#222;font-size:1rem;font-weight:bold}table thead{background:#F5F5F5}table thead tr th,table thead tr td{color:#222;font-size:0.875rem;font-weight:bold;padding:0.5rem 0.625rem 0.625rem}table tfoot{background:#F5F5F5}table tfoot tr th,table tfoot tr td{color:#222;font-size:0.875rem;font-weight:bold;padding:0.5rem 0.625rem 0.625rem}table tr th,table tr td{color:#222;font-size:0.875rem;padding:0.5625rem 0.625rem;text-align:left}table tr.even,table tr.alt,table tr:nth-of-type(even){background:#F9F9F9}table thead tr th,table tfoot tr th,table tfoot tr td,table tbody tr th,table tbody tr td,table tr td{display:table-cell;line-height:1.125rem}.range-slider{border:1px solid #ddd;margin:1.25rem 0;position:relative;-ms-touch-action:none;touch-action:none;display:block;height:1rem;width:100%;background:#FAFAFA}.range-slider.vertical-range{border:1px solid #ddd;margin:1.25rem 0;position:relative;-ms-touch-action:none;touch-action:none;display:inline-block;height:12.5rem;width:1rem}.range-slider.vertical-range .range-slider-handle{bottom:-10.5rem;margin-left:-0.5rem;margin-top:0;position:absolute}.range-slider.vertical-range .range-slider-active-segment{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top-left-radius:initial;bottom:0;height:auto;width:0.875rem}.range-slider.radius{background:#FAFAFA;border-radius:3px}.range-slider.radius .range-slider-handle{background:#008CBA;border-radius:3px}.range-slider.radius .range-slider-handle:hover{background:#007ba4}.range-slider.round{background:#FAFAFA;border-radius:1000px}.range-slider.round .range-slider-handle{background:#008CBA;border-radius:1000px}.range-slider.round .range-slider-handle:hover{background:#007ba4}.range-slider.disabled,.range-slider[disabled]{background:#FAFAFA;cursor:not-allowed;opacity:0.7}.range-slider.disabled .range-slider-handle,.range-slider[disabled] .range-slider-handle{background:#008CBA;cursor:default;opacity:0.7}.range-slider.disabled .range-slider-handle:hover,.range-slider[disabled] .range-slider-handle:hover{background:#007ba4}.range-slider-active-segment{background:#e5e5e5;border-bottom-left-radius:inherit;border-top-left-radius:inherit;display:inline-block;height:0.875rem;position:absolute}.range-slider-handle{border:1px solid none;cursor:pointer;display:inline-block;height:1.375rem;position:absolute;top:-0.3125rem;width:2rem;z-index:1;-ms-touch-action:manipulation;touch-action:manipulation;background:#008CBA}.range-slider-handle:hover{background:#007ba4}[class*="block-grid-"]{display:block;padding:0;margin:0 -0.625rem}[class*="block-grid-"]:before,[class*="block-grid-"]:after{content:" ";display:table}[class*="block-grid-"]:after{clear:both}[class*="block-grid-"]>li{display:block;float:left;height:auto;padding:0 0.625rem 1.25rem}@media only screen{.small-block-grid-1>li{list-style:none;width:100%}.small-block-grid-1>li:nth-of-type(1n){clear:none}.small-block-grid-1>li:nth-of-type(1n+1){clear:both}.small-block-grid-2>li{list-style:none;width:50%}.small-block-grid-2>li:nth-of-type(1n){clear:none}.small-block-grid-2>li:nth-of-type(2n+1){clear:both}.small-block-grid-3>li{list-style:none;width:33.33333%}.small-block-grid-3>li:nth-of-type(1n){clear:none}.small-block-grid-3>li:nth-of-type(3n+1){clear:both}.small-block-grid-4>li{list-style:none;width:25%}.small-block-grid-4>li:nth-of-type(1n){clear:none}.small-block-grid-4>li:nth-of-type(4n+1){clear:both}.small-block-grid-5>li{list-style:none;width:20%}.small-block-grid-5>li:nth-of-type(1n){clear:none}.small-block-grid-5>li:nth-of-type(5n+1){clear:both}.small-block-grid-6>li{list-style:none;width:16.66667%}.small-block-grid-6>li:nth-of-type(1n){clear:none}.small-block-grid-6>li:nth-of-type(6n+1){clear:both}.small-block-grid-7>li{list-style:none;width:14.28571%}.small-block-grid-7>li:nth-of-type(1n){clear:none}.small-block-grid-7>li:nth-of-type(7n+1){clear:both}.small-block-grid-8>li{list-style:none;width:12.5%}.small-block-grid-8>li:nth-of-type(1n){clear:none}.small-block-grid-8>li:nth-of-type(8n+1){clear:both}.small-block-grid-9>li{list-style:none;width:11.11111%}.small-block-grid-9>li:nth-of-type(1n){clear:none}.small-block-grid-9>li:nth-of-type(9n+1){clear:both}.small-block-grid-10>li{list-style:none;width:10%}.small-block-grid-10>li:nth-of-type(1n){clear:none}.small-block-grid-10>li:nth-of-type(10n+1){clear:both}.small-block-grid-11>li{list-style:none;width:9.09091%}.small-block-grid-11>li:nth-of-type(1n){clear:none}.small-block-grid-11>li:nth-of-type(11n+1){clear:both}.small-block-grid-12>li{list-style:none;width:8.33333%}.small-block-grid-12>li:nth-of-type(1n){clear:none}.small-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 40.0625em){.medium-block-grid-1>li{list-style:none;width:100%}.medium-block-grid-1>li:nth-of-type(1n){clear:none}.medium-block-grid-1>li:nth-of-type(1n+1){clear:both}.medium-block-grid-2>li{list-style:none;width:50%}.medium-block-grid-2>li:nth-of-type(1n){clear:none}.medium-block-grid-2>li:nth-of-type(2n+1){clear:both}.medium-block-grid-3>li{list-style:none;width:33.33333%}.medium-block-grid-3>li:nth-of-type(1n){clear:none}.medium-block-grid-3>li:nth-of-type(3n+1){clear:both}.medium-block-grid-4>li{list-style:none;width:25%}.medium-block-grid-4>li:nth-of-type(1n){clear:none}.medium-block-grid-4>li:nth-of-type(4n+1){clear:both}.medium-block-grid-5>li{list-style:none;width:20%}.medium-block-grid-5>li:nth-of-type(1n){clear:none}.medium-block-grid-5>li:nth-of-type(5n+1){clear:both}.medium-block-grid-6>li{list-style:none;width:16.66667%}.medium-block-grid-6>li:nth-of-type(1n){clear:none}.medium-block-grid-6>li:nth-of-type(6n+1){clear:both}.medium-block-grid-7>li{list-style:none;width:14.28571%}.medium-block-grid-7>li:nth-of-type(1n){clear:none}.medium-block-grid-7>li:nth-of-type(7n+1){clear:both}.medium-block-grid-8>li{list-style:none;width:12.5%}.medium-block-grid-8>li:nth-of-type(1n){clear:none}.medium-block-grid-8>li:nth-of-type(8n+1){clear:both}.medium-block-grid-9>li{list-style:none;width:11.11111%}.medium-block-grid-9>li:nth-of-type(1n){clear:none}.medium-block-grid-9>li:nth-of-type(9n+1){clear:both}.medium-block-grid-10>li{list-style:none;width:10%}.medium-block-grid-10>li:nth-of-type(1n){clear:none}.medium-block-grid-10>li:nth-of-type(10n+1){clear:both}.medium-block-grid-11>li{list-style:none;width:9.09091%}.medium-block-grid-11>li:nth-of-type(1n){clear:none}.medium-block-grid-11>li:nth-of-type(11n+1){clear:both}.medium-block-grid-12>li{list-style:none;width:8.33333%}.medium-block-grid-12>li:nth-of-type(1n){clear:none}.medium-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 64.0625em){.large-block-grid-1>li{list-style:none;width:100%}.large-block-grid-1>li:nth-of-type(1n){clear:none}.large-block-grid-1>li:nth-of-type(1n+1){clear:both}.large-block-grid-2>li{list-style:none;width:50%}.large-block-grid-2>li:nth-of-type(1n){clear:none}.large-block-grid-2>li:nth-of-type(2n+1){clear:both}.large-block-grid-3>li{list-style:none;width:33.33333%}.large-block-grid-3>li:nth-of-type(1n){clear:none}.large-block-grid-3>li:nth-of-type(3n+1){clear:both}.large-block-grid-4>li{list-style:none;width:25%}.large-block-grid-4>li:nth-of-type(1n){clear:none}.large-block-grid-4>li:nth-of-type(4n+1){clear:both}.large-block-grid-5>li{list-style:none;width:20%}.large-block-grid-5>li:nth-of-type(1n){clear:none}.large-block-grid-5>li:nth-of-type(5n+1){clear:both}.large-block-grid-6>li{list-style:none;width:16.66667%}.large-block-grid-6>li:nth-of-type(1n){clear:none}.large-block-grid-6>li:nth-of-type(6n+1){clear:both}.large-block-grid-7>li{list-style:none;width:14.28571%}.large-block-grid-7>li:nth-of-type(1n){clear:none}.large-block-grid-7>li:nth-of-type(7n+1){clear:both}.large-block-grid-8>li{list-style:none;width:12.5%}.large-block-grid-8>li:nth-of-type(1n){clear:none}.large-block-grid-8>li:nth-of-type(8n+1){clear:both}.large-block-grid-9>li{list-style:none;width:11.11111%}.large-block-grid-9>li:nth-of-type(1n){clear:none}.large-block-grid-9>li:nth-of-type(9n+1){clear:both}.large-block-grid-10>li{list-style:none;width:10%}.large-block-grid-10>li:nth-of-type(1n){clear:none}.large-block-grid-10>li:nth-of-type(10n+1){clear:both}.large-block-grid-11>li{list-style:none;width:9.09091%}.large-block-grid-11>li:nth-of-type(1n){clear:none}.large-block-grid-11>li:nth-of-type(11n+1){clear:both}.large-block-grid-12>li{list-style:none;width:8.33333%}.large-block-grid-12>li:nth-of-type(1n){clear:none}.large-block-grid-12>li:nth-of-type(12n+1){clear:both}}.flex-video{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:67.5%;padding-top:1.5625rem;position:relative}.flex-video.widescreen{padding-bottom:56.34%}.flex-video.vimeo{padding-top:0}.flex-video iframe,.flex-video object,.flex-video embed,.flex-video video{height:100%;position:absolute;top:0;width:100%;left:0}.keystroke,kbd{background-color:#ededed;border-color:#ddd;color:#222;border-style:solid;border-width:1px;font-family:"Consolas","Menlo","Courier",monospace;font-size:inherit;margin:0;padding:0.125rem 0.25rem 0;border-radius:3px}.switch{border:none;margin-bottom:1.5rem;outline:0;padding:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch label{background:#ddd;color:transparent;cursor:pointer;display:block;margin-bottom:1rem;position:relative;text-indent:100%;width:4rem;height:2rem;transition:left 0.15s ease-out}.switch input{left:10px;opacity:0;padding:0;position:absolute;top:9px}.switch input+label{margin-left:0;margin-right:0}.switch label:after{background:#fff;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;width:1.5rem;-webkit-transition:left 0.15s ease-out;-moz-transition:left 0.15s ease-out;-o-transition:translate3d(0, 0, 0);transition:left 0.15s ease-out;-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.switch input:checked+label{background:#008CBA}.switch input:checked+label:after{left:2.25rem}.switch label{height:2rem;width:4rem}.switch label:after{height:1.5rem;width:1.5rem}.switch input:checked+label:after{left:2.25rem}.switch label{color:transparent;background:#ddd}.switch label:after{background:#fff}.switch input:checked+label{background:#008CBA}.switch.large label{height:2.5rem;width:5rem}.switch.large label:after{height:2rem;width:2rem}.switch.large input:checked+label:after{left:2.75rem}.switch.small label{height:1.75rem;width:3.5rem}.switch.small label:after{height:1.25rem;width:1.25rem}.switch.small input:checked+label:after{left:2rem}.switch.tiny label{height:1.5rem;width:3rem}.switch.tiny label:after{height:1rem;width:1rem}.switch.tiny input:checked+label:after{left:1.75rem}.switch.radius label{border-radius:4px}.switch.radius label:after{border-radius:3px}.switch.round{border-radius:1000px}.switch.round label{border-radius:2rem}.switch.round label:after{border-radius:2rem}@media only screen{.show-for-small-only,.show-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.hide-for-small-only,.hide-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.visible-for-small-only,.visible-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.hidden-for-small-only,.hidden-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.show-for-small-only,table.show-for-small-up,table.show-for-small,table.show-for-small-down,table.hide-for-medium-only,table.hide-for-medium-up,table.hide-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.show-for-small-only,thead.show-for-small-up,thead.show-for-small,thead.show-for-small-down,thead.hide-for-medium-only,thead.hide-for-medium-up,thead.hide-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.show-for-small-only,tbody.show-for-small-up,tbody.show-for-small,tbody.show-for-small-down,tbody.hide-for-medium-only,tbody.hide-for-medium-up,tbody.hide-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.show-for-small-only,tr.show-for-small-up,tr.show-for-small,tr.show-for-small-down,tr.hide-for-medium-only,tr.hide-for-medium-up,tr.hide-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.show-for-small-only,td.show-for-small-only,th.show-for-small-up,td.show-for-small-up,th.show-for-small,td.show-for-small,th.show-for-small-down,td.show-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.hide-for-medium-up,td.hide-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 40.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.show-for-medium-only,table.show-for-medium-up,table.show-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.show-for-medium-only,thead.show-for-medium-up,thead.show-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.show-for-medium-only,tbody.show-for-medium-up,tbody.show-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.show-for-medium-only,tr.show-for-medium-up,tr.show-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.show-for-medium-only,td.show-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.show-for-medium,td.show-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 64.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.show-for-large-only,table.show-for-large-up,table.show-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.show-for-large-only,thead.show-for-large-up,thead.show-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.show-for-large-only,tbody.show-for-large-up,tbody.show-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.show-for-large-only,tr.show-for-large-up,tr.show-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.show-for-large-only,td.show-for-large-only,th.show-for-large-up,td.show-for-large-up,th.show-for-large,td.show-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 90.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.show-for-xlarge-only,table.show-for-xlarge-up,table.show-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.show-for-xlarge-only,thead.show-for-xlarge-up,thead.show-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.show-for-xlarge-only,tbody.show-for-xlarge-up,tbody.show-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.show-for-xlarge-only,tr.show-for-xlarge-up,tr.show-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.show-for-xlarge-only,td.show-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.show-for-xlarge,td.show-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 120.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.hide-for-xlarge-only,.show-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.show-for-xlarge-only,.hide-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.hidden-for-xlarge-only,.visible-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.visible-for-xlarge-only,.hidden-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.hide-for-xlarge-only,table.show-for-xlarge-up,table.hide-for-xlarge,table.hide-for-xlarge-down,table.show-for-xxlarge-only,table.show-for-xxlarge-up,table.show-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.hide-for-xlarge-only,thead.show-for-xlarge-up,thead.hide-for-xlarge,thead.hide-for-xlarge-down,thead.show-for-xxlarge-only,thead.show-for-xxlarge-up,thead.show-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.hide-for-xlarge-only,tbody.show-for-xlarge-up,tbody.hide-for-xlarge,tbody.hide-for-xlarge-down,tbody.show-for-xxlarge-only,tbody.show-for-xxlarge-up,tbody.show-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.hide-for-xlarge-only,tr.show-for-xlarge-up,tr.hide-for-xlarge,tr.hide-for-xlarge-down,tr.show-for-xxlarge-only,tr.show-for-xxlarge-up,tr.show-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.hide-for-xlarge-down,td.hide-for-xlarge-down,th.show-for-xxlarge-only,td.show-for-xxlarge-only,th.show-for-xxlarge-up,td.show-for-xxlarge-up,th.show-for-xxlarge,td.show-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.hide-for-landscape,table.show-for-portrait{display:table !important}thead.hide-for-landscape,thead.show-for-portrait{display:table-header-group !important}tbody.hide-for-landscape,tbody.show-for-portrait{display:table-row-group !important}tr.hide-for-landscape,tr.show-for-portrait{display:table-row !important}td.hide-for-landscape,td.show-for-portrait,th.hide-for-landscape,th.show-for-portrait{display:table-cell !important}@media only screen and (orientation: landscape){.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.show-for-landscape,table.hide-for-portrait{display:table !important}thead.show-for-landscape,thead.hide-for-portrait{display:table-header-group !important}tbody.show-for-landscape,tbody.hide-for-portrait{display:table-row-group !important}tr.show-for-landscape,tr.hide-for-portrait{display:table-row !important}td.show-for-landscape,td.hide-for-portrait,th.show-for-landscape,th.hide-for-portrait{display:table-cell !important}}@media only screen and (orientation: portrait){.show-for-portrait,.hide-for-landscape{display:inherit !important}.hide-for-portrait,.show-for-landscape{display:none !important}table.show-for-portrait,table.hide-for-landscape{display:table !important}thead.show-for-portrait,thead.hide-for-landscape{display:table-header-group !important}tbody.show-for-portrait,tbody.hide-for-landscape{display:table-row-group !important}tr.show-for-portrait,tr.hide-for-landscape{display:table-row !important}td.show-for-portrait,td.hide-for-landscape,th.show-for-portrait,th.hide-for-landscape{display:table-cell !important}}.show-for-touch{display:none !important}.hide-for-touch{display:inherit !important}.touch .show-for-touch{display:inherit !important}.touch .hide-for-touch{display:none !important}table.hide-for-touch{display:table !important}.touch table.show-for-touch{display:table !important}thead.hide-for-touch{display:table-header-group !important}.touch thead.show-for-touch{display:table-header-group !important}tbody.hide-for-touch{display:table-row-group !important}.touch tbody.show-for-touch{display:table-row-group !important}tr.hide-for-touch{display:table-row !important}.touch tr.show-for-touch{display:table-row !important}td.hide-for-touch{display:table-cell !important}.touch td.show-for-touch{display:table-cell !important}th.hide-for-touch{display:table-cell !important}.touch th.show-for-touch{display:table-cell !important}.show-for-sr{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}.show-on-focus{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}.show-on-focus:focus,.show-on-focus:active{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.print-only{display:none !important}@media print{*{background:transparent !important;box-shadow:none !important;color:#000 !important;text-shadow:none !important}.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.hide-on-print{display:none !important}.print-only{display:block !important}.hide-for-print{display:none !important}.show-for-print{display:inherit !important}}@media print{.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}}@media not print{.show-for-print{display:none !important}}
\ No newline at end of file
diff --git a/production/example_apps/zippy_maps/webroot/css/cake.css b/production/example_apps/zippy_maps/webroot/css/cake.css
new file mode 100644
index 00000000..10841c89
--- /dev/null
+++ b/production/example_apps/zippy_maps/webroot/css/cake.css
@@ -0,0 +1,525 @@
+.disabled a,
+a.disabled {
+ pointer-events: none;
+}
+
+a:hover {
+ color: #15848F;
+}
+
+a {
+ color: #1798A5;
+}
+
+.side-nav li a:not(.button) {
+ color: #15848F;
+}
+
+.side-nav li a:not(.button):hover {
+ color: #15848F;
+}
+
+header {
+ background-color: #D33C44;
+ color: #ffffff;
+ font-size: 30px;
+ height: 84px;
+ line-height: 64px;
+ padding: 16px 0px;
+ box-shadow: 0px 1px rgba(0, 0, 0, 0.24);
+}
+
+header .header-title {
+ padding-left:80px
+}
+
+legend {
+ color:#15848F;
+}
+
+.row {
+ max-width: 80rem;
+}
+
+.actions.columns {
+ margin-top:1rem;
+ border-left: 5px solid #15848F;
+ padding-left: 15px;
+ padding: 32px 20px;
+}
+
+.actions.columns h3 {
+ color:#15848F;
+}
+
+.related table {
+ border: 0;
+ width: 100%;
+ table-layout: fixed;
+}
+
+.index table thead {
+ height: 3.5rem;
+}
+
+.header-help {
+ float: right;
+ margin-right:2rem;
+ margin-top: -80px;
+ font-size:16px;
+}
+
+.header-help span {
+ font-weight: normal;
+ text-align: center;
+ text-decoration: none;
+ line-height: 1;
+ white-space: nowrap;
+ display: inline-block;
+ padding: 0.25rem 0.5rem 0.375rem;
+ font-size: 0.8rem;
+ background-color: #0097a7;
+ color: #FFF;
+ border-radius: 1000px;
+}
+
+.header-help a {
+ color: #fff;
+}
+
+ul.pagination li a {
+ color: rgba(0, 0 ,0 , 0.54);
+}
+
+ul.pagination li.active a {
+ background-color: #DCE47E;
+ color: #FFF;
+ font-weight: bold;
+ cursor: default;
+}
+ul.pagination .disabled:hover a {
+ background: none;
+}
+
+.paginator {
+ text-align: center;
+}
+
+.paginator ul.pagination li {
+ float: none;
+ display: inline-block;
+}
+
+.paginator p {
+ text-align: right;
+ color: rgba(0, 0 ,0 , 0.54);
+}
+
+.asc:after {
+ content: " \2193";
+}
+.desc:after {
+ content: " \2191";
+}
+
+.form .error-message {
+ display: block;
+ padding: 0.375rem 0.5625rem 0.5625rem;
+ margin-top: -1px;
+ margin-bottom: 1rem;
+ font-size: 0.75rem;
+ font-weight: normal;
+ font-style: italic;
+ color: rgba(0, 0, 0, 0.54);
+}
+
+.required > label {
+ font-weight: bold;
+}
+.required > label:after {
+ content: ' *';
+ color: #C3232D;
+}
+
+select[multiple] {
+ min-height:150px;
+ background: none;
+}
+input[type=checkbox],
+input[type=radio] {
+ margin-right: 0.5em;
+}
+
+.date select,
+.time select,
+.datetime select {
+ display: inline;
+ width: auto;
+ margin-right: 10px;
+}
+
+.error label,
+.error label.error {
+ color: #C3232D;
+}
+
+.view h2 {
+ color: #6F6F6F;
+}
+
+.view .columns.strings {
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin-right:0.7rem;
+}
+
+.view .numbers {
+ background-color: #B7E3EC;
+ color: #FFF;
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin-right: 0.7rem;
+}
+
+.view .columns.dates {
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin-right:0.7rem;
+ background-color:#DCE47E;
+ color: #fff;
+}
+
+.view .columns.booleans {
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin-right:0.7rem;
+ background-color: #8D6E65;
+ color: #fff;
+}
+
+.view .strings p {
+ border-bottom: 1px solid #eee;
+}
+.view .numbers .subheader, .view .dates .subheader {
+ color:#747474;
+}
+.view .booleans .subheader {
+ color: #E9E9E9
+}
+
+.view .texts .columns {
+ margin-top:1.2rem;
+ border-bottom: 1px solid #eee;
+}
+
+/** Notices and Errors **/
+.cake-error,
+.cake-debug,
+.notice,
+p.error,
+p.notice {
+ display: block;
+ clear: both;
+ background-repeat: repeat-x;
+ margin-bottom: 18px;
+ padding: 7px 14px;
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+}
+
+.cake-debug,
+.notice,
+p.notice {
+ color: #000000;
+ background: #ffcc00;
+}
+
+.cake-error,
+p.error {
+ color: #fff;
+ background: #C3232D;
+}
+
+pre {
+ background: none repeat scroll 0% 0% #FFF;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin: 15px 0px;
+ color: rgba(0, 0 ,0 , 0.74);
+ padding:5px;
+}
+
+.cake-error .cake-stack-trace {
+ margin-top:10px;
+}
+
+.cake-stack-trace code {
+ background: inherit;
+ border:0;
+}
+
+.cake-code-dump .code-highlight {
+ display: block;
+ background-color: #FFC600;
+}
+
+.cake-error a,
+.cake-error a:hover {
+ color:#fff;
+ text-decoration: underline;
+}
+
+.checks {
+ padding:30px;
+ color: #626262;
+ background-color: #B7E3EC;
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin-bottom: 2em;
+}
+
+.checks h4 {
+ margin-bottom: 1.5rem;
+}
+
+.checks hr {
+ border: 0;
+ height: 0;
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
+ border-bottom: 1px solid rgba(255, 255, 255, 0.3);
+}
+
+.checks .success,
+.checks .problem {
+ margin-left: 10px;
+}
+.checks .success:before,
+.checks .problem:before {
+ line-height: 0px;
+ font-size: 28px;
+ height: 12px;
+ width: 12px;
+ border-radius: 15px;
+ text-align: center;
+ vertical-align: middle;
+ display: inline-block;
+ position: relative;
+ left: -11px;
+}
+
+.checks .success:before {
+ content: "â";
+ color: green;
+ margin-right: 9px;
+}
+
+.checks .problem:before {
+ content: "â";
+ color: red;
+ margin-right: 9px;
+}
+
+.top-bar.expanded .title-area {
+ background: #01545b;
+}
+
+.top-bar.expanded, .top-bar,.top-bar-section ul li,.top-bar-section li:not(.has-form) a:not(.button) {
+ background: #116d76;
+}
+
+.top-bar-section li:not(.has-form) a:not(.button):hover {
+ background-color: #308e97;
+ background: #308e97;
+}
+
+.side-nav li.heading {
+ color: #1798A5;
+ font-size: 0.875rem;
+ font-weight: bold;
+ text-transform: uppercase;
+ padding: 0.4375rem 0.875rem;
+}
+
+#actions-sidebar {
+ background: #fafafa;
+}
+
+.index table {
+ margin-top: 0rem;
+ border: 0;
+ width: 100%;
+ table-layout: fixed;
+}
+
+table {
+ background: #fff;
+ margin-bottom: 1.25rem;
+ border: none;
+ table-layout: fixed;
+ width: 100%;
+}
+
+table thead {
+ background: none;
+}
+
+table tr {
+ border-bottom: 1px solid #ebebec;
+}
+
+table thead tr {
+ border-bottom: 1px solid #1798A5;
+}
+
+table tr th {
+ padding: 0.5625rem 0.625rem;
+ font-size: 0.875rem;
+ color: #1798A5;
+ text-align: left;
+ border-bottom: 2px solid #1798A5;
+}
+
+table tr:nth-of-type(even) {
+ background: none;
+}
+
+fieldset {
+ border: none;
+ padding: 1.25rem;
+ margin: 1.125rem 0;
+}
+
+fieldset legend {
+ border-bottom: 2px solid #1798A5;
+ width: 100%;
+ line-height: 2rem;
+}
+
+.form button[type="submit"] {
+ float: right;
+ text-transform: uppercase;
+ box-shadow: none;
+}
+
+.form button:hover, .form button:focus {
+ background: #BE840B;
+ box-shadow: none;
+}
+
+button {
+ background: #966600;
+}
+
+div.message {
+ text-align: center;
+ cursor: pointer;
+ display: block;
+ font-weight: normal;
+ padding: 0 1.5rem 0 1.5rem;
+ transition: height 300ms ease-out 0s;
+ background-color: #a0d3e8;
+ color: #626262;
+ top: 15px;
+ right: 15px;
+ z-index: 999;
+ overflow: hidden;
+ height: 50px;
+ line-height: 2.5em;
+ box-radius: 5px;
+}
+
+div.message:before {
+ line-height: 0px;
+ font-size: 20px;
+ height: 12px;
+ width: 12px;
+ border-radius: 15px;
+ text-align: center;
+ vertical-align: middle;
+ display: inline-block;
+ position: relative;
+ left: -11px;
+ background-color: #FFF;
+ padding: 12px 14px 12px 10px;
+ content: "i";
+ color: #a0d3e8;
+}
+
+div.message.error {
+ background-color: #C3232D;
+ color: #FFF;
+}
+
+div.message.error:before {
+ padding: 11px 16px 14px 7px;
+ color: #C3232D;
+ content: "x";
+}
+div.message.hidden {
+ height: 0;
+}
+
+
+.vertical-table th {
+ padding: 0.5625rem 0.625rem;
+ font-size: 0.875rem;
+ color: #1798A5;
+ border: none;
+ text-align: left;
+}
+
+.vertical-table {
+ vertical-align: middle;
+}
+
+.vertical-table td {
+ text-align: right;
+}
+
+.content {
+ padding: 2rem;
+}
+
+/* Use 'one true layout' methods to get equal height columns */
+.container {
+ overflow: hidden;
+ min-height: 92%; /* full height almost always */
+}
+
+/* Force equal height by overflowing */
+.content,
+#actions-sidebar {
+ margin-bottom: -99999px;
+ padding-bottom: 99999px;
+}
+@media(max-width: 640px) {
+ #actions-sidebar {
+ padding-bottom: 2rem;
+ margin-bottom: 0;
+ }
+}
+
+.content h3 {
+ color: #be140b;
+ padding-bottom: 0.5rem;
+ margin-bottom: 20px;
+}
+
+.content h4 {
+ color: #be140b;
+ padding-bottom: 0.5rem;
+ margin-bottom: 20px;
+ border-bottom: 2px solid #be140b;
+}
+
+.content .related h4 {
+ color: #4d8f97;
+ padding-bottom: 0.5rem;
+ margin-top: 20px;
+ margin-bottom: 10px;
+ border-bottom: 0px;
+}
+
+table td {
+ vertical-align: top;
+ word-break: break-all;
+}
diff --git a/production/example_apps/zippy_maps/webroot/css/home.css b/production/example_apps/zippy_maps/webroot/css/home.css
new file mode 100644
index 00000000..d1db7780
--- /dev/null
+++ b/production/example_apps/zippy_maps/webroot/css/home.css
@@ -0,0 +1,250 @@
+@font-face {
+ font-family: 'cakefont';
+ src: url('../font/cakedingbats-webfont.eot');
+ src: url('../font/cakedingbats-webfont.eot?#iefix') format('embedded-opentype'),
+ url('../font/cakedingbats-webfont.woff2') format('woff2'),
+ url('../font/cakedingbats-webfont.woff') format('woff'),
+ url('../font/cakedingbats-webfont.ttf') format('truetype'),
+ url('../font/cakedingbats-webfont.svg#cake_dingbatsregular') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+.home {
+ font-family: 'Roboto', sans-serif;
+ font-size: 14px;
+ line-height: 27px;
+ color: #404041;
+}
+
+.fredmenu {
+ font-size: 28px;
+ text-align: center;
+}
+
+.fredmenu li {
+ font-size: 28px;
+}
+
+a {
+ color: #0071BC;
+ -webkit-transition: all 0.2s;
+ -moz-transition: all 0.2s;
+ -ms-transition: all 0.2s;
+ -o-transition: all 0.2s;
+ transition: all 0.2s;
+}
+
+a:hover, a:active {
+ color: #d33d44;
+ -webkit-transition: all 0.2s;
+ -moz-transition: all 0.2s;
+ -ms-transition: all 0.2s;
+ -o-transition: all 0.2s;
+ transition: all 0.2s;
+}
+
+ul, ol, dl, p {
+ font-size: 0.85rem;
+}
+
+p {
+ line-height: 2;
+}
+
+header {
+ height: auto;
+ line-height: 1em;
+ padding: 0;
+ box-shadow: none;
+}
+
+header.row {
+ margin-bottom: 30px;
+}
+
+header .header-image {
+ text-align: center;
+ padding: 64px 0;
+ background: #b060f1;
+}
+
+header .header-title {
+ padding: 0;
+ display: block;
+ background: #404041;
+ text-align: center;
+}
+
+header .header-title h1 {
+ font-family: 'Raleway', sans-serif;
+ margin: 0;
+ font-style: italic;
+ font-size: 18px;
+ font-weight: 500;
+ padding: 18px 30px;
+ color: #DEDED5;
+}
+
+header h1 {
+ color: #fff;
+}
+
+h3, h4 {
+ font-family: 'Roboto', sans-serif;
+ font-size: 27px;
+ line-height: 30px;
+ font-weight: 300;
+ -webkit-font-smoothing: antialiased;
+ margin-top: 0;
+ margin-bottom: 20px;
+}
+
+.more {
+ color: #ffffff;
+ background-color: #d33d44;
+ padding: 15px;
+ margin-top: 10px;
+}
+
+.row {
+ max-width: 1000px;
+}
+
+.alert {
+ background-color: #fff9e1;
+ font-size: 12px;
+ text-align: center;
+ display: block;
+ padding: 12px;
+ border-bottom: 2px solid #ffcf06;
+}
+
+.alert {
+ background-color: #fff9e1;
+ font-size: 12px;
+ display: block;
+ padding: 12px;
+ border-bottom: 2px solid #ffcf06;
+ margin-bottom: 30px;
+ color: #404041;
+}
+
+.alert p {
+ margin: 0;
+ font-size: 12px;
+ line-height: 1.4;
+}
+
+.alert p:before {
+ color: #ffcf06;
+ content: "\0055";
+ font-family: 'cakefont', sans-serif;
+ font-size: 21px;
+ margin-left: -0.8em;
+ width: 2.3em;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ padding: 0 10px 0 15px;
+ vertical-align: -2px;
+}
+
+.alert ul {
+ margin: 0;
+ font-size: 12px;
+}
+
+.alert.url-rewriting {
+ background-color: #F0F0F0;
+ border-color: #cccccc;
+ display: none;
+}
+
+.text-center {
+ text-align: center;
+}
+
+ul {
+ list-style-type: none;
+ margin: 0 0 30px 0;
+}
+
+li {
+ padding-left: 1.8em;
+}
+
+ul li ul, ul li ul li {
+ margin: 0;
+ padding: 0;
+}
+
+.bullet:before {
+ font-family: 'cakefont', sans-serif;
+ font-size: 18px;
+ display: inline-block;
+ margin-left: -1.3em;
+ width: 1.2em;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ vertical-align: -1px;
+}
+
+.success:before {
+ color: #88c671;
+ content: "\0056";
+}
+
+.problem:before {
+ color: #d33d44;
+ content: "\0057";
+}
+
+.cutlery:before {
+ color: #404041;
+ content: "\0059";
+}
+
+.book:before {
+ color: #404041;
+ content: "\0042";
+ width: 1.7em;
+}
+
+hr {
+ border-bottom: 1px solid #e7e7e7;
+ border-top: 0;
+ margin-bottom: 35px;
+ margin-left: 30px;
+ margin-right: 30px;
+}
+
+
+.icon {
+ color: #404041;
+ font-style: normal;
+ font-family: 'cakefont', sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.icon.support {
+ font-size: 60px;
+}
+.icon.docs {
+ font-size: 57px;
+}
+.icon.training {
+ font-size: 39px;
+}
+
+@media (min-width: 768px) {
+ .columns {
+ padding-left: 30px;
+ padding-right: 30px;
+ }
+}
+
+@media (min-width: 992px) {
+ header.row {
+ max-width: 940px;
+ }
+}
diff --git a/production/example_apps/zippy_maps/webroot/favicon.ico b/production/example_apps/zippy_maps/webroot/favicon.ico
new file mode 100644
index 00000000..49a060fc
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/favicon.ico differ
diff --git a/production/example_apps/zippy_maps/webroot/font/cakedingbats-webfont.eot b/production/example_apps/zippy_maps/webroot/font/cakedingbats-webfont.eot
new file mode 100644
index 00000000..e8605d92
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/font/cakedingbats-webfont.eot differ
diff --git a/production/example_apps/zippy_maps/webroot/font/cakedingbats-webfont.svg b/production/example_apps/zippy_maps/webroot/font/cakedingbats-webfont.svg
new file mode 100644
index 00000000..d1e0c98f
--- /dev/null
+++ b/production/example_apps/zippy_maps/webroot/font/cakedingbats-webfont.svg
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/production/example_apps/zippy_maps/webroot/font/cakedingbats-webfont.ttf b/production/example_apps/zippy_maps/webroot/font/cakedingbats-webfont.ttf
new file mode 100644
index 00000000..13d54454
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/font/cakedingbats-webfont.ttf differ
diff --git a/production/example_apps/zippy_maps/webroot/font/cakedingbats-webfont.woff b/production/example_apps/zippy_maps/webroot/font/cakedingbats-webfont.woff
new file mode 100644
index 00000000..073baab1
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/font/cakedingbats-webfont.woff differ
diff --git a/production/example_apps/zippy_maps/webroot/font/cakedingbats-webfont.woff2 b/production/example_apps/zippy_maps/webroot/font/cakedingbats-webfont.woff2
new file mode 100644
index 00000000..6e71eaf5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/font/cakedingbats-webfont.woff2 differ
diff --git a/production/example_apps/zippy_maps/webroot/img/cake-logo.png b/production/example_apps/zippy_maps/webroot/img/cake-logo.png
new file mode 100644
index 00000000..41939ef5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/cake-logo.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/cake.icon.png b/production/example_apps/zippy_maps/webroot/img/cake.icon.png
new file mode 100644
index 00000000..394fa42d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/cake.icon.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/cake.logo.svg b/production/example_apps/zippy_maps/webroot/img/cake.logo.svg
new file mode 100644
index 00000000..e73abb54
--- /dev/null
+++ b/production/example_apps/zippy_maps/webroot/img/cake.logo.svg
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/production/example_apps/zippy_maps/webroot/img/cake.power.gif b/production/example_apps/zippy_maps/webroot/img/cake.power.gif
new file mode 100644
index 00000000..8f8d570a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/cake.power.gif differ
diff --git a/production/example_apps/zippy_maps/webroot/img/charlottesville_minimap.png b/production/example_apps/zippy_maps/webroot/img/charlottesville_minimap.png
new file mode 100644
index 00000000..b8e9bfb3
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/charlottesville_minimap.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/2hand.png b/production/example_apps/zippy_maps/webroot/img/icons/2hand.png
new file mode 100644
index 00000000..b351f943
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/2hand.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/360degrees.png b/production/example_apps/zippy_maps/webroot/img/icons/360degrees.png
new file mode 100644
index 00000000..3f288968
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/360degrees.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/_readme-license.txt b/production/example_apps/zippy_maps/webroot/img/icons/_readme-license.txt
new file mode 100644
index 00000000..d7b056af
--- /dev/null
+++ b/production/example_apps/zippy_maps/webroot/img/icons/_readme-license.txt
@@ -0,0 +1,10 @@
+The project "Map Icons Collection" was created by Nicolas Mollet under the Creative Commons Attribution-Share Alike 3.0 Unported license (CC BY SA 3.0 - http://creativecommons.org/licenses/by-sa/3.0/).
+
+This license lets you remix, tweak, and build upon our work even for commercial reasons, as long as you credit the project and license your new creations under the identical terms.
+
+Please credit: Maps Icons Collection https://mapicons.mapsmarker.com
+Logo available at https://mapicons.mapsmarker.com/wp-content/uploads/2011/03/miclogo-88x31.gif
+
+Some icons are derived from the project SJJB Map Icons (http://www.sjjb.co.uk/mapicons/) by SJJB Management (http://www.sjjb.co.uk/), licensed under Creative Commons Public Domain Dedication (http://creativecommons.org/licenses/publicdomain/).
+
+Some icons are derived from the project User Interface Design Framework (http://www.webalys.com/design-interface-application-framework.php) by Webalys (http://www.webalys.com/).
\ No newline at end of file
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/abduction.png b/production/example_apps/zippy_maps/webroot/img/icons/abduction.png
new file mode 100644
index 00000000..860d9ce6
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/abduction.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/aboriginal.png b/production/example_apps/zippy_maps/webroot/img/icons/aboriginal.png
new file mode 100644
index 00000000..9eba194f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/aboriginal.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/accesdenied.png b/production/example_apps/zippy_maps/webroot/img/icons/accesdenied.png
new file mode 100644
index 00000000..db0c6fe8
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/accesdenied.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/acupuncture.png b/production/example_apps/zippy_maps/webroot/img/icons/acupuncture.png
new file mode 100644
index 00000000..bbe74964
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/acupuncture.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/administration.png b/production/example_apps/zippy_maps/webroot/img/icons/administration.png
new file mode 100644
index 00000000..610fb8d5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/administration.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/administrativeboundary.png b/production/example_apps/zippy_maps/webroot/img/icons/administrativeboundary.png
new file mode 100644
index 00000000..695ee40a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/administrativeboundary.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/aed-2.png b/production/example_apps/zippy_maps/webroot/img/icons/aed-2.png
new file mode 100644
index 00000000..dff6ca75
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/aed-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/agritourism.png b/production/example_apps/zippy_maps/webroot/img/icons/agritourism.png
new file mode 100644
index 00000000..73968669
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/agritourism.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/air_fixwing.png b/production/example_apps/zippy_maps/webroot/img/icons/air_fixwing.png
new file mode 100644
index 00000000..62032d82
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/air_fixwing.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/aircraftcarrier.png b/production/example_apps/zippy_maps/webroot/img/icons/aircraftcarrier.png
new file mode 100644
index 00000000..28ed51d5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/aircraftcarrier.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/aircraftsmall.png b/production/example_apps/zippy_maps/webroot/img/icons/aircraftsmall.png
new file mode 100644
index 00000000..047bdb4c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/aircraftsmall.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/airport.png b/production/example_apps/zippy_maps/webroot/img/icons/airport.png
new file mode 100644
index 00000000..a03d4d77
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/airport.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/airport_apron.png b/production/example_apps/zippy_maps/webroot/img/icons/airport_apron.png
new file mode 100644
index 00000000..203468eb
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/airport_apron.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/airport_runway.png b/production/example_apps/zippy_maps/webroot/img/icons/airport_runway.png
new file mode 100644
index 00000000..33d4e40b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/airport_runway.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/airport_terminal.png b/production/example_apps/zippy_maps/webroot/img/icons/airport_terminal.png
new file mode 100644
index 00000000..c270f21f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/airport_terminal.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/airshow-2.png b/production/example_apps/zippy_maps/webroot/img/icons/airshow-2.png
new file mode 100644
index 00000000..c40adaa3
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/airshow-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/algae.png b/production/example_apps/zippy_maps/webroot/img/icons/algae.png
new file mode 100644
index 00000000..04da6faf
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/algae.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/alien.png b/production/example_apps/zippy_maps/webroot/img/icons/alien.png
new file mode 100644
index 00000000..071d697c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/alien.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/alligator.png b/production/example_apps/zippy_maps/webroot/img/icons/alligator.png
new file mode 100644
index 00000000..db0c903b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/alligator.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/amphitheater-2.png b/production/example_apps/zippy_maps/webroot/img/icons/amphitheater-2.png
new file mode 100644
index 00000000..27e539fc
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/amphitheater-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/amphitheater.png b/production/example_apps/zippy_maps/webroot/img/icons/amphitheater.png
new file mode 100644
index 00000000..0d6b1239
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/amphitheater.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/anchorpier.png b/production/example_apps/zippy_maps/webroot/img/icons/anchorpier.png
new file mode 100644
index 00000000..0ab61bdb
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/anchorpier.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/anemometer_mono.png b/production/example_apps/zippy_maps/webroot/img/icons/anemometer_mono.png
new file mode 100644
index 00000000..8056a3e7
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/anemometer_mono.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/animal-shelter-export.png b/production/example_apps/zippy_maps/webroot/img/icons/animal-shelter-export.png
new file mode 100644
index 00000000..e578f556
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/animal-shelter-export.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/anniversary.png b/production/example_apps/zippy_maps/webroot/img/icons/anniversary.png
new file mode 100644
index 00000000..05b5e187
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/anniversary.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/ant-export.png b/production/example_apps/zippy_maps/webroot/img/icons/ant-export.png
new file mode 100644
index 00000000..494d4964
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/ant-export.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/anthropo.png b/production/example_apps/zippy_maps/webroot/img/icons/anthropo.png
new file mode 100644
index 00000000..13be8711
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/anthropo.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/apartment-3.png b/production/example_apps/zippy_maps/webroot/img/icons/apartment-3.png
new file mode 100644
index 00000000..9d8ad2f3
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/apartment-3.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/apple.png b/production/example_apps/zippy_maps/webroot/img/icons/apple.png
new file mode 100644
index 00000000..e19c9e75
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/apple.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/aquarium.png b/production/example_apps/zippy_maps/webroot/img/icons/aquarium.png
new file mode 100644
index 00000000..72ccb782
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/aquarium.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/arch.png b/production/example_apps/zippy_maps/webroot/img/icons/arch.png
new file mode 100644
index 00000000..a695569a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/arch.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/archery.png b/production/example_apps/zippy_maps/webroot/img/icons/archery.png
new file mode 100644
index 00000000..b11bca8d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/archery.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/army.png b/production/example_apps/zippy_maps/webroot/img/icons/army.png
new file mode 100644
index 00000000..f5556e02
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/army.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/art-museum-2.png b/production/example_apps/zippy_maps/webroot/img/icons/art-museum-2.png
new file mode 100644
index 00000000..67ba8e3f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/art-museum-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/artgallery.png b/production/example_apps/zippy_maps/webroot/img/icons/artgallery.png
new file mode 100644
index 00000000..8efffeb4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/artgallery.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/atm-2.png b/production/example_apps/zippy_maps/webroot/img/icons/atm-2.png
new file mode 100644
index 00000000..922e0eb2
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/atm-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/atv.png b/production/example_apps/zippy_maps/webroot/img/icons/atv.png
new file mode 100644
index 00000000..a594333f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/atv.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/audio.png b/production/example_apps/zippy_maps/webroot/img/icons/audio.png
new file mode 100644
index 00000000..93079238
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/audio.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/australianfootball.png b/production/example_apps/zippy_maps/webroot/img/icons/australianfootball.png
new file mode 100644
index 00000000..c1650461
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/australianfootball.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/avalanche1.png b/production/example_apps/zippy_maps/webroot/img/icons/avalanche1.png
new file mode 100644
index 00000000..9b03a9bf
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/avalanche1.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/award.png b/production/example_apps/zippy_maps/webroot/img/icons/award.png
new file mode 100644
index 00000000..e3ac637d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/award.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/badminton-2.png b/production/example_apps/zippy_maps/webroot/img/icons/badminton-2.png
new file mode 100644
index 00000000..6b65545f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/badminton-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bags.png b/production/example_apps/zippy_maps/webroot/img/icons/bags.png
new file mode 100644
index 00000000..69f8a6fc
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bags.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bank.png b/production/example_apps/zippy_maps/webroot/img/icons/bank.png
new file mode 100644
index 00000000..9a427cbd
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bank.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bar.png b/production/example_apps/zippy_maps/webroot/img/icons/bar.png
new file mode 100644
index 00000000..92d9b710
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bar.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bar_coktail.png b/production/example_apps/zippy_maps/webroot/img/icons/bar_coktail.png
new file mode 100644
index 00000000..75252115
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bar_coktail.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bar_juice.png b/production/example_apps/zippy_maps/webroot/img/icons/bar_juice.png
new file mode 100644
index 00000000..9fc4c819
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bar_juice.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/barbecue.png b/production/example_apps/zippy_maps/webroot/img/icons/barbecue.png
new file mode 100644
index 00000000..de349a5c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/barbecue.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/barber.png b/production/example_apps/zippy_maps/webroot/img/icons/barber.png
new file mode 100644
index 00000000..884f0523
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/barber.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/barrier.png b/production/example_apps/zippy_maps/webroot/img/icons/barrier.png
new file mode 100644
index 00000000..4021455d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/barrier.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/baseball.png b/production/example_apps/zippy_maps/webroot/img/icons/baseball.png
new file mode 100644
index 00000000..4e81eaf9
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/baseball.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/basketball.png b/production/example_apps/zippy_maps/webroot/img/icons/basketball.png
new file mode 100644
index 00000000..1906c331
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/basketball.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bats.png b/production/example_apps/zippy_maps/webroot/img/icons/bats.png
new file mode 100644
index 00000000..7978bdc1
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bats.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/battlefield.png b/production/example_apps/zippy_maps/webroot/img/icons/battlefield.png
new file mode 100644
index 00000000..1f9d7c30
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/battlefield.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/battleship-3.png b/production/example_apps/zippy_maps/webroot/img/icons/battleship-3.png
new file mode 100644
index 00000000..ee96f349
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/battleship-3.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/beach.png b/production/example_apps/zippy_maps/webroot/img/icons/beach.png
new file mode 100644
index 00000000..58c79fad
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/beach.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/beachvolleyball.png b/production/example_apps/zippy_maps/webroot/img/icons/beachvolleyball.png
new file mode 100644
index 00000000..25f840f9
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/beachvolleyball.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/beautifulview.png b/production/example_apps/zippy_maps/webroot/img/icons/beautifulview.png
new file mode 100644
index 00000000..1b7008db
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/beautifulview.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/beautysalon.png b/production/example_apps/zippy_maps/webroot/img/icons/beautysalon.png
new file mode 100644
index 00000000..ce88e7d7
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/beautysalon.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bed_breakfast1-2.png b/production/example_apps/zippy_maps/webroot/img/icons/bed_breakfast1-2.png
new file mode 100644
index 00000000..af0e8174
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bed_breakfast1-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/beergarden.png b/production/example_apps/zippy_maps/webroot/img/icons/beergarden.png
new file mode 100644
index 00000000..e6fbc073
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/beergarden.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bicycle_shop.png b/production/example_apps/zippy_maps/webroot/img/icons/bicycle_shop.png
new file mode 100644
index 00000000..19db88da
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bicycle_shop.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bigcity.png b/production/example_apps/zippy_maps/webroot/img/icons/bigcity.png
new file mode 100644
index 00000000..cdc265d0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bigcity.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bike_downhill.png b/production/example_apps/zippy_maps/webroot/img/icons/bike_downhill.png
new file mode 100644
index 00000000..85911880
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bike_downhill.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bike_rising.png b/production/example_apps/zippy_maps/webroot/img/icons/bike_rising.png
new file mode 100644
index 00000000..694c56ea
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bike_rising.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/billiard-2.png b/production/example_apps/zippy_maps/webroot/img/icons/billiard-2.png
new file mode 100644
index 00000000..cb614fa0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/billiard-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/binoculars.png b/production/example_apps/zippy_maps/webroot/img/icons/binoculars.png
new file mode 100644
index 00000000..94f9d19f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/binoculars.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/birds-2.png b/production/example_apps/zippy_maps/webroot/img/icons/birds-2.png
new file mode 100644
index 00000000..096537d6
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/birds-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/blast.png b/production/example_apps/zippy_maps/webroot/img/icons/blast.png
new file mode 100644
index 00000000..4bce6393
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/blast.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/boardercross.png b/production/example_apps/zippy_maps/webroot/img/icons/boardercross.png
new file mode 100644
index 00000000..dd24010a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/boardercross.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/boat.png b/production/example_apps/zippy_maps/webroot/img/icons/boat.png
new file mode 100644
index 00000000..4ce1c591
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/boat.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/boatcrane.png b/production/example_apps/zippy_maps/webroot/img/icons/boatcrane.png
new file mode 100644
index 00000000..702801fc
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/boatcrane.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bobsleigh.png b/production/example_apps/zippy_maps/webroot/img/icons/bobsleigh.png
new file mode 100644
index 00000000..0b136b2a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bobsleigh.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bollie.png b/production/example_apps/zippy_maps/webroot/img/icons/bollie.png
new file mode 100644
index 00000000..8f4f6dd9
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bollie.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bomb.png b/production/example_apps/zippy_maps/webroot/img/icons/bomb.png
new file mode 100644
index 00000000..2ae136e0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bomb.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bomber-2.png b/production/example_apps/zippy_maps/webroot/img/icons/bomber-2.png
new file mode 100644
index 00000000..b6ee09b0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bomber-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bouddha.png b/production/example_apps/zippy_maps/webroot/img/icons/bouddha.png
new file mode 100644
index 00000000..990ce75d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bouddha.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bowling.png b/production/example_apps/zippy_maps/webroot/img/icons/bowling.png
new file mode 100644
index 00000000..693c708a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bowling.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/boxing.png b/production/example_apps/zippy_maps/webroot/img/icons/boxing.png
new file mode 100644
index 00000000..bd01e4ad
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/boxing.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bread.png b/production/example_apps/zippy_maps/webroot/img/icons/bread.png
new file mode 100644
index 00000000..ee607119
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bread.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/brewery1.png b/production/example_apps/zippy_maps/webroot/img/icons/brewery1.png
new file mode 100644
index 00000000..f5478b9f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/brewery1.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bridge_modern.png b/production/example_apps/zippy_maps/webroot/img/icons/bridge_modern.png
new file mode 100644
index 00000000..834514ac
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bridge_modern.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bridge_old.png b/production/example_apps/zippy_maps/webroot/img/icons/bridge_old.png
new file mode 100644
index 00000000..8edc9480
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bridge_old.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bulldozer.png b/production/example_apps/zippy_maps/webroot/img/icons/bulldozer.png
new file mode 100644
index 00000000..381ed7b3
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bulldozer.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bullfight.png b/production/example_apps/zippy_maps/webroot/img/icons/bullfight.png
new file mode 100644
index 00000000..848fda20
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bullfight.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bunker-2-2.png b/production/example_apps/zippy_maps/webroot/img/icons/bunker-2-2.png
new file mode 100644
index 00000000..9af84eab
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bunker-2-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bus.png b/production/example_apps/zippy_maps/webroot/img/icons/bus.png
new file mode 100644
index 00000000..47ea3c88
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bus.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/busstop.png b/production/example_apps/zippy_maps/webroot/img/icons/busstop.png
new file mode 100644
index 00000000..6361a859
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/busstop.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/bustour.png b/production/example_apps/zippy_maps/webroot/img/icons/bustour.png
new file mode 100644
index 00000000..06ab4f00
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/bustour.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/butcher-2.png b/production/example_apps/zippy_maps/webroot/img/icons/butcher-2.png
new file mode 100644
index 00000000..8745cc47
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/butcher-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/butterfly-2.png b/production/example_apps/zippy_maps/webroot/img/icons/butterfly-2.png
new file mode 100644
index 00000000..6329061a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/butterfly-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cabin-2.png b/production/example_apps/zippy_maps/webroot/img/icons/cabin-2.png
new file mode 100644
index 00000000..3c9bde96
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cabin-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cablecar.png b/production/example_apps/zippy_maps/webroot/img/icons/cablecar.png
new file mode 100644
index 00000000..9c1b8be4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cablecar.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cafetaria.png b/production/example_apps/zippy_maps/webroot/img/icons/cafetaria.png
new file mode 100644
index 00000000..40bf1d08
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cafetaria.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/calendar-3.png b/production/example_apps/zippy_maps/webroot/img/icons/calendar-3.png
new file mode 100644
index 00000000..fc18408a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/calendar-3.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/campfire-2.png b/production/example_apps/zippy_maps/webroot/img/icons/campfire-2.png
new file mode 100644
index 00000000..023710b4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/campfire-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/camping-2.png b/production/example_apps/zippy_maps/webroot/img/icons/camping-2.png
new file mode 100644
index 00000000..d877e40a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/camping-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/candy.png b/production/example_apps/zippy_maps/webroot/img/icons/candy.png
new file mode 100644
index 00000000..68629802
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/candy.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/canyon-2.png b/production/example_apps/zippy_maps/webroot/img/icons/canyon-2.png
new file mode 100644
index 00000000..a186b6e9
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/canyon-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/car.png b/production/example_apps/zippy_maps/webroot/img/icons/car.png
new file mode 100644
index 00000000..f529bbc7
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/car.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/caraccident.png b/production/example_apps/zippy_maps/webroot/img/icons/caraccident.png
new file mode 100644
index 00000000..39d16cd2
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/caraccident.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/carrental.png b/production/example_apps/zippy_maps/webroot/img/icons/carrental.png
new file mode 100644
index 00000000..17eeed77
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/carrental.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/carwash.png b/production/example_apps/zippy_maps/webroot/img/icons/carwash.png
new file mode 100644
index 00000000..fb43f3ac
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/carwash.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/casino-2.png b/production/example_apps/zippy_maps/webroot/img/icons/casino-2.png
new file mode 100644
index 00000000..279d796d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/casino-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/castle-2.png b/production/example_apps/zippy_maps/webroot/img/icons/castle-2.png
new file mode 100644
index 00000000..b0214e8b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/castle-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cathedral.png b/production/example_apps/zippy_maps/webroot/img/icons/cathedral.png
new file mode 100644
index 00000000..893329fa
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cathedral.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/catholicgrave.png b/production/example_apps/zippy_maps/webroot/img/icons/catholicgrave.png
new file mode 100644
index 00000000..5b3a5a10
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/catholicgrave.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/caution.png b/production/example_apps/zippy_maps/webroot/img/icons/caution.png
new file mode 100644
index 00000000..22870806
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/caution.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cave-2.png b/production/example_apps/zippy_maps/webroot/img/icons/cave-2.png
new file mode 100644
index 00000000..af4fee28
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cave-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cctv.png b/production/example_apps/zippy_maps/webroot/img/icons/cctv.png
new file mode 100644
index 00000000..c0894fbe
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cctv.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cemetary.png b/production/example_apps/zippy_maps/webroot/img/icons/cemetary.png
new file mode 100644
index 00000000..0786fcc1
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cemetary.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/channelchange.png b/production/example_apps/zippy_maps/webroot/img/icons/channelchange.png
new file mode 100644
index 00000000..dea2df0a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/channelchange.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/chapel-2.png b/production/example_apps/zippy_maps/webroot/img/icons/chapel-2.png
new file mode 100644
index 00000000..aaf52019
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/chapel-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/chart-2.png b/production/example_apps/zippy_maps/webroot/img/icons/chart-2.png
new file mode 100644
index 00000000..b785ad7e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/chart-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cheese.png b/production/example_apps/zippy_maps/webroot/img/icons/cheese.png
new file mode 100644
index 00000000..6f33a177
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cheese.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/chemistry-2.png b/production/example_apps/zippy_maps/webroot/img/icons/chemistry-2.png
new file mode 100644
index 00000000..1303bf83
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/chemistry-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/chicken-2.png b/production/example_apps/zippy_maps/webroot/img/icons/chicken-2.png
new file mode 100644
index 00000000..5fca0625
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/chicken-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/childmuseum01.png b/production/example_apps/zippy_maps/webroot/img/icons/childmuseum01.png
new file mode 100644
index 00000000..461a2da8
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/childmuseum01.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/chiropractor.png b/production/example_apps/zippy_maps/webroot/img/icons/chiropractor.png
new file mode 100644
index 00000000..59cc506e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/chiropractor.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/christmasmarket.png b/production/example_apps/zippy_maps/webroot/img/icons/christmasmarket.png
new file mode 100644
index 00000000..f31cce34
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/christmasmarket.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/church-2.png b/production/example_apps/zippy_maps/webroot/img/icons/church-2.png
new file mode 100644
index 00000000..963ddc17
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/church-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cinema.png b/production/example_apps/zippy_maps/webroot/img/icons/cinema.png
new file mode 100644
index 00000000..8b367053
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cinema.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/circus.png b/production/example_apps/zippy_maps/webroot/img/icons/circus.png
new file mode 100644
index 00000000..63d38432
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/circus.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/citysquare.png b/production/example_apps/zippy_maps/webroot/img/icons/citysquare.png
new file mode 100644
index 00000000..c7fa3836
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/citysquare.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/citywalls.png b/production/example_apps/zippy_maps/webroot/img/icons/citywalls.png
new file mode 100644
index 00000000..dc08aa0b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/citywalls.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/climbing.png b/production/example_apps/zippy_maps/webroot/img/icons/climbing.png
new file mode 100644
index 00000000..1773b5aa
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/climbing.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/clock.png b/production/example_apps/zippy_maps/webroot/img/icons/clock.png
new file mode 100644
index 00000000..7bb357af
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/clock.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/closedroad.png b/production/example_apps/zippy_maps/webroot/img/icons/closedroad.png
new file mode 100644
index 00000000..79b936ef
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/closedroad.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/clothers_female.png b/production/example_apps/zippy_maps/webroot/img/icons/clothers_female.png
new file mode 100644
index 00000000..cf748bd4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/clothers_female.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/clothers_male.png b/production/example_apps/zippy_maps/webroot/img/icons/clothers_male.png
new file mode 100644
index 00000000..18f6bb11
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/clothers_male.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cloudy.png b/production/example_apps/zippy_maps/webroot/img/icons/cloudy.png
new file mode 100644
index 00000000..86c76d91
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cloudy.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cloudysunny.png b/production/example_apps/zippy_maps/webroot/img/icons/cloudysunny.png
new file mode 100644
index 00000000..b58a6582
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cloudysunny.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/coffee.png b/production/example_apps/zippy_maps/webroot/img/icons/coffee.png
new file mode 100644
index 00000000..47da029d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/coffee.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/coins.png b/production/example_apps/zippy_maps/webroot/img/icons/coins.png
new file mode 100644
index 00000000..3604df40
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/coins.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/comedyclub.png b/production/example_apps/zippy_maps/webroot/img/icons/comedyclub.png
new file mode 100644
index 00000000..f6723f11
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/comedyclub.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/comics.png b/production/example_apps/zippy_maps/webroot/img/icons/comics.png
new file mode 100644
index 00000000..a0692093
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/comics.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/comment-map-icon.png b/production/example_apps/zippy_maps/webroot/img/icons/comment-map-icon.png
new file mode 100644
index 00000000..7440b648
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/comment-map-icon.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/communitycentre.png b/production/example_apps/zippy_maps/webroot/img/icons/communitycentre.png
new file mode 100644
index 00000000..6a458e49
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/communitycentre.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/company.png b/production/example_apps/zippy_maps/webroot/img/icons/company.png
new file mode 100644
index 00000000..df9728d8
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/company.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/compost.png b/production/example_apps/zippy_maps/webroot/img/icons/compost.png
new file mode 100644
index 00000000..7fb98bb0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/compost.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/computers.png b/production/example_apps/zippy_maps/webroot/img/icons/computers.png
new file mode 100644
index 00000000..b82761ff
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/computers.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/condominium.png b/production/example_apps/zippy_maps/webroot/img/icons/condominium.png
new file mode 100644
index 00000000..34699b9b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/condominium.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/conference.png b/production/example_apps/zippy_maps/webroot/img/icons/conference.png
new file mode 100644
index 00000000..9c995d60
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/conference.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/congress.png b/production/example_apps/zippy_maps/webroot/img/icons/congress.png
new file mode 100644
index 00000000..9ca27202
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/congress.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/construction.png b/production/example_apps/zippy_maps/webroot/img/icons/construction.png
new file mode 100644
index 00000000..31955bcf
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/construction.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/constructioncrane.png b/production/example_apps/zippy_maps/webroot/img/icons/constructioncrane.png
new file mode 100644
index 00000000..86b4f083
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/constructioncrane.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/contract.png b/production/example_apps/zippy_maps/webroot/img/icons/contract.png
new file mode 100644
index 00000000..1b6c528e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/contract.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/conveniencestore.png b/production/example_apps/zippy_maps/webroot/img/icons/conveniencestore.png
new file mode 100644
index 00000000..76fb1ae0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/conveniencestore.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/convent-2.png b/production/example_apps/zippy_maps/webroot/img/icons/convent-2.png
new file mode 100644
index 00000000..6cf6c7f2
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/convent-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/conversation-map-icon.png b/production/example_apps/zippy_maps/webroot/img/icons/conversation-map-icon.png
new file mode 100644
index 00000000..8cad7a48
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/conversation-map-icon.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/convertible.png b/production/example_apps/zippy_maps/webroot/img/icons/convertible.png
new file mode 100644
index 00000000..6427150c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/convertible.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/corral.png b/production/example_apps/zippy_maps/webroot/img/icons/corral.png
new file mode 100644
index 00000000..529563da
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/corral.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/country.png b/production/example_apps/zippy_maps/webroot/img/icons/country.png
new file mode 100644
index 00000000..d58ff91f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/country.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/court.png b/production/example_apps/zippy_maps/webroot/img/icons/court.png
new file mode 100644
index 00000000..2bbcc4f7
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/court.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cow-export.png b/production/example_apps/zippy_maps/webroot/img/icons/cow-export.png
new file mode 100644
index 00000000..308a7ecd
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cow-export.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cowabduction.png b/production/example_apps/zippy_maps/webroot/img/icons/cowabduction.png
new file mode 100644
index 00000000..c791b689
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cowabduction.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/craftstore.png b/production/example_apps/zippy_maps/webroot/img/icons/craftstore.png
new file mode 100644
index 00000000..d7348f27
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/craftstore.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cramschool.png b/production/example_apps/zippy_maps/webroot/img/icons/cramschool.png
new file mode 100644
index 00000000..536e6795
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cramschool.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cricket.png b/production/example_apps/zippy_maps/webroot/img/icons/cricket.png
new file mode 100644
index 00000000..1a486763
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cricket.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/crimescene.png b/production/example_apps/zippy_maps/webroot/img/icons/crimescene.png
new file mode 100644
index 00000000..f7d97bdc
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/crimescene.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cromlech.png b/production/example_apps/zippy_maps/webroot/img/icons/cromlech.png
new file mode 100644
index 00000000..01678b82
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cromlech.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cropcircles.png b/production/example_apps/zippy_maps/webroot/img/icons/cropcircles.png
new file mode 100644
index 00000000..4febb9d9
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cropcircles.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cross-2.png b/production/example_apps/zippy_maps/webroot/img/icons/cross-2.png
new file mode 100644
index 00000000..508436a6
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cross-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/crossingguard.png b/production/example_apps/zippy_maps/webroot/img/icons/crossingguard.png
new file mode 100644
index 00000000..d8957d32
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/crossingguard.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cruiseship.png b/production/example_apps/zippy_maps/webroot/img/icons/cruiseship.png
new file mode 100644
index 00000000..3e316ecd
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cruiseship.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cup.png b/production/example_apps/zippy_maps/webroot/img/icons/cup.png
new file mode 100644
index 00000000..45610d21
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cup.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/curling-2.png b/production/example_apps/zippy_maps/webroot/img/icons/curling-2.png
new file mode 100644
index 00000000..575c0325
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/curling-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/currencyexchange.png b/production/example_apps/zippy_maps/webroot/img/icons/currencyexchange.png
new file mode 100644
index 00000000..4854fc22
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/currencyexchange.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/customs.png b/production/example_apps/zippy_maps/webroot/img/icons/customs.png
new file mode 100644
index 00000000..765a36c5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/customs.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cycling.png b/production/example_apps/zippy_maps/webroot/img/icons/cycling.png
new file mode 100644
index 00000000..32495851
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cycling.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cycling_feed.png b/production/example_apps/zippy_maps/webroot/img/icons/cycling_feed.png
new file mode 100644
index 00000000..b5253d9f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cycling_feed.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/cycling_sprint.png b/production/example_apps/zippy_maps/webroot/img/icons/cycling_sprint.png
new file mode 100644
index 00000000..ac4c49da
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/cycling_sprint.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/dam.png b/production/example_apps/zippy_maps/webroot/img/icons/dam.png
new file mode 100644
index 00000000..3f95aa02
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/dam.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/dance_class.png b/production/example_apps/zippy_maps/webroot/img/icons/dance_class.png
new file mode 100644
index 00000000..ffbdf817
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/dance_class.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/dancinghall.png b/production/example_apps/zippy_maps/webroot/img/icons/dancinghall.png
new file mode 100644
index 00000000..ac85e6c5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/dancinghall.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/database.png b/production/example_apps/zippy_maps/webroot/img/icons/database.png
new file mode 100644
index 00000000..c165320b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/database.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/daycare.png b/production/example_apps/zippy_maps/webroot/img/icons/daycare.png
new file mode 100644
index 00000000..01a0f158
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/daycare.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/deepseafishing.png b/production/example_apps/zippy_maps/webroot/img/icons/deepseafishing.png
new file mode 100644
index 00000000..7d3bafca
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/deepseafishing.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/deer.png b/production/example_apps/zippy_maps/webroot/img/icons/deer.png
new file mode 100644
index 00000000..e7c18423
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/deer.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/dentist.png b/production/example_apps/zippy_maps/webroot/img/icons/dentist.png
new file mode 100644
index 00000000..db929f65
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/dentist.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/departmentstore.png b/production/example_apps/zippy_maps/webroot/img/icons/departmentstore.png
new file mode 100644
index 00000000..50066de2
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/departmentstore.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/desert-2.png b/production/example_apps/zippy_maps/webroot/img/icons/desert-2.png
new file mode 100644
index 00000000..80cba1e0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/desert-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/dinopark.png b/production/example_apps/zippy_maps/webroot/img/icons/dinopark.png
new file mode 100644
index 00000000..ee291276
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/dinopark.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/direction_down.png b/production/example_apps/zippy_maps/webroot/img/icons/direction_down.png
new file mode 100644
index 00000000..137d6693
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/direction_down.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/disability.png b/production/example_apps/zippy_maps/webroot/img/icons/disability.png
new file mode 100644
index 00000000..29edde1c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/disability.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/diving.png b/production/example_apps/zippy_maps/webroot/img/icons/diving.png
new file mode 100644
index 00000000..7c33a246
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/diving.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/dogs_leash.png b/production/example_apps/zippy_maps/webroot/img/icons/dogs_leash.png
new file mode 100644
index 00000000..e4aac25c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/dogs_leash.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/dolphins.png b/production/example_apps/zippy_maps/webroot/img/icons/dolphins.png
new file mode 100644
index 00000000..f7b45829
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/dolphins.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/doublebendright.png b/production/example_apps/zippy_maps/webroot/img/icons/doublebendright.png
new file mode 100644
index 00000000..5f122c47
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/doublebendright.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/downloadicon.png b/production/example_apps/zippy_maps/webroot/img/icons/downloadicon.png
new file mode 100644
index 00000000..0f1f47c4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/downloadicon.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/drinkingfountain.png b/production/example_apps/zippy_maps/webroot/img/icons/drinkingfountain.png
new file mode 100644
index 00000000..e1db9f45
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/drinkingfountain.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/drinkingwater.png b/production/example_apps/zippy_maps/webroot/img/icons/drinkingwater.png
new file mode 100644
index 00000000..84134b72
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/drinkingwater.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/drugstore.png b/production/example_apps/zippy_maps/webroot/img/icons/drugstore.png
new file mode 100644
index 00000000..c46e6a1a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/drugstore.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/duck-export.png b/production/example_apps/zippy_maps/webroot/img/icons/duck-export.png
new file mode 100644
index 00000000..a3bca91a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/duck-export.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/earthquake-3.png b/production/example_apps/zippy_maps/webroot/img/icons/earthquake-3.png
new file mode 100644
index 00000000..74414cdf
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/earthquake-3.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/eggs.png b/production/example_apps/zippy_maps/webroot/img/icons/eggs.png
new file mode 100644
index 00000000..9f5368db
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/eggs.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/elephants.png b/production/example_apps/zippy_maps/webroot/img/icons/elephants.png
new file mode 100644
index 00000000..cbaefdaa
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/elephants.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/elevator.png b/production/example_apps/zippy_maps/webroot/img/icons/elevator.png
new file mode 100644
index 00000000..92673479
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/elevator.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/elevator_down.png b/production/example_apps/zippy_maps/webroot/img/icons/elevator_down.png
new file mode 100644
index 00000000..834e02da
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/elevator_down.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/elevator_up.png b/production/example_apps/zippy_maps/webroot/img/icons/elevator_up.png
new file mode 100644
index 00000000..57f11fbc
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/elevator_up.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/embassy.png b/production/example_apps/zippy_maps/webroot/img/icons/embassy.png
new file mode 100644
index 00000000..87b65d4f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/embassy.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/entrance.png b/production/example_apps/zippy_maps/webroot/img/icons/entrance.png
new file mode 100644
index 00000000..186ee6fd
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/entrance.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/exchequer.png b/production/example_apps/zippy_maps/webroot/img/icons/exchequer.png
new file mode 100644
index 00000000..3c8cc22d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/exchequer.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/exit.png b/production/example_apps/zippy_maps/webroot/img/icons/exit.png
new file mode 100644
index 00000000..d7af8369
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/exit.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/expert.png b/production/example_apps/zippy_maps/webroot/img/icons/expert.png
new file mode 100644
index 00000000..a876f35f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/expert.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/factory.png b/production/example_apps/zippy_maps/webroot/img/icons/factory.png
new file mode 100644
index 00000000..d9213def
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/factory.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fallingrocks.png b/production/example_apps/zippy_maps/webroot/img/icons/fallingrocks.png
new file mode 100644
index 00000000..5509d858
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fallingrocks.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/family.png b/production/example_apps/zippy_maps/webroot/img/icons/family.png
new file mode 100644
index 00000000..473b2fbb
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/family.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/farm-2.png b/production/example_apps/zippy_maps/webroot/img/icons/farm-2.png
new file mode 100644
index 00000000..7021e76b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/farm-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/farmstand.png b/production/example_apps/zippy_maps/webroot/img/icons/farmstand.png
new file mode 100644
index 00000000..7fe36781
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/farmstand.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fastfood.png b/production/example_apps/zippy_maps/webroot/img/icons/fastfood.png
new file mode 100644
index 00000000..4373485d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fastfood.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/female-2.png b/production/example_apps/zippy_maps/webroot/img/icons/female-2.png
new file mode 100644
index 00000000..b74dfbf4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/female-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/ferriswheel.png b/production/example_apps/zippy_maps/webroot/img/icons/ferriswheel.png
new file mode 100644
index 00000000..4b703258
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/ferriswheel.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/ferry.png b/production/example_apps/zippy_maps/webroot/img/icons/ferry.png
new file mode 100644
index 00000000..34cb864a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/ferry.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/festival.png b/production/example_apps/zippy_maps/webroot/img/icons/festival.png
new file mode 100644
index 00000000..0d6577f0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/festival.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fetalalcoholsyndrom.png b/production/example_apps/zippy_maps/webroot/img/icons/fetalalcoholsyndrom.png
new file mode 100644
index 00000000..a7c87f69
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fetalalcoholsyndrom.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/field.png b/production/example_apps/zippy_maps/webroot/img/icons/field.png
new file mode 100644
index 00000000..8c2637c3
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/field.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fillingstation.png b/production/example_apps/zippy_maps/webroot/img/icons/fillingstation.png
new file mode 100644
index 00000000..c50baba5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fillingstation.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/findajob.png b/production/example_apps/zippy_maps/webroot/img/icons/findajob.png
new file mode 100644
index 00000000..7f2d27f8
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/findajob.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/finish.png b/production/example_apps/zippy_maps/webroot/img/icons/finish.png
new file mode 100644
index 00000000..85756164
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/finish.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fire-hydrant-2.png b/production/example_apps/zippy_maps/webroot/img/icons/fire-hydrant-2.png
new file mode 100644
index 00000000..97b62e7d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fire-hydrant-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fire.png b/production/example_apps/zippy_maps/webroot/img/icons/fire.png
new file mode 100644
index 00000000..b1fe48ad
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fire.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fireexstinguisher.png b/production/example_apps/zippy_maps/webroot/img/icons/fireexstinguisher.png
new file mode 100644
index 00000000..6517b7d7
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fireexstinguisher.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/firemen.png b/production/example_apps/zippy_maps/webroot/img/icons/firemen.png
new file mode 100644
index 00000000..2f5f7c77
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/firemen.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fireworks.png b/production/example_apps/zippy_maps/webroot/img/icons/fireworks.png
new file mode 100644
index 00000000..a091e783
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fireworks.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/firstaid.png b/production/example_apps/zippy_maps/webroot/img/icons/firstaid.png
new file mode 100644
index 00000000..fdb5b59e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/firstaid.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fishchips.png b/production/example_apps/zippy_maps/webroot/img/icons/fishchips.png
new file mode 100644
index 00000000..a0dedac4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fishchips.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fishing.png b/production/example_apps/zippy_maps/webroot/img/icons/fishing.png
new file mode 100644
index 00000000..5e482f02
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fishing.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fishingboat.png b/production/example_apps/zippy_maps/webroot/img/icons/fishingboat.png
new file mode 100644
index 00000000..3aa4a526
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fishingboat.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fishingstore.png b/production/example_apps/zippy_maps/webroot/img/icons/fishingstore.png
new file mode 100644
index 00000000..50dc155f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fishingstore.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fitness.png b/production/example_apps/zippy_maps/webroot/img/icons/fitness.png
new file mode 100644
index 00000000..9cf72d0e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fitness.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fjord-2.png b/production/example_apps/zippy_maps/webroot/img/icons/fjord-2.png
new file mode 100644
index 00000000..637784a8
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fjord-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/flag-export.png b/production/example_apps/zippy_maps/webroot/img/icons/flag-export.png
new file mode 100644
index 00000000..c9637979
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/flag-export.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/flood.png b/production/example_apps/zippy_maps/webroot/img/icons/flood.png
new file mode 100644
index 00000000..2ab1b9fd
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/flood.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/flowers.png b/production/example_apps/zippy_maps/webroot/img/icons/flowers.png
new file mode 100644
index 00000000..e80d390b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/flowers.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/folder-2.png b/production/example_apps/zippy_maps/webroot/img/icons/folder-2.png
new file mode 100644
index 00000000..762a869e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/folder-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fooddeliveryservice.png b/production/example_apps/zippy_maps/webroot/img/icons/fooddeliveryservice.png
new file mode 100644
index 00000000..b27badee
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fooddeliveryservice.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/foodtruck.png b/production/example_apps/zippy_maps/webroot/img/icons/foodtruck.png
new file mode 100644
index 00000000..586d6705
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/foodtruck.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/footprint.png b/production/example_apps/zippy_maps/webroot/img/icons/footprint.png
new file mode 100644
index 00000000..5f19ddb2
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/footprint.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/ford-2.png b/production/example_apps/zippy_maps/webroot/img/icons/ford-2.png
new file mode 100644
index 00000000..a48d1cc7
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/ford-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/forest.png b/production/example_apps/zippy_maps/webroot/img/icons/forest.png
new file mode 100644
index 00000000..b9c8eeed
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/forest.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/forest2.png b/production/example_apps/zippy_maps/webroot/img/icons/forest2.png
new file mode 100644
index 00000000..4102937f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/forest2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fossils.png b/production/example_apps/zippy_maps/webroot/img/icons/fossils.png
new file mode 100644
index 00000000..423ef396
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fossils.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/foundry-2.png b/production/example_apps/zippy_maps/webroot/img/icons/foundry-2.png
new file mode 100644
index 00000000..0c16b099
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/foundry-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fountain-2.png b/production/example_apps/zippy_maps/webroot/img/icons/fountain-2.png
new file mode 100644
index 00000000..d5c8a04f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fountain-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fourbyfour.png b/production/example_apps/zippy_maps/webroot/img/icons/fourbyfour.png
new file mode 100644
index 00000000..60e8232b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fourbyfour.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/freqchg.png b/production/example_apps/zippy_maps/webroot/img/icons/freqchg.png
new file mode 100644
index 00000000..8d081538
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/freqchg.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/frog-2.png b/production/example_apps/zippy_maps/webroot/img/icons/frog-2.png
new file mode 100644
index 00000000..27d2d4f8
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/frog-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/fruits.png b/production/example_apps/zippy_maps/webroot/img/icons/fruits.png
new file mode 100644
index 00000000..c147a118
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/fruits.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/ft.png b/production/example_apps/zippy_maps/webroot/img/icons/ft.png
new file mode 100644
index 00000000..e95706c5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/ft.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/funicolar-22x22.png b/production/example_apps/zippy_maps/webroot/img/icons/funicolar-22x22.png
new file mode 100644
index 00000000..ade87fbf
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/funicolar-22x22.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/gas_cylinder1.png b/production/example_apps/zippy_maps/webroot/img/icons/gas_cylinder1.png
new file mode 100644
index 00000000..26bebccd
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/gas_cylinder1.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/gay-female.png b/production/example_apps/zippy_maps/webroot/img/icons/gay-female.png
new file mode 100644
index 00000000..bd8fa805
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/gay-female.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/gay-male.png b/production/example_apps/zippy_maps/webroot/img/icons/gay-male.png
new file mode 100644
index 00000000..1379043f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/gay-male.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/geocaching-3.png b/production/example_apps/zippy_maps/webroot/img/icons/geocaching-3.png
new file mode 100644
index 00000000..067210c6
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/geocaching-3.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/geothermal-site.png b/production/example_apps/zippy_maps/webroot/img/icons/geothermal-site.png
new file mode 100644
index 00000000..a7d112e7
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/geothermal-site.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/geyser-2.png b/production/example_apps/zippy_maps/webroot/img/icons/geyser-2.png
new file mode 100644
index 00000000..2cf4a579
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/geyser-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/ghosttown.png b/production/example_apps/zippy_maps/webroot/img/icons/ghosttown.png
new file mode 100644
index 00000000..fc92196b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/ghosttown.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/gifts.png b/production/example_apps/zippy_maps/webroot/img/icons/gifts.png
new file mode 100644
index 00000000..90869705
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/gifts.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/glacier-2.png b/production/example_apps/zippy_maps/webroot/img/icons/glacier-2.png
new file mode 100644
index 00000000..3fb47e70
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/glacier-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/glasses.png b/production/example_apps/zippy_maps/webroot/img/icons/glasses.png
new file mode 100644
index 00000000..cf908fe4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/glasses.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/golfing.png b/production/example_apps/zippy_maps/webroot/img/icons/golfing.png
new file mode 100644
index 00000000..0a48c674
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/golfing.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/gondola-2.png b/production/example_apps/zippy_maps/webroot/img/icons/gondola-2.png
new file mode 100644
index 00000000..806ab79a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/gondola-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/gourmet_0star.png b/production/example_apps/zippy_maps/webroot/img/icons/gourmet_0star.png
new file mode 100644
index 00000000..436b707a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/gourmet_0star.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/grass.png b/production/example_apps/zippy_maps/webroot/img/icons/grass.png
new file mode 100644
index 00000000..6f2fe5e4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/grass.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/grocery.png b/production/example_apps/zippy_maps/webroot/img/icons/grocery.png
new file mode 100644
index 00000000..ffa7fbf1
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/grocery.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/group-2.png b/production/example_apps/zippy_maps/webroot/img/icons/group-2.png
new file mode 100644
index 00000000..7bf96939
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/group-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/gumball_machine.png b/production/example_apps/zippy_maps/webroot/img/icons/gumball_machine.png
new file mode 100644
index 00000000..ff56abb1
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/gumball_machine.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/handball.png b/production/example_apps/zippy_maps/webroot/img/icons/handball.png
new file mode 100644
index 00000000..672ad076
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/handball.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/hanggliding.png b/production/example_apps/zippy_maps/webroot/img/icons/hanggliding.png
new file mode 100644
index 00000000..00ddbb61
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/hanggliding.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/harbor.png b/production/example_apps/zippy_maps/webroot/img/icons/harbor.png
new file mode 100644
index 00000000..382ac8a3
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/harbor.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/hare1.png b/production/example_apps/zippy_maps/webroot/img/icons/hare1.png
new file mode 100644
index 00000000..10bcc4f5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/hare1.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/hats.png b/production/example_apps/zippy_maps/webroot/img/icons/hats.png
new file mode 100644
index 00000000..68760007
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/hats.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/haybale.png b/production/example_apps/zippy_maps/webroot/img/icons/haybale.png
new file mode 100644
index 00000000..53337ba9
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/haybale.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/headstone-2.png b/production/example_apps/zippy_maps/webroot/img/icons/headstone-2.png
new file mode 100644
index 00000000..356b2053
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/headstone-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/helicopter.png b/production/example_apps/zippy_maps/webroot/img/icons/helicopter.png
new file mode 100644
index 00000000..d34a824c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/helicopter.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/highhills.png b/production/example_apps/zippy_maps/webroot/img/icons/highhills.png
new file mode 100644
index 00000000..e0159c56
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/highhills.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/highschool.png b/production/example_apps/zippy_maps/webroot/img/icons/highschool.png
new file mode 100644
index 00000000..afe7796f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/highschool.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/highway.png b/production/example_apps/zippy_maps/webroot/img/icons/highway.png
new file mode 100644
index 00000000..ac77fbf6
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/highway.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/hiking.png b/production/example_apps/zippy_maps/webroot/img/icons/hiking.png
new file mode 100644
index 00000000..4b3222de
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/hiking.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/historical_museum.png b/production/example_apps/zippy_maps/webroot/img/icons/historical_museum.png
new file mode 100644
index 00000000..cdb12c0d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/historical_museum.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/historicalquarter.png b/production/example_apps/zippy_maps/webroot/img/icons/historicalquarter.png
new file mode 100644
index 00000000..f122de29
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/historicalquarter.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/hoergeraeteakustiker_22px.png b/production/example_apps/zippy_maps/webroot/img/icons/hoergeraeteakustiker_22px.png
new file mode 100644
index 00000000..0827eff9
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/hoergeraeteakustiker_22px.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/home-2.png b/production/example_apps/zippy_maps/webroot/img/icons/home-2.png
new file mode 100644
index 00000000..8ee55446
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/home-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/homecenter.png b/production/example_apps/zippy_maps/webroot/img/icons/homecenter.png
new file mode 100644
index 00000000..1adce316
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/homecenter.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/honeycomb.png b/production/example_apps/zippy_maps/webroot/img/icons/honeycomb.png
new file mode 100644
index 00000000..8a9c3fb2
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/honeycomb.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/hookah_final.png b/production/example_apps/zippy_maps/webroot/img/icons/hookah_final.png
new file mode 100644
index 00000000..eab39f5f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/hookah_final.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/horseriding.png b/production/example_apps/zippy_maps/webroot/img/icons/horseriding.png
new file mode 100644
index 00000000..913afeb2
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/horseriding.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/hospital-building.png b/production/example_apps/zippy_maps/webroot/img/icons/hospital-building.png
new file mode 100644
index 00000000..49b5ffc5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/hospital-building.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/hostel_0star.png b/production/example_apps/zippy_maps/webroot/img/icons/hostel_0star.png
new file mode 100644
index 00000000..b12cef11
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/hostel_0star.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/hotairbaloon.png b/production/example_apps/zippy_maps/webroot/img/icons/hotairbaloon.png
new file mode 100644
index 00000000..b22c75e1
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/hotairbaloon.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/hotel_0star.png b/production/example_apps/zippy_maps/webroot/img/icons/hotel_0star.png
new file mode 100644
index 00000000..62ac992b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/hotel_0star.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/hotspring.png b/production/example_apps/zippy_maps/webroot/img/icons/hotspring.png
new file mode 100644
index 00000000..9cc39807
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/hotspring.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/house.png b/production/example_apps/zippy_maps/webroot/img/icons/house.png
new file mode 100644
index 00000000..5b609b82
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/house.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/hunting.png b/production/example_apps/zippy_maps/webroot/img/icons/hunting.png
new file mode 100644
index 00000000..c509e4c5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/hunting.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/hut.png b/production/example_apps/zippy_maps/webroot/img/icons/hut.png
new file mode 100644
index 00000000..0669aa7f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/hut.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/icecream.png b/production/example_apps/zippy_maps/webroot/img/icons/icecream.png
new file mode 100644
index 00000000..56e0689e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/icecream.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/icehockey.png b/production/example_apps/zippy_maps/webroot/img/icons/icehockey.png
new file mode 100644
index 00000000..6c3414ec
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/icehockey.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/iceskating.png b/production/example_apps/zippy_maps/webroot/img/icons/iceskating.png
new file mode 100644
index 00000000..fc15fc3c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/iceskating.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/icy_road.png b/production/example_apps/zippy_maps/webroot/img/icons/icy_road.png
new file mode 100644
index 00000000..b825030d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/icy_road.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/indoor-arena.png b/production/example_apps/zippy_maps/webroot/img/icons/indoor-arena.png
new file mode 100644
index 00000000..540c9177
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/indoor-arena.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/information.png b/production/example_apps/zippy_maps/webroot/img/icons/information.png
new file mode 100644
index 00000000..6ac10a48
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/information.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/iobridge.png b/production/example_apps/zippy_maps/webroot/img/icons/iobridge.png
new file mode 100644
index 00000000..6d29eb05
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/iobridge.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/jacuzzi.png b/production/example_apps/zippy_maps/webroot/img/icons/jacuzzi.png
new file mode 100644
index 00000000..a2f96d19
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/jacuzzi.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/japanese-food.png b/production/example_apps/zippy_maps/webroot/img/icons/japanese-food.png
new file mode 100644
index 00000000..2425c5ba
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/japanese-food.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/japanese-lantern.png b/production/example_apps/zippy_maps/webroot/img/icons/japanese-lantern.png
new file mode 100644
index 00000000..54dec40a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/japanese-lantern.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/japanese-sake.png b/production/example_apps/zippy_maps/webroot/img/icons/japanese-sake.png
new file mode 100644
index 00000000..f1e030e6
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/japanese-sake.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/japanese-sweet-2.png b/production/example_apps/zippy_maps/webroot/img/icons/japanese-sweet-2.png
new file mode 100644
index 00000000..41d87a16
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/japanese-sweet-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/japanese-temple.png b/production/example_apps/zippy_maps/webroot/img/icons/japanese-temple.png
new file mode 100644
index 00000000..d9a8e821
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/japanese-temple.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/jazzclub.png b/production/example_apps/zippy_maps/webroot/img/icons/jazzclub.png
new file mode 100644
index 00000000..36dd64fc
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/jazzclub.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/jeep.png b/production/example_apps/zippy_maps/webroot/img/icons/jeep.png
new file mode 100644
index 00000000..a6dad3b4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/jeep.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/jetfighter.png b/production/example_apps/zippy_maps/webroot/img/icons/jetfighter.png
new file mode 100644
index 00000000..88a88645
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/jetfighter.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/jewelry.png b/production/example_apps/zippy_maps/webroot/img/icons/jewelry.png
new file mode 100644
index 00000000..574d087d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/jewelry.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/jewishgrave.png b/production/example_apps/zippy_maps/webroot/img/icons/jewishgrave.png
new file mode 100644
index 00000000..4ad43d66
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/jewishgrave.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/jewishquarter.png b/production/example_apps/zippy_maps/webroot/img/icons/jewishquarter.png
new file mode 100644
index 00000000..d796d113
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/jewishquarter.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/jogging.png b/production/example_apps/zippy_maps/webroot/img/icons/jogging.png
new file mode 100644
index 00000000..889437c3
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/jogging.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/judo.png b/production/example_apps/zippy_maps/webroot/img/icons/judo.png
new file mode 100644
index 00000000..df11b1b9
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/judo.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/junction.png b/production/example_apps/zippy_maps/webroot/img/icons/junction.png
new file mode 100644
index 00000000..cefaf8ed
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/junction.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/karate.png b/production/example_apps/zippy_maps/webroot/img/icons/karate.png
new file mode 100644
index 00000000..7d569102
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/karate.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/karting.png b/production/example_apps/zippy_maps/webroot/img/icons/karting.png
new file mode 100644
index 00000000..9bccb76a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/karting.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/kayak1.png b/production/example_apps/zippy_maps/webroot/img/icons/kayak1.png
new file mode 100644
index 00000000..1b1c3c65
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/kayak1.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/kayaking.png b/production/example_apps/zippy_maps/webroot/img/icons/kayaking.png
new file mode 100644
index 00000000..c2ad2aad
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/kayaking.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/kebab.png b/production/example_apps/zippy_maps/webroot/img/icons/kebab.png
new file mode 100644
index 00000000..f70089ad
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/kebab.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/kingair.png b/production/example_apps/zippy_maps/webroot/img/icons/kingair.png
new file mode 100644
index 00000000..71d41273
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/kingair.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/kiosk.png b/production/example_apps/zippy_maps/webroot/img/icons/kiosk.png
new file mode 100644
index 00000000..55ddef42
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/kiosk.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/kitesurfing.png b/production/example_apps/zippy_maps/webroot/img/icons/kitesurfing.png
new file mode 100644
index 00000000..345f3711
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/kitesurfing.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/laboratory.png b/production/example_apps/zippy_maps/webroot/img/icons/laboratory.png
new file mode 100644
index 00000000..b6159dfb
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/laboratory.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/lake.png b/production/example_apps/zippy_maps/webroot/img/icons/lake.png
new file mode 100644
index 00000000..2ebb5ba3
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/lake.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/landfill.png b/production/example_apps/zippy_maps/webroot/img/icons/landfill.png
new file mode 100644
index 00000000..569f3b8d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/landfill.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/landmark.png b/production/example_apps/zippy_maps/webroot/img/icons/landmark.png
new file mode 100644
index 00000000..bfa95e39
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/landmark.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/laterne.png b/production/example_apps/zippy_maps/webroot/img/icons/laterne.png
new file mode 100644
index 00000000..899b4e02
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/laterne.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/laundromat.png b/production/example_apps/zippy_maps/webroot/img/icons/laundromat.png
new file mode 100644
index 00000000..dc5ccbff
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/laundromat.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/levelcrossing.png b/production/example_apps/zippy_maps/webroot/img/icons/levelcrossing.png
new file mode 100644
index 00000000..65c20b2d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/levelcrossing.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/library.png b/production/example_apps/zippy_maps/webroot/img/icons/library.png
new file mode 100644
index 00000000..2df51af4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/library.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/lifeguard-2.png b/production/example_apps/zippy_maps/webroot/img/icons/lifeguard-2.png
new file mode 100644
index 00000000..5db8c77c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/lifeguard-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/lighthouse-2.png b/production/example_apps/zippy_maps/webroot/img/icons/lighthouse-2.png
new file mode 100644
index 00000000..7b698a1d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/lighthouse-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/linedown.png b/production/example_apps/zippy_maps/webroot/img/icons/linedown.png
new file mode 100644
index 00000000..03337d09
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/linedown.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/lingerie.png b/production/example_apps/zippy_maps/webroot/img/icons/lingerie.png
new file mode 100644
index 00000000..9c285d80
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/lingerie.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/liquor.png b/production/example_apps/zippy_maps/webroot/img/icons/liquor.png
new file mode 100644
index 00000000..be5b352b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/liquor.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/lobster-export.png b/production/example_apps/zippy_maps/webroot/img/icons/lobster-export.png
new file mode 100644
index 00000000..0b8424db
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/lobster-export.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/lock.png b/production/example_apps/zippy_maps/webroot/img/icons/lock.png
new file mode 100644
index 00000000..7fbd7834
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/lock.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/lockerrental.png b/production/example_apps/zippy_maps/webroot/img/icons/lockerrental.png
new file mode 100644
index 00000000..75c6cfcb
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/lockerrental.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/lodging_0star.png b/production/example_apps/zippy_maps/webroot/img/icons/lodging_0star.png
new file mode 100644
index 00000000..b122791d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/lodging_0star.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/love_date.png b/production/example_apps/zippy_maps/webroot/img/icons/love_date.png
new file mode 100644
index 00000000..1a50c223
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/love_date.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/loveinterest.png b/production/example_apps/zippy_maps/webroot/img/icons/loveinterest.png
new file mode 100644
index 00000000..e374e5e6
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/loveinterest.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/magicshow.png b/production/example_apps/zippy_maps/webroot/img/icons/magicshow.png
new file mode 100644
index 00000000..0dd7a3d9
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/magicshow.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/mainroad.png b/production/example_apps/zippy_maps/webroot/img/icons/mainroad.png
new file mode 100644
index 00000000..6733f535
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/mainroad.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/male-2.png b/production/example_apps/zippy_maps/webroot/img/icons/male-2.png
new file mode 100644
index 00000000..b0e4b403
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/male-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/mall.png b/production/example_apps/zippy_maps/webroot/img/icons/mall.png
new file mode 100644
index 00000000..74c05f8e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/mall.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/map.png b/production/example_apps/zippy_maps/webroot/img/icons/map.png
new file mode 100644
index 00000000..8935d3fe
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/map.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/mapicon.png b/production/example_apps/zippy_maps/webroot/img/icons/mapicon.png
new file mode 100644
index 00000000..8d7691cb
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/mapicon.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/marina-2.png b/production/example_apps/zippy_maps/webroot/img/icons/marina-2.png
new file mode 100644
index 00000000..58f859e2
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/marina-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/market.png b/production/example_apps/zippy_maps/webroot/img/icons/market.png
new file mode 100644
index 00000000..01db73d6
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/market.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/massage.png b/production/example_apps/zippy_maps/webroot/img/icons/massage.png
new file mode 100644
index 00000000..7e996eba
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/massage.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/mastcrane1.png b/production/example_apps/zippy_maps/webroot/img/icons/mastcrane1.png
new file mode 100644
index 00000000..43e2e20c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/mastcrane1.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/medicalstore.png b/production/example_apps/zippy_maps/webroot/img/icons/medicalstore.png
new file mode 100644
index 00000000..bd6207a0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/medicalstore.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/medicine.png b/production/example_apps/zippy_maps/webroot/img/icons/medicine.png
new file mode 100644
index 00000000..1fcd3c92
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/medicine.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/megalith.png b/production/example_apps/zippy_maps/webroot/img/icons/megalith.png
new file mode 100644
index 00000000..a809cfc0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/megalith.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/memorial.png b/production/example_apps/zippy_maps/webroot/img/icons/memorial.png
new file mode 100644
index 00000000..2cd4500f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/memorial.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/metronetwork.png b/production/example_apps/zippy_maps/webroot/img/icons/metronetwork.png
new file mode 100644
index 00000000..23770e49
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/metronetwork.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/military.png b/production/example_apps/zippy_maps/webroot/img/icons/military.png
new file mode 100644
index 00000000..f63477ca
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/military.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/mine.png b/production/example_apps/zippy_maps/webroot/img/icons/mine.png
new file mode 100644
index 00000000..45224b23
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/mine.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/missile-2.png b/production/example_apps/zippy_maps/webroot/img/icons/missile-2.png
new file mode 100644
index 00000000..f2a0d218
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/missile-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/mobilephonetower.png b/production/example_apps/zippy_maps/webroot/img/icons/mobilephonetower.png
new file mode 100644
index 00000000..9872a32f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/mobilephonetower.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/modernmonument.png b/production/example_apps/zippy_maps/webroot/img/icons/modernmonument.png
new file mode 100644
index 00000000..274543a5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/modernmonument.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/moderntower.png b/production/example_apps/zippy_maps/webroot/img/icons/moderntower.png
new file mode 100644
index 00000000..78adabd1
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/moderntower.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/monkey-export.png b/production/example_apps/zippy_maps/webroot/img/icons/monkey-export.png
new file mode 100644
index 00000000..298ea761
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/monkey-export.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/monument-historique-icon-white-22x22.png b/production/example_apps/zippy_maps/webroot/img/icons/monument-historique-icon-white-22x22.png
new file mode 100644
index 00000000..566b39dc
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/monument-historique-icon-white-22x22.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/monument.png b/production/example_apps/zippy_maps/webroot/img/icons/monument.png
new file mode 100644
index 00000000..516c0d8b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/monument.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/moonstar.png b/production/example_apps/zippy_maps/webroot/img/icons/moonstar.png
new file mode 100644
index 00000000..30fd02e3
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/moonstar.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/mosquee.png b/production/example_apps/zippy_maps/webroot/img/icons/mosquee.png
new file mode 100644
index 00000000..1827972f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/mosquee.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/mosquito-2.png b/production/example_apps/zippy_maps/webroot/img/icons/mosquito-2.png
new file mode 100644
index 00000000..54f7d1e8
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/mosquito-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/motel-2.png b/production/example_apps/zippy_maps/webroot/img/icons/motel-2.png
new file mode 100644
index 00000000..eafd06c3
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/motel-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/motorbike.png b/production/example_apps/zippy_maps/webroot/img/icons/motorbike.png
new file mode 100644
index 00000000..6590c6ca
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/motorbike.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/motorcycle.png b/production/example_apps/zippy_maps/webroot/img/icons/motorcycle.png
new file mode 100644
index 00000000..c8fdea0b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/motorcycle.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/mountain-pass-locator-diagonal-reverse-export.png b/production/example_apps/zippy_maps/webroot/img/icons/mountain-pass-locator-diagonal-reverse-export.png
new file mode 100644
index 00000000..e8b71fbf
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/mountain-pass-locator-diagonal-reverse-export.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/mountainbiking-3.png b/production/example_apps/zippy_maps/webroot/img/icons/mountainbiking-3.png
new file mode 100644
index 00000000..55ebb37b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/mountainbiking-3.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/mountains.png b/production/example_apps/zippy_maps/webroot/img/icons/mountains.png
new file mode 100644
index 00000000..a6559e73
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/mountains.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/movierental.png b/production/example_apps/zippy_maps/webroot/img/icons/movierental.png
new file mode 100644
index 00000000..22068737
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/movierental.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/moving-walkway-enter-export.png b/production/example_apps/zippy_maps/webroot/img/icons/moving-walkway-enter-export.png
new file mode 100644
index 00000000..0fa5388a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/moving-walkway-enter-export.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/muffin_bagle.png b/production/example_apps/zippy_maps/webroot/img/icons/muffin_bagle.png
new file mode 100644
index 00000000..bd8ae9c0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/muffin_bagle.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/mural.png b/production/example_apps/zippy_maps/webroot/img/icons/mural.png
new file mode 100644
index 00000000..846476cc
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/mural.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/museum_archeological.png b/production/example_apps/zippy_maps/webroot/img/icons/museum_archeological.png
new file mode 100644
index 00000000..0924e1f5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/museum_archeological.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/museum_art.png b/production/example_apps/zippy_maps/webroot/img/icons/museum_art.png
new file mode 100644
index 00000000..f7e8033c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/museum_art.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/museum_crafts.png b/production/example_apps/zippy_maps/webroot/img/icons/museum_crafts.png
new file mode 100644
index 00000000..783eacc0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/museum_crafts.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/museum_industry.png b/production/example_apps/zippy_maps/webroot/img/icons/museum_industry.png
new file mode 100644
index 00000000..566fe3a1
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/museum_industry.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/museum_naval.png b/production/example_apps/zippy_maps/webroot/img/icons/museum_naval.png
new file mode 100644
index 00000000..b977ea0d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/museum_naval.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/museum_openair.png b/production/example_apps/zippy_maps/webroot/img/icons/museum_openair.png
new file mode 100644
index 00000000..34315c30
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/museum_openair.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/museum_science.png b/production/example_apps/zippy_maps/webroot/img/icons/museum_science.png
new file mode 100644
index 00000000..4c9ada58
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/museum_science.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/museum_war.png b/production/example_apps/zippy_maps/webroot/img/icons/museum_war.png
new file mode 100644
index 00000000..4adbc117
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/museum_war.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/mushroom.png b/production/example_apps/zippy_maps/webroot/img/icons/mushroom.png
new file mode 100644
index 00000000..90c9a2c4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/mushroom.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/music.png b/production/example_apps/zippy_maps/webroot/img/icons/music.png
new file mode 100644
index 00000000..08923333
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/music.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/music_choral.png b/production/example_apps/zippy_maps/webroot/img/icons/music_choral.png
new file mode 100644
index 00000000..d8a8f3c4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/music_choral.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/music_classical.png b/production/example_apps/zippy_maps/webroot/img/icons/music_classical.png
new file mode 100644
index 00000000..bdbd38ca
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/music_classical.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/music_hiphop.png b/production/example_apps/zippy_maps/webroot/img/icons/music_hiphop.png
new file mode 100644
index 00000000..2297968e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/music_hiphop.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/music_live.png b/production/example_apps/zippy_maps/webroot/img/icons/music_live.png
new file mode 100644
index 00000000..47d2d78c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/music_live.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/music_rock.png b/production/example_apps/zippy_maps/webroot/img/icons/music_rock.png
new file mode 100644
index 00000000..590e8b2b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/music_rock.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/nanny.png b/production/example_apps/zippy_maps/webroot/img/icons/nanny.png
new file mode 100644
index 00000000..375014d3
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/nanny.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/ne_barn-2.png b/production/example_apps/zippy_maps/webroot/img/icons/ne_barn-2.png
new file mode 100644
index 00000000..78ca58ec
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/ne_barn-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/newsagent.png b/production/example_apps/zippy_maps/webroot/img/icons/newsagent.png
new file mode 100644
index 00000000..2fcf253d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/newsagent.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/no-nuke-export.png b/production/example_apps/zippy_maps/webroot/img/icons/no-nuke-export.png
new file mode 100644
index 00000000..1f8881a7
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/no-nuke-export.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/nordicski.png b/production/example_apps/zippy_maps/webroot/img/icons/nordicski.png
new file mode 100644
index 00000000..7b806c28
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/nordicski.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/notvisited.png b/production/example_apps/zippy_maps/webroot/img/icons/notvisited.png
new file mode 100644
index 00000000..f93316f3
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/notvisited.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/nursery.png b/production/example_apps/zippy_maps/webroot/img/icons/nursery.png
new file mode 100644
index 00000000..ad6fe04a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/nursery.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/nursing_home_icon.png b/production/example_apps/zippy_maps/webroot/img/icons/nursing_home_icon.png
new file mode 100644
index 00000000..27d8bb20
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/nursing_home_icon.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/observatory.png b/production/example_apps/zippy_maps/webroot/img/icons/observatory.png
new file mode 100644
index 00000000..213e8075
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/observatory.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/office-building.png b/production/example_apps/zippy_maps/webroot/img/icons/office-building.png
new file mode 100644
index 00000000..0d519b98
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/office-building.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/oil-2.png b/production/example_apps/zippy_maps/webroot/img/icons/oil-2.png
new file mode 100644
index 00000000..89d5dc9e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/oil-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/oilpumpjack.png b/production/example_apps/zippy_maps/webroot/img/icons/oilpumpjack.png
new file mode 100644
index 00000000..bfa74686
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/oilpumpjack.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/oilrig2.png b/production/example_apps/zippy_maps/webroot/img/icons/oilrig2.png
new file mode 100644
index 00000000..63fd5c53
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/oilrig2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/olympicsite.png b/production/example_apps/zippy_maps/webroot/img/icons/olympicsite.png
new file mode 100644
index 00000000..29c9fb20
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/olympicsite.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/ophthalmologist.png b/production/example_apps/zippy_maps/webroot/img/icons/ophthalmologist.png
new file mode 100644
index 00000000..1a0ce4f5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/ophthalmologist.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/outlet2.png b/production/example_apps/zippy_maps/webroot/img/icons/outlet2.png
new file mode 100644
index 00000000..4bb19e90
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/outlet2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/oyster-3.png b/production/example_apps/zippy_maps/webroot/img/icons/oyster-3.png
new file mode 100644
index 00000000..a04c0b42
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/oyster-3.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/pagoda-2.png b/production/example_apps/zippy_maps/webroot/img/icons/pagoda-2.png
new file mode 100644
index 00000000..f0e162f8
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/pagoda-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/paint.png b/production/example_apps/zippy_maps/webroot/img/icons/paint.png
new file mode 100644
index 00000000..44e5ff8e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/paint.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/paintball.png b/production/example_apps/zippy_maps/webroot/img/icons/paintball.png
new file mode 100644
index 00000000..34f4b8a8
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/paintball.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/palace-2.png b/production/example_apps/zippy_maps/webroot/img/icons/palace-2.png
new file mode 100644
index 00000000..187109c6
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/palace-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/palm-tree-export.png b/production/example_apps/zippy_maps/webroot/img/icons/palm-tree-export.png
new file mode 100644
index 00000000..e1396659
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/palm-tree-export.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/panoramicview.png b/production/example_apps/zippy_maps/webroot/img/icons/panoramicview.png
new file mode 100644
index 00000000..30717aab
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/panoramicview.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/paragliding.png b/production/example_apps/zippy_maps/webroot/img/icons/paragliding.png
new file mode 100644
index 00000000..61056bb5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/paragliding.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/parasailing.png b/production/example_apps/zippy_maps/webroot/img/icons/parasailing.png
new file mode 100644
index 00000000..56366ba3
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/parasailing.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/parkandride.png b/production/example_apps/zippy_maps/webroot/img/icons/parkandride.png
new file mode 100644
index 00000000..a8e303e2
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/parkandride.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/parking-meter-export.png b/production/example_apps/zippy_maps/webroot/img/icons/parking-meter-export.png
new file mode 100644
index 00000000..948663b4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/parking-meter-export.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/parkinggarage.png b/production/example_apps/zippy_maps/webroot/img/icons/parkinggarage.png
new file mode 100644
index 00000000..58b87caf
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/parkinggarage.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/party-2.png b/production/example_apps/zippy_maps/webroot/img/icons/party-2.png
new file mode 100644
index 00000000..3ed02b39
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/party-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/patisserie.png b/production/example_apps/zippy_maps/webroot/img/icons/patisserie.png
new file mode 100644
index 00000000..5de98669
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/patisserie.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/peace.png b/production/example_apps/zippy_maps/webroot/img/icons/peace.png
new file mode 100644
index 00000000..496ac93b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/peace.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/pedestriancrossing.png b/production/example_apps/zippy_maps/webroot/img/icons/pedestriancrossing.png
new file mode 100644
index 00000000..a115b8d9
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/pedestriancrossing.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/penguin-2.png b/production/example_apps/zippy_maps/webroot/img/icons/penguin-2.png
new file mode 100644
index 00000000..a1dd3d41
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/penguin-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/pens.png b/production/example_apps/zippy_maps/webroot/img/icons/pens.png
new file mode 100644
index 00000000..78b59d0f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/pens.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/perfumery.png b/production/example_apps/zippy_maps/webroot/img/icons/perfumery.png
new file mode 100644
index 00000000..61d61eda
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/perfumery.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/petanque.png b/production/example_apps/zippy_maps/webroot/img/icons/petanque.png
new file mode 100644
index 00000000..3672dfbd
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/petanque.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/petroglyphs-2.png b/production/example_apps/zippy_maps/webroot/img/icons/petroglyphs-2.png
new file mode 100644
index 00000000..4b7c9478
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/petroglyphs-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/pets.png b/production/example_apps/zippy_maps/webroot/img/icons/pets.png
new file mode 100644
index 00000000..883bb4db
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/pets.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/phantom.png b/production/example_apps/zippy_maps/webroot/img/icons/phantom.png
new file mode 100644
index 00000000..131b4894
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/phantom.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/phones.png b/production/example_apps/zippy_maps/webroot/img/icons/phones.png
new file mode 100644
index 00000000..889081e6
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/phones.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/photo.png b/production/example_apps/zippy_maps/webroot/img/icons/photo.png
new file mode 100644
index 00000000..f5168560
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/photo.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/photography.png b/production/example_apps/zippy_maps/webroot/img/icons/photography.png
new file mode 100644
index 00000000..279659bf
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/photography.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/picnic-2.png b/production/example_apps/zippy_maps/webroot/img/icons/picnic-2.png
new file mode 100644
index 00000000..2286f352
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/picnic-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/pig.png b/production/example_apps/zippy_maps/webroot/img/icons/pig.png
new file mode 100644
index 00000000..697127be
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/pig.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/pin-export.png b/production/example_apps/zippy_maps/webroot/img/icons/pin-export.png
new file mode 100644
index 00000000..14e0b2db
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/pin-export.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/pirates.png b/production/example_apps/zippy_maps/webroot/img/icons/pirates.png
new file mode 100644
index 00000000..fef930f0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/pirates.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/pizzaria.png b/production/example_apps/zippy_maps/webroot/img/icons/pizzaria.png
new file mode 100644
index 00000000..faa51f79
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/pizzaria.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/planecrash.png b/production/example_apps/zippy_maps/webroot/img/icons/planecrash.png
new file mode 100644
index 00000000..bdee2902
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/planecrash.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/planetarium-2.png b/production/example_apps/zippy_maps/webroot/img/icons/planetarium-2.png
new file mode 100644
index 00000000..05357efa
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/planetarium-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/playground.png b/production/example_apps/zippy_maps/webroot/img/icons/playground.png
new file mode 100644
index 00000000..4257fdaa
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/playground.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/pleasurepier.png b/production/example_apps/zippy_maps/webroot/img/icons/pleasurepier.png
new file mode 100644
index 00000000..18a7b986
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/pleasurepier.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/poker.png b/production/example_apps/zippy_maps/webroot/img/icons/poker.png
new file mode 100644
index 00000000..c66fdbe1
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/poker.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/police.png b/production/example_apps/zippy_maps/webroot/img/icons/police.png
new file mode 100644
index 00000000..f93a9edc
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/police.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/postal.png b/production/example_apps/zippy_maps/webroot/img/icons/postal.png
new file mode 100644
index 00000000..890e05a4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/postal.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/powerlinepole.png b/production/example_apps/zippy_maps/webroot/img/icons/powerlinepole.png
new file mode 100644
index 00000000..349ef141
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/powerlinepole.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/poweroutage.png b/production/example_apps/zippy_maps/webroot/img/icons/poweroutage.png
new file mode 100644
index 00000000..89cfcce5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/poweroutage.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/powerplant.png b/production/example_apps/zippy_maps/webroot/img/icons/powerplant.png
new file mode 100644
index 00000000..69d821b1
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/powerplant.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/powersubstation.png b/production/example_apps/zippy_maps/webroot/img/icons/powersubstation.png
new file mode 100644
index 00000000..90f03abf
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/powersubstation.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/prayer.png b/production/example_apps/zippy_maps/webroot/img/icons/prayer.png
new file mode 100644
index 00000000..c6abcd19
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/prayer.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/presentation.png b/production/example_apps/zippy_maps/webroot/img/icons/presentation.png
new file mode 100644
index 00000000..4b881d81
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/presentation.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/price-tag-export.png b/production/example_apps/zippy_maps/webroot/img/icons/price-tag-export.png
new file mode 100644
index 00000000..8788016f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/price-tag-export.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/printer-2.png b/production/example_apps/zippy_maps/webroot/img/icons/printer-2.png
new file mode 100644
index 00000000..3f1ce527
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/printer-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/prison.png b/production/example_apps/zippy_maps/webroot/img/icons/prison.png
new file mode 100644
index 00000000..2967b250
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/prison.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/publicart.png b/production/example_apps/zippy_maps/webroot/img/icons/publicart.png
new file mode 100644
index 00000000..4523333a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/publicart.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/pyramid.png b/production/example_apps/zippy_maps/webroot/img/icons/pyramid.png
new file mode 100644
index 00000000..0ca76181
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/pyramid.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/quadrifoglio.png b/production/example_apps/zippy_maps/webroot/img/icons/quadrifoglio.png
new file mode 100644
index 00000000..4cfb9b06
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/quadrifoglio.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/radar.png b/production/example_apps/zippy_maps/webroot/img/icons/radar.png
new file mode 100644
index 00000000..0a2aeeb4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/radar.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/radiation.png b/production/example_apps/zippy_maps/webroot/img/icons/radiation.png
new file mode 100644
index 00000000..92b81f60
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/radiation.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/radio-control-model-car.png b/production/example_apps/zippy_maps/webroot/img/icons/radio-control-model-car.png
new file mode 100644
index 00000000..3c6ade8a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/radio-control-model-car.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/radio-station-2.png b/production/example_apps/zippy_maps/webroot/img/icons/radio-station-2.png
new file mode 100644
index 00000000..197e95a2
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/radio-station-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/rainy.png b/production/example_apps/zippy_maps/webroot/img/icons/rainy.png
new file mode 100644
index 00000000..79bf0dfc
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/rainy.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/rape.png b/production/example_apps/zippy_maps/webroot/img/icons/rape.png
new file mode 100644
index 00000000..198495cb
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/rape.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/reatorlogowhite-22x22.png b/production/example_apps/zippy_maps/webroot/img/icons/reatorlogowhite-22x22.png
new file mode 100644
index 00000000..6b459d41
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/reatorlogowhite-22x22.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/recycle.png b/production/example_apps/zippy_maps/webroot/img/icons/recycle.png
new file mode 100644
index 00000000..2a03eca7
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/recycle.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/regroup.png b/production/example_apps/zippy_maps/webroot/img/icons/regroup.png
new file mode 100644
index 00000000..a5554b6d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/regroup.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/repair.png b/production/example_apps/zippy_maps/webroot/img/icons/repair.png
new file mode 100644
index 00000000..afc22ea3
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/repair.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/rescue-2.png b/production/example_apps/zippy_maps/webroot/img/icons/rescue-2.png
new file mode 100644
index 00000000..fb3b6dd5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/rescue-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/resort.png b/production/example_apps/zippy_maps/webroot/img/icons/resort.png
new file mode 100644
index 00000000..5ad7c49a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/resort.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant.png
new file mode 100644
index 00000000..76792f52
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant_african.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_african.png
new file mode 100644
index 00000000..d486d14a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_african.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant_breakfast.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_breakfast.png
new file mode 100644
index 00000000..4b081750
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_breakfast.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant_buffet.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_buffet.png
new file mode 100644
index 00000000..c97f89f3
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_buffet.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant_chinese.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_chinese.png
new file mode 100644
index 00000000..457ec141
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_chinese.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant_fish.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_fish.png
new file mode 100644
index 00000000..1d69fdb7
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_fish.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant_greek.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_greek.png
new file mode 100644
index 00000000..b30b6172
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_greek.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant_indian.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_indian.png
new file mode 100644
index 00000000..5900e4e7
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_indian.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant_italian.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_italian.png
new file mode 100644
index 00000000..ae58f53f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_italian.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant_korean.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_korean.png
new file mode 100644
index 00000000..ff45f5d5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_korean.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant_mediterranean.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_mediterranean.png
new file mode 100644
index 00000000..fc4202ef
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_mediterranean.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant_mexican.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_mexican.png
new file mode 100644
index 00000000..a32f50ef
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_mexican.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant_romantic.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_romantic.png
new file mode 100644
index 00000000..da0a53ae
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_romantic.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant_steakhouse.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_steakhouse.png
new file mode 100644
index 00000000..a36f6637
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_steakhouse.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant_tapas.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_tapas.png
new file mode 100644
index 00000000..f00384d8
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_tapas.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant_thai.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_thai.png
new file mode 100644
index 00000000..7791309d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_thai.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant_turkish.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_turkish.png
new file mode 100644
index 00000000..a861bc0c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_turkish.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/restaurant_vegetarian.png b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_vegetarian.png
new file mode 100644
index 00000000..6b202618
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/restaurant_vegetarian.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/revolt.png b/production/example_apps/zippy_maps/webroot/img/icons/revolt.png
new file mode 100644
index 00000000..2cee54f0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/revolt.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/riparianhabitat.png b/production/example_apps/zippy_maps/webroot/img/icons/riparianhabitat.png
new file mode 100644
index 00000000..ff255887
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/riparianhabitat.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/river-2.png b/production/example_apps/zippy_maps/webroot/img/icons/river-2.png
new file mode 100644
index 00000000..2ece442d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/river-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/road.png b/production/example_apps/zippy_maps/webroot/img/icons/road.png
new file mode 100644
index 00000000..a4cef604
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/road.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/roadtype_gravel.png b/production/example_apps/zippy_maps/webroot/img/icons/roadtype_gravel.png
new file mode 100644
index 00000000..72665983
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/roadtype_gravel.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/rockhouse.png b/production/example_apps/zippy_maps/webroot/img/icons/rockhouse.png
new file mode 100644
index 00000000..c6640a89
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/rockhouse.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/rodent.png b/production/example_apps/zippy_maps/webroot/img/icons/rodent.png
new file mode 100644
index 00000000..836bf619
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/rodent.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/rollerskate.png b/production/example_apps/zippy_maps/webroot/img/icons/rollerskate.png
new file mode 100644
index 00000000..05c33e70
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/rollerskate.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/ropescourse.png b/production/example_apps/zippy_maps/webroot/img/icons/ropescourse.png
new file mode 100644
index 00000000..c35fe2ae
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/ropescourse.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/rowboat.png b/production/example_apps/zippy_maps/webroot/img/icons/rowboat.png
new file mode 100644
index 00000000..31d2fe83
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/rowboat.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/rugbyfield.png b/production/example_apps/zippy_maps/webroot/img/icons/rugbyfield.png
new file mode 100644
index 00000000..bce98000
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/rugbyfield.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/ruins-2.png b/production/example_apps/zippy_maps/webroot/img/icons/ruins-2.png
new file mode 100644
index 00000000..4fd075f2
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/ruins-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/sailing.png b/production/example_apps/zippy_maps/webroot/img/icons/sailing.png
new file mode 100644
index 00000000..7d0dc493
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/sailing.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/sandwich-2.png b/production/example_apps/zippy_maps/webroot/img/icons/sandwich-2.png
new file mode 100644
index 00000000..2eb44269
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/sandwich-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/sauna.png b/production/example_apps/zippy_maps/webroot/img/icons/sauna.png
new file mode 100644
index 00000000..4ae5ec48
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/sauna.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/sawmill-2.png b/production/example_apps/zippy_maps/webroot/img/icons/sawmill-2.png
new file mode 100644
index 00000000..89f65145
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/sawmill-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/school.png b/production/example_apps/zippy_maps/webroot/img/icons/school.png
new file mode 100644
index 00000000..785bf0f9
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/school.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/schreibwaren_web.png b/production/example_apps/zippy_maps/webroot/img/icons/schreibwaren_web.png
new file mode 100644
index 00000000..a604f72c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/schreibwaren_web.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/scoutgroup.png b/production/example_apps/zippy_maps/webroot/img/icons/scoutgroup.png
new file mode 100644
index 00000000..dd33abcd
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/scoutgroup.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/scubadiving.png b/production/example_apps/zippy_maps/webroot/img/icons/scubadiving.png
new file mode 100644
index 00000000..0242ada5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/scubadiving.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/seals.png b/production/example_apps/zippy_maps/webroot/img/icons/seals.png
new file mode 100644
index 00000000..dba195ed
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/seals.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/segway.png b/production/example_apps/zippy_maps/webroot/img/icons/segway.png
new file mode 100644
index 00000000..138da355
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/segway.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/seniorsite.png b/production/example_apps/zippy_maps/webroot/img/icons/seniorsite.png
new file mode 100644
index 00000000..32ed4090
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/seniorsite.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/septic_tank.png b/production/example_apps/zippy_maps/webroot/img/icons/septic_tank.png
new file mode 100644
index 00000000..a01752df
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/septic_tank.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/share.png b/production/example_apps/zippy_maps/webroot/img/icons/share.png
new file mode 100644
index 00000000..f805cd68
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/share.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/shark-export.png b/production/example_apps/zippy_maps/webroot/img/icons/shark-export.png
new file mode 100644
index 00000000..fcb54443
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/shark-export.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/shintoshrine.png b/production/example_apps/zippy_maps/webroot/img/icons/shintoshrine.png
new file mode 100644
index 00000000..82ace96d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/shintoshrine.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/shipwreck.png b/production/example_apps/zippy_maps/webroot/img/icons/shipwreck.png
new file mode 100644
index 00000000..c256c0d7
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/shipwreck.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/shoes.png b/production/example_apps/zippy_maps/webroot/img/icons/shoes.png
new file mode 100644
index 00000000..870b5e61
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/shoes.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/shooting.png b/production/example_apps/zippy_maps/webroot/img/icons/shooting.png
new file mode 100644
index 00000000..5e6ead4b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/shooting.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/shootingrange.png b/production/example_apps/zippy_maps/webroot/img/icons/shootingrange.png
new file mode 100644
index 00000000..b4f2f99f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/shootingrange.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/shore-2.png b/production/example_apps/zippy_maps/webroot/img/icons/shore-2.png
new file mode 100644
index 00000000..a9783482
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/shore-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/shower.png b/production/example_apps/zippy_maps/webroot/img/icons/shower.png
new file mode 100644
index 00000000..3503e843
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/shower.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/sight-2.png b/production/example_apps/zippy_maps/webroot/img/icons/sight-2.png
new file mode 100644
index 00000000..2cbfca36
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/sight-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/signpost-2.png b/production/example_apps/zippy_maps/webroot/img/icons/signpost-2.png
new file mode 100644
index 00000000..4fb7cbd6
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/signpost-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/sikh.png b/production/example_apps/zippy_maps/webroot/img/icons/sikh.png
new file mode 100644
index 00000000..df2e67d8
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/sikh.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/ski_shoe1.png b/production/example_apps/zippy_maps/webroot/img/icons/ski_shoe1.png
new file mode 100644
index 00000000..21bebe36
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/ski_shoe1.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/skiing.png b/production/example_apps/zippy_maps/webroot/img/icons/skiing.png
new file mode 100644
index 00000000..b3ee65d2
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/skiing.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/skijump.png b/production/example_apps/zippy_maps/webroot/img/icons/skijump.png
new file mode 100644
index 00000000..f814af20
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/skijump.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/skilifting.png b/production/example_apps/zippy_maps/webroot/img/icons/skilifting.png
new file mode 100644
index 00000000..b9ab1fae
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/skilifting.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/skis.png b/production/example_apps/zippy_maps/webroot/img/icons/skis.png
new file mode 100644
index 00000000..871a43c6
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/skis.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/skull.png b/production/example_apps/zippy_maps/webroot/img/icons/skull.png
new file mode 100644
index 00000000..20196c48
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/skull.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/sledge.png b/production/example_apps/zippy_maps/webroot/img/icons/sledge.png
new file mode 100644
index 00000000..b61d2833
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/sledge.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/sledge_summer.png b/production/example_apps/zippy_maps/webroot/img/icons/sledge_summer.png
new file mode 100644
index 00000000..3be838aa
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/sledge_summer.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/sledgerental.png b/production/example_apps/zippy_maps/webroot/img/icons/sledgerental.png
new file mode 100644
index 00000000..75bacab1
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/sledgerental.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/slipway.png b/production/example_apps/zippy_maps/webroot/img/icons/slipway.png
new file mode 100644
index 00000000..81ad5da5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/slipway.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/smallcity.png b/production/example_apps/zippy_maps/webroot/img/icons/smallcity.png
new file mode 100644
index 00000000..4b8d354e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/smallcity.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/smiley_happy.png b/production/example_apps/zippy_maps/webroot/img/icons/smiley_happy.png
new file mode 100644
index 00000000..5b3b9a3f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/smiley_happy.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/smoking.png b/production/example_apps/zippy_maps/webroot/img/icons/smoking.png
new file mode 100644
index 00000000..afcea98d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/smoking.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/snail.png b/production/example_apps/zippy_maps/webroot/img/icons/snail.png
new file mode 100644
index 00000000..42597180
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/snail.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/snakes.png b/production/example_apps/zippy_maps/webroot/img/icons/snakes.png
new file mode 100644
index 00000000..3947eff0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/snakes.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/sneakers.png b/production/example_apps/zippy_maps/webroot/img/icons/sneakers.png
new file mode 100644
index 00000000..39cae03c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/sneakers.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/snorkeling.png b/production/example_apps/zippy_maps/webroot/img/icons/snorkeling.png
new file mode 100644
index 00000000..dcbd9ed0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/snorkeling.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/snowboarding.png b/production/example_apps/zippy_maps/webroot/img/icons/snowboarding.png
new file mode 100644
index 00000000..88203801
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/snowboarding.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/snowmobiling.png b/production/example_apps/zippy_maps/webroot/img/icons/snowmobiling.png
new file mode 100644
index 00000000..f66a3581
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/snowmobiling.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/snowpark_arc.png b/production/example_apps/zippy_maps/webroot/img/icons/snowpark_arc.png
new file mode 100644
index 00000000..10619fb0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/snowpark_arc.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/snowshoeing.png b/production/example_apps/zippy_maps/webroot/img/icons/snowshoeing.png
new file mode 100644
index 00000000..d5de482a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/snowshoeing.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/snowy-2.png b/production/example_apps/zippy_maps/webroot/img/icons/snowy-2.png
new file mode 100644
index 00000000..756ad6b9
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/snowy-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/soccer.png b/production/example_apps/zippy_maps/webroot/img/icons/soccer.png
new file mode 100644
index 00000000..5acbb91b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/soccer.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/solarenergy.png b/production/example_apps/zippy_maps/webroot/img/icons/solarenergy.png
new file mode 100644
index 00000000..6795f464
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/solarenergy.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/sozialeeinrichtung.png b/production/example_apps/zippy_maps/webroot/img/icons/sozialeeinrichtung.png
new file mode 100644
index 00000000..51f49d68
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/sozialeeinrichtung.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/spa.png b/production/example_apps/zippy_maps/webroot/img/icons/spa.png
new file mode 100644
index 00000000..dbafb862
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/spa.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/spaceport-2.png b/production/example_apps/zippy_maps/webroot/img/icons/spaceport-2.png
new file mode 100644
index 00000000..6d73e121
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/spaceport-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/speed_50.png b/production/example_apps/zippy_maps/webroot/img/icons/speed_50.png
new file mode 100644
index 00000000..06569da5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/speed_50.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/speedhump.png b/production/example_apps/zippy_maps/webroot/img/icons/speedhump.png
new file mode 100644
index 00000000..5e270a2a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/speedhump.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/speedriding.png b/production/example_apps/zippy_maps/webroot/img/icons/speedriding.png
new file mode 100644
index 00000000..53d1f357
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/speedriding.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/spelunking.png b/production/example_apps/zippy_maps/webroot/img/icons/spelunking.png
new file mode 100644
index 00000000..0d2d0bf0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/spelunking.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/spider.png b/production/example_apps/zippy_maps/webroot/img/icons/spider.png
new file mode 100644
index 00000000..3608abc4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/spider.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/splice.png b/production/example_apps/zippy_maps/webroot/img/icons/splice.png
new file mode 100644
index 00000000..8f470c18
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/splice.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/sportscar.png b/production/example_apps/zippy_maps/webroot/img/icons/sportscar.png
new file mode 100644
index 00000000..7c84dee0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/sportscar.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/sportutilityvehicle.png b/production/example_apps/zippy_maps/webroot/img/icons/sportutilityvehicle.png
new file mode 100644
index 00000000..d333ae7a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/sportutilityvehicle.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/square-compass.png b/production/example_apps/zippy_maps/webroot/img/icons/square-compass.png
new file mode 100644
index 00000000..ba514fe4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/square-compass.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/squash-2.png b/production/example_apps/zippy_maps/webroot/img/icons/squash-2.png
new file mode 100644
index 00000000..418bed62
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/squash-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/stadium.png b/production/example_apps/zippy_maps/webroot/img/icons/stadium.png
new file mode 100644
index 00000000..1e434d01
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/stadium.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/stairs.png b/production/example_apps/zippy_maps/webroot/img/icons/stairs.png
new file mode 100644
index 00000000..801f9674
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/stairs.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/star-3.png b/production/example_apps/zippy_maps/webroot/img/icons/star-3.png
new file mode 100644
index 00000000..18f55ca5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/star-3.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/stargate-raw.png b/production/example_apps/zippy_maps/webroot/img/icons/stargate-raw.png
new file mode 100644
index 00000000..5fa69f39
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/stargate-raw.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/start-race-2.png b/production/example_apps/zippy_maps/webroot/img/icons/start-race-2.png
new file mode 100644
index 00000000..82b1188b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/start-race-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/statue-2.png b/production/example_apps/zippy_maps/webroot/img/icons/statue-2.png
new file mode 100644
index 00000000..0f48d010
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/statue-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/steamtrain.png b/production/example_apps/zippy_maps/webroot/img/icons/steamtrain.png
new file mode 100644
index 00000000..19ef504f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/steamtrain.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/stop.png b/production/example_apps/zippy_maps/webroot/img/icons/stop.png
new file mode 100644
index 00000000..f7ffb612
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/stop.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/strike.png b/production/example_apps/zippy_maps/webroot/img/icons/strike.png
new file mode 100644
index 00000000..89c27d43
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/strike.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/stripclub2.png b/production/example_apps/zippy_maps/webroot/img/icons/stripclub2.png
new file mode 100644
index 00000000..bea9db58
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/stripclub2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/submarine-2.png b/production/example_apps/zippy_maps/webroot/img/icons/submarine-2.png
new file mode 100644
index 00000000..6b5ad6a6
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/submarine-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/sugar-shack.png b/production/example_apps/zippy_maps/webroot/img/icons/sugar-shack.png
new file mode 100644
index 00000000..8e201c1f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/sugar-shack.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/summercamp.png b/production/example_apps/zippy_maps/webroot/img/icons/summercamp.png
new file mode 100644
index 00000000..dcb656f9
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/summercamp.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/sumo-2.png b/production/example_apps/zippy_maps/webroot/img/icons/sumo-2.png
new file mode 100644
index 00000000..f70fe620
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/sumo-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/sunny.png b/production/example_apps/zippy_maps/webroot/img/icons/sunny.png
new file mode 100644
index 00000000..c34075d8
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/sunny.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/sunsetland.png b/production/example_apps/zippy_maps/webroot/img/icons/sunsetland.png
new file mode 100644
index 00000000..41c4bd0c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/sunsetland.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/supermarket.png b/production/example_apps/zippy_maps/webroot/img/icons/supermarket.png
new file mode 100644
index 00000000..b2bd45d6
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/supermarket.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/surfacelift.png b/production/example_apps/zippy_maps/webroot/img/icons/surfacelift.png
new file mode 100644
index 00000000..166a56e5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/surfacelift.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/surfing.png b/production/example_apps/zippy_maps/webroot/img/icons/surfing.png
new file mode 100644
index 00000000..f86e83ec
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/surfing.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/surfpaddle.png b/production/example_apps/zippy_maps/webroot/img/icons/surfpaddle.png
new file mode 100644
index 00000000..d0fcf599
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/surfpaddle.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/surveying-2.png b/production/example_apps/zippy_maps/webroot/img/icons/surveying-2.png
new file mode 100644
index 00000000..2dcf0279
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/surveying-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/swimming.png b/production/example_apps/zippy_maps/webroot/img/icons/swimming.png
new file mode 100644
index 00000000..491f81b2
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/swimming.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/synagogue-2.png b/production/example_apps/zippy_maps/webroot/img/icons/synagogue-2.png
new file mode 100644
index 00000000..64f3a368
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/synagogue-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/taekwondo-2.png b/production/example_apps/zippy_maps/webroot/img/icons/taekwondo-2.png
new file mode 100644
index 00000000..3609c3f8
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/taekwondo-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/tailor.png b/production/example_apps/zippy_maps/webroot/img/icons/tailor.png
new file mode 100644
index 00000000..404744af
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/tailor.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/takeaway.png b/production/example_apps/zippy_maps/webroot/img/icons/takeaway.png
new file mode 100644
index 00000000..f1757167
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/takeaway.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/targ.png b/production/example_apps/zippy_maps/webroot/img/icons/targ.png
new file mode 100644
index 00000000..06b9d1aa
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/targ.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/taxi.png b/production/example_apps/zippy_maps/webroot/img/icons/taxi.png
new file mode 100644
index 00000000..b09359ec
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/taxi.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/taxiboat.png b/production/example_apps/zippy_maps/webroot/img/icons/taxiboat.png
new file mode 100644
index 00000000..6eaed945
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/taxiboat.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/taxiway.png b/production/example_apps/zippy_maps/webroot/img/icons/taxiway.png
new file mode 100644
index 00000000..698719e0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/taxiway.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/teahouse.png b/production/example_apps/zippy_maps/webroot/img/icons/teahouse.png
new file mode 100644
index 00000000..a7ac062e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/teahouse.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/tebletennis.png b/production/example_apps/zippy_maps/webroot/img/icons/tebletennis.png
new file mode 100644
index 00000000..bb6fa718
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/tebletennis.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/telephone.png b/production/example_apps/zippy_maps/webroot/img/icons/telephone.png
new file mode 100644
index 00000000..97121b0a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/telephone.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/temple-2.png b/production/example_apps/zippy_maps/webroot/img/icons/temple-2.png
new file mode 100644
index 00000000..e0dcb6a9
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/temple-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/templehindu.png b/production/example_apps/zippy_maps/webroot/img/icons/templehindu.png
new file mode 100644
index 00000000..987c1f76
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/templehindu.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/tennis.png b/production/example_apps/zippy_maps/webroot/img/icons/tennis.png
new file mode 100644
index 00000000..f6f372b1
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/tennis.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/terrace.png b/production/example_apps/zippy_maps/webroot/img/icons/terrace.png
new file mode 100644
index 00000000..aef05b47
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/terrace.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/text.png b/production/example_apps/zippy_maps/webroot/img/icons/text.png
new file mode 100644
index 00000000..04e7bdb0
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/text.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/textiles.png b/production/example_apps/zippy_maps/webroot/img/icons/textiles.png
new file mode 100644
index 00000000..630f372a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/textiles.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/theater.png b/production/example_apps/zippy_maps/webroot/img/icons/theater.png
new file mode 100644
index 00000000..627fb556
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/theater.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/theft.png b/production/example_apps/zippy_maps/webroot/img/icons/theft.png
new file mode 100644
index 00000000..1dbf9222
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/theft.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/themepark.png b/production/example_apps/zippy_maps/webroot/img/icons/themepark.png
new file mode 100644
index 00000000..92ddc01f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/themepark.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/therapy.png b/production/example_apps/zippy_maps/webroot/img/icons/therapy.png
new file mode 100644
index 00000000..d20b0cc6
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/therapy.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/theravadapagoda.png b/production/example_apps/zippy_maps/webroot/img/icons/theravadapagoda.png
new file mode 100644
index 00000000..c6361691
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/theravadapagoda.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/theravadatemple.png b/production/example_apps/zippy_maps/webroot/img/icons/theravadatemple.png
new file mode 100644
index 00000000..7bf618ef
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/theravadatemple.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/thunderstorm.png b/production/example_apps/zippy_maps/webroot/img/icons/thunderstorm.png
new file mode 100644
index 00000000..193fa5f3
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/thunderstorm.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/ticket_office2.png b/production/example_apps/zippy_maps/webroot/img/icons/ticket_office2.png
new file mode 100644
index 00000000..9a74e625
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/ticket_office2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/tidaldiamond.png b/production/example_apps/zippy_maps/webroot/img/icons/tidaldiamond.png
new file mode 100644
index 00000000..c36df0b8
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/tidaldiamond.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/tiger-2.png b/production/example_apps/zippy_maps/webroot/img/icons/tiger-2.png
new file mode 100644
index 00000000..824c1a23
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/tiger-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/tires.png b/production/example_apps/zippy_maps/webroot/img/icons/tires.png
new file mode 100644
index 00000000..19670004
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/tires.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/toilets.png b/production/example_apps/zippy_maps/webroot/img/icons/toilets.png
new file mode 100644
index 00000000..327834a4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/toilets.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/tollstation.png b/production/example_apps/zippy_maps/webroot/img/icons/tollstation.png
new file mode 100644
index 00000000..8733d3ae
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/tollstation.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/tools.png b/production/example_apps/zippy_maps/webroot/img/icons/tools.png
new file mode 100644
index 00000000..8b42712a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/tools.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/tornado-2.png b/production/example_apps/zippy_maps/webroot/img/icons/tornado-2.png
new file mode 100644
index 00000000..a9b9fe1e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/tornado-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/torture.png b/production/example_apps/zippy_maps/webroot/img/icons/torture.png
new file mode 100644
index 00000000..b67a1318
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/torture.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/tower.png b/production/example_apps/zippy_maps/webroot/img/icons/tower.png
new file mode 100644
index 00000000..e2af01ab
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/tower.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/townhouse.png b/production/example_apps/zippy_maps/webroot/img/icons/townhouse.png
new file mode 100644
index 00000000..37dc9e6d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/townhouse.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/toys.png b/production/example_apps/zippy_maps/webroot/img/icons/toys.png
new file mode 100644
index 00000000..f9e10036
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/toys.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/trafficcamera.png b/production/example_apps/zippy_maps/webroot/img/icons/trafficcamera.png
new file mode 100644
index 00000000..c408c074
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/trafficcamera.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/trafficlight.png b/production/example_apps/zippy_maps/webroot/img/icons/trafficlight.png
new file mode 100644
index 00000000..19ea65f4
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/trafficlight.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/train.png b/production/example_apps/zippy_maps/webroot/img/icons/train.png
new file mode 100644
index 00000000..63e386ed
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/train.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/tramway.png b/production/example_apps/zippy_maps/webroot/img/icons/tramway.png
new file mode 100644
index 00000000..5e80bc12
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/tramway.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/trash.png b/production/example_apps/zippy_maps/webroot/img/icons/trash.png
new file mode 100644
index 00000000..05f610af
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/trash.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/travel_agency.png b/production/example_apps/zippy_maps/webroot/img/icons/travel_agency.png
new file mode 100644
index 00000000..f4f27c8c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/travel_agency.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/treasure-mark.png b/production/example_apps/zippy_maps/webroot/img/icons/treasure-mark.png
new file mode 100644
index 00000000..c2c6d247
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/treasure-mark.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/treedown.png b/production/example_apps/zippy_maps/webroot/img/icons/treedown.png
new file mode 100644
index 00000000..560eba5f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/treedown.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/triskelion.png b/production/example_apps/zippy_maps/webroot/img/icons/triskelion.png
new file mode 100644
index 00000000..def53ba1
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/triskelion.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/trolley.png b/production/example_apps/zippy_maps/webroot/img/icons/trolley.png
new file mode 100644
index 00000000..24d431cb
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/trolley.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/truck3.png b/production/example_apps/zippy_maps/webroot/img/icons/truck3.png
new file mode 100644
index 00000000..c4e1320d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/truck3.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/tsunami.png b/production/example_apps/zippy_maps/webroot/img/icons/tsunami.png
new file mode 100644
index 00000000..5caf387d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/tsunami.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/tunnel.png b/production/example_apps/zippy_maps/webroot/img/icons/tunnel.png
new file mode 100644
index 00000000..31be93fd
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/tunnel.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/turtle-2.png b/production/example_apps/zippy_maps/webroot/img/icons/turtle-2.png
new file mode 100644
index 00000000..ca4121d1
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/turtle-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/tweet.png b/production/example_apps/zippy_maps/webroot/img/icons/tweet.png
new file mode 100644
index 00000000..55a8a1d1
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/tweet.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/u-pick_stand.png b/production/example_apps/zippy_maps/webroot/img/icons/u-pick_stand.png
new file mode 100644
index 00000000..dc1a779e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/u-pick_stand.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/ufo.png b/production/example_apps/zippy_maps/webroot/img/icons/ufo.png
new file mode 100644
index 00000000..521c1632
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/ufo.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/umbrella-2.png b/production/example_apps/zippy_maps/webroot/img/icons/umbrella-2.png
new file mode 100644
index 00000000..a0ab615f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/umbrella-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/underground.png b/production/example_apps/zippy_maps/webroot/img/icons/underground.png
new file mode 100644
index 00000000..02490a0e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/underground.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/university.png b/production/example_apps/zippy_maps/webroot/img/icons/university.png
new file mode 100644
index 00000000..2cdb09df
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/university.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/usfootball.png b/production/example_apps/zippy_maps/webroot/img/icons/usfootball.png
new file mode 100644
index 00000000..dc357f1b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/usfootball.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/van.png b/production/example_apps/zippy_maps/webroot/img/icons/van.png
new file mode 100644
index 00000000..eef87115
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/van.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/vespa.png b/production/example_apps/zippy_maps/webroot/img/icons/vespa.png
new file mode 100644
index 00000000..6804ed7f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/vespa.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/veterinary.png b/production/example_apps/zippy_maps/webroot/img/icons/veterinary.png
new file mode 100644
index 00000000..8827f8ab
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/veterinary.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/video.png b/production/example_apps/zippy_maps/webroot/img/icons/video.png
new file mode 100644
index 00000000..49f1bcd5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/video.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/videogames.png b/production/example_apps/zippy_maps/webroot/img/icons/videogames.png
new file mode 100644
index 00000000..22d29568
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/videogames.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/villa.png b/production/example_apps/zippy_maps/webroot/img/icons/villa.png
new file mode 100644
index 00000000..3fe6b795
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/villa.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/vineyard-2.png b/production/example_apps/zippy_maps/webroot/img/icons/vineyard-2.png
new file mode 100644
index 00000000..c5257bad
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/vineyard-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/volcano-2.png b/production/example_apps/zippy_maps/webroot/img/icons/volcano-2.png
new file mode 100644
index 00000000..033152e8
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/volcano-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/volleyball.png b/production/example_apps/zippy_maps/webroot/img/icons/volleyball.png
new file mode 100644
index 00000000..cc4a8f66
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/volleyball.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/waiting.png b/production/example_apps/zippy_maps/webroot/img/icons/waiting.png
new file mode 100644
index 00000000..eda32d2a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/waiting.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/walkingtour.png b/production/example_apps/zippy_maps/webroot/img/icons/walkingtour.png
new file mode 100644
index 00000000..4e4e9baa
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/walkingtour.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/war.png b/production/example_apps/zippy_maps/webroot/img/icons/war.png
new file mode 100644
index 00000000..fc82796d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/war.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/warehouse-2.png b/production/example_apps/zippy_maps/webroot/img/icons/warehouse-2.png
new file mode 100644
index 00000000..91d4f5df
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/warehouse-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/water.png b/production/example_apps/zippy_maps/webroot/img/icons/water.png
new file mode 100644
index 00000000..593fe652
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/water.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/watercraft.png b/production/example_apps/zippy_maps/webroot/img/icons/watercraft.png
new file mode 100644
index 00000000..eab5c36e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/watercraft.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/waterfall-2.png b/production/example_apps/zippy_maps/webroot/img/icons/waterfall-2.png
new file mode 100644
index 00000000..dc4636bc
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/waterfall-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/watermill-2.png b/production/example_apps/zippy_maps/webroot/img/icons/watermill-2.png
new file mode 100644
index 00000000..99d5c646
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/watermill-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/waterpark.png b/production/example_apps/zippy_maps/webroot/img/icons/waterpark.png
new file mode 100644
index 00000000..97871054
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/waterpark.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/waterskiing.png b/production/example_apps/zippy_maps/webroot/img/icons/waterskiing.png
new file mode 100644
index 00000000..ede6e97e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/waterskiing.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/watertower.png b/production/example_apps/zippy_maps/webroot/img/icons/watertower.png
new file mode 100644
index 00000000..6b4c7b4b
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/watertower.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/waterwell.png b/production/example_apps/zippy_maps/webroot/img/icons/waterwell.png
new file mode 100644
index 00000000..743406e3
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/waterwell.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/waterwellpump.png b/production/example_apps/zippy_maps/webroot/img/icons/waterwellpump.png
new file mode 100644
index 00000000..661c9286
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/waterwellpump.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/webcam.png b/production/example_apps/zippy_maps/webroot/img/icons/webcam.png
new file mode 100644
index 00000000..da16de26
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/webcam.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/wedding.png b/production/example_apps/zippy_maps/webroot/img/icons/wedding.png
new file mode 100644
index 00000000..c8c40b7e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/wedding.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/weights.png b/production/example_apps/zippy_maps/webroot/img/icons/weights.png
new file mode 100644
index 00000000..39e83b7a
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/weights.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/wetlands.png b/production/example_apps/zippy_maps/webroot/img/icons/wetlands.png
new file mode 100644
index 00000000..a474c17e
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/wetlands.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/whale-2.png b/production/example_apps/zippy_maps/webroot/img/icons/whale-2.png
new file mode 100644
index 00000000..3f1b368f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/whale-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/wifi.png b/production/example_apps/zippy_maps/webroot/img/icons/wifi.png
new file mode 100644
index 00000000..2c7c3609
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/wifi.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/wiki-export.png b/production/example_apps/zippy_maps/webroot/img/icons/wiki-export.png
new file mode 100644
index 00000000..cb940556
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/wiki-export.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/wildlifecrossing.png b/production/example_apps/zippy_maps/webroot/img/icons/wildlifecrossing.png
new file mode 100644
index 00000000..bb7a3aa5
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/wildlifecrossing.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/wind-2.png b/production/example_apps/zippy_maps/webroot/img/icons/wind-2.png
new file mode 100644
index 00000000..89c4dc73
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/wind-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/windmill-2.png b/production/example_apps/zippy_maps/webroot/img/icons/windmill-2.png
new file mode 100644
index 00000000..ce6af24d
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/windmill-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/windsurfing.png b/production/example_apps/zippy_maps/webroot/img/icons/windsurfing.png
new file mode 100644
index 00000000..16a1123f
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/windsurfing.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/windturbine.png b/production/example_apps/zippy_maps/webroot/img/icons/windturbine.png
new file mode 100644
index 00000000..2606aefa
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/windturbine.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/winebar.png b/production/example_apps/zippy_maps/webroot/img/icons/winebar.png
new file mode 100644
index 00000000..c9279503
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/winebar.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/winetasting.png b/production/example_apps/zippy_maps/webroot/img/icons/winetasting.png
new file mode 100644
index 00000000..c85f42f6
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/winetasting.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/woodshed.png b/production/example_apps/zippy_maps/webroot/img/icons/woodshed.png
new file mode 100644
index 00000000..d62f0026
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/woodshed.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/workoffice.png b/production/example_apps/zippy_maps/webroot/img/icons/workoffice.png
new file mode 100644
index 00000000..24f95875
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/workoffice.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/workshop.png b/production/example_apps/zippy_maps/webroot/img/icons/workshop.png
new file mode 100644
index 00000000..c50ea96c
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/workshop.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/world.png b/production/example_apps/zippy_maps/webroot/img/icons/world.png
new file mode 100644
index 00000000..524744fc
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/world.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/worldwildway.png b/production/example_apps/zippy_maps/webroot/img/icons/worldwildway.png
new file mode 100644
index 00000000..02cabb92
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/worldwildway.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/wrestling-2.png b/production/example_apps/zippy_maps/webroot/img/icons/wrestling-2.png
new file mode 100644
index 00000000..779f6e64
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/wrestling-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/yoga.png b/production/example_apps/zippy_maps/webroot/img/icons/yoga.png
new file mode 100644
index 00000000..120ecda2
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/yoga.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/yooner.png b/production/example_apps/zippy_maps/webroot/img/icons/yooner.png
new file mode 100644
index 00000000..d471f134
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/yooner.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/you-are-here-2.png b/production/example_apps/zippy_maps/webroot/img/icons/you-are-here-2.png
new file mode 100644
index 00000000..2ace63b1
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/you-are-here-2.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/youthhostel.png b/production/example_apps/zippy_maps/webroot/img/icons/youthhostel.png
new file mode 100644
index 00000000..6441e760
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/youthhostel.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/zombie-outbreak1.png b/production/example_apps/zippy_maps/webroot/img/icons/zombie-outbreak1.png
new file mode 100644
index 00000000..21b18e88
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/zombie-outbreak1.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/zoo.png b/production/example_apps/zippy_maps/webroot/img/icons/zoo.png
new file mode 100644
index 00000000..adc20f33
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/zoo.png differ
diff --git a/production/example_apps/zippy_maps/webroot/img/icons/zoom.png b/production/example_apps/zippy_maps/webroot/img/icons/zoom.png
new file mode 100644
index 00000000..a5391872
Binary files /dev/null and b/production/example_apps/zippy_maps/webroot/img/icons/zoom.png differ
diff --git a/production/example_apps/zippy_maps/webroot/index.php b/production/example_apps/zippy_maps/webroot/index.php
new file mode 100644
index 00000000..6791f475
--- /dev/null
+++ b/production/example_apps/zippy_maps/webroot/index.php
@@ -0,0 +1,37 @@
+emit($server->run());
diff --git a/production/example_apps/zippy_maps/webroot/js/empty b/production/example_apps/zippy_maps/webroot/js/empty
new file mode 100644
index 00000000..e69de29b
diff --git a/production/example_apps/zippy_maps/webroot/js/jquery-3.2.1.min.js b/production/example_apps/zippy_maps/webroot/js/jquery-3.2.1.min.js
new file mode 100644
index 00000000..644d35e2
--- /dev/null
+++ b/production/example_apps/zippy_maps/webroot/js/jquery-3.2.1.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML=" ",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML=" ";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML=" ","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML=" ",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),
+a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""," "],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/